大佬教程收集整理的这篇文章主要介绍了PHP Java AES CBC加密不同的结果,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
如果您不只是简单地Exception
将encrypt()
例程中的可能内容吞噬掉,那么您将对发生的事情有了更好的了解。如果函数正在返回,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,请注明来意。