程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了PHP Java AES CBC加密不同的结果大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决php Java AES CBC加密不同的结果?

开发过程中遇到php Java AES CBC加密不同的结果的问题如何解决?下面主要结合日常开发的经验,给出你关于php Java AES CBC加密不同的结果的解决方法建议,希望对你解决php Java AES CBC加密不同的结果有所启发或帮助;

如果您不只是简单地Exceptionencrypt()例程中的可能内容吞噬掉,那么您将对发生的事情有了更好的了解。如果函数正在返回,null那么显然发生了异常,您需要知道它是什么。

实际上,例外是:

@H_616_12@javax.crypto.IllegalBlockSizeException: input length not multiple of 16 bytes at com.sun.crypto.provIDer.CipherCore.finalNopadding(CipherCore.java:854) at com.sun.crypto.provIDer.CipherCore.doFinal(CipherCore.java:828) at com.sun.crypto.provIDer.CipherCore.doFinal(CipherCore.java:676) at com.sun.crypto.provIDer.AESCipher.ENGIneDoFinal(AESCipher.java:313) at javax.crypto.Cipher.doFinal(Cipher.java:2087) at Encryption.encrypt(Encryption.java:20) at Encryption.main(Encryption.java:6)

可以肯定的是,您的纯文本长度只有11个Java字符,按照您的默认编码,它将为11个字节。

您需要检查php @H_498_3@mcrypt_encrypt函数的实际作用。由于它有效,因此显然使用了一些填充方案。您需要找出它是哪一个,并在Java代码中使用它。

好的-我查找了手册页@H_498_3@mcrypt_encrypt。它说:

因此,您需要使用Java复制该代码。这是一种方法:

@H_616_12@import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class Encryption { public static voID main(String args[]) throws Exception { System.out.println(encrypt()); } public static String encrypt() throws Exception { try { String data = "Test String"; String key = "1234567812345678"; String iv = "1234567812345678"; Cipher cipher = Cipher.geTinstance("AES/CBC/Nopadding"); int blockSize = cipher.getBlockSize(); // We need to pad with zeros to a multiple of the cipher block size, // so first figure out what the size of the plaintext needs to be. byte[] dataBytes = data.getBytes(); int plaintextLength = dataBytes.length; int remainder = plaintextLength % blockSize; if (remainder != 0) { plaintextLength += (blockSize - remainder); } // In java, primitive arrays of Integer types have all elements // initialized to zero, so no need to explicitly zero any part of // the array. byte[] plaintext = new byte[plaintextLength]; // copy our actual data into the beginning of the array. The // rest of the array is implicitly zero-filled, as desired. System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length); SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES"); IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); byte[] encrypted = cipher.doFinal(plaintext); return new sun.misc.bASE64Encoder().encode(encrypted); } catch (Exception E) { e.printstacktrace(); return null; } } }

当我跑步时,我得到:

@H_616_12@iz1qFlQJfs6Ycp+gcc2z4w==

这就是您的php程序所得到的。

:从Java 8开始,JavaSE最终随附了已记录的base64编解码器。所以代替

@H_616_12@return new sun.misc.bASE64Encoder().encode(encrypted);

你应该做类似的事情

@H_616_12@return Base64.Encoder.encodetoString(encrypted);

或者,使用第三方库(例如commons-codec)进行base64编码/解码,而不要使用未公开的内部方法。

解决方法

php功能:

@H_616_12@$privateKey = "1234567812345678"; $iv = "1234567812345678"; $data = "Test String"; $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$privateKey,$data,MCRYPT_MODE_CBC,$iv); echo(base64_encode($encrypted)); Result: iz1qFlQJfs6Ycp+gcc2z4w==

Java函数

@H_616_12@public static String encrypt() throws Exception{ try{ String data = "Test String"; String key = "1234567812345678"; String iv = "1234567812345678"; javax.crypto.spec.SecretKeySpec keyspec = new javax.crypto.spec.SecretKeySpec(key.getBytes(),"AES"); javax.crypto.spec.IvParameterSpec ivspec = new javax.crypto.spec.IvParameterSpec(iv.getBytes()); javax.crypto.Cipher cipher = javax.crypto.Cipher.geTinstance("AES/CBC/NoPadding"); cipher.init(javax.crypto.Cipher.ENCRYPT_MODE,keyspec,ivspec); byte[] encrypted = cipher.doFinal(data.getBytes()); return new sun.misc.bASE64Encoder().encode(encrypted); }catch(Exception E){ return null; }

}

返回null。

请注意,我们不允许更改php代码。有人可以帮助我们在Java中获得相同的结果吗?非常感谢。

大佬总结

以上是大佬教程为你收集整理的PHP Java AES CBC加密不同的结果全部内容,希望文章能够帮你解决PHP Java AES CBC加密不同的结果所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。