我有一个使用Rijndael加密的PHP代码的参考。我想将它转换为java代码,我尝试了几个例子,但没有一个适合我。 这是php代码:
$initialisationVector = hash("sha256", utf8_encode($myiv), TRUE);
$key = hash("sha256", utf8_encode($mykey), TRUE);
$encryptedValue = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$encryptKey, utf8_encode($mydata), MCRYPT_MODE_CBC, $initialisationVector));
这是我抛出的java代码:密钥长度不是128/160/192/224/256位
public static String encrypt() throws Exception{
String myiv = "somevalue";
String mykey = "somevalue";
String mydata = "somevalue";
String new_text = "";
RijndaelEngine rijndael = new RijndaelEngine(256);
CBCBlockCipher cbc_rijndael = new CBCBlockCipher(rijndael);
ZeroBytePadding c = new ZeroBytePadding();
PaddedBufferedBlockCipher pbbc = new PaddedBufferedBlockCipher(cbc_rijndael, c);
byte[] iv_byte = sha256(myiv);
byte[] givenKey = sha256(mykey);
CipherParameters keyWithIV = new ParametersWithIV(new KeyParameter(givenKey), iv_byte);
pbbc.init(true, keyWithIV);
byte[] plaintext = mydata.getBytes(Charset.forName("UTF-8"));
byte[] ciphertext = new byte[pbbc.getOutputSize(plaintext.length)];
int offset = 0;
offset += pbbc.processBytes(plaintext, 0, plaintext.length, ciphertext, offset);
offset += pbbc.doFinal(ciphertext, offset);
new_text = new String(new Base64().encode(ciphertext), Charset.forName("UTF-8"));
System.out.println(new_text);
return new_text;
}
public static byte[] sha256(String input) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] messageDigest = md.digest(input.getBytes(Charset.forName("UTF-8")));
return messageDigest;
}
我对密码学不是很了解。提前谢谢!
答案 0 :(得分:3)
错误消息很明确:“初始化向量必须与块大小相同”。您指定的是256位(32字节)块大小,请验证iv_byte
是否为32字节。
有一些问题:
对于IV从哈希中获取字节,将字节传递给加密函数,BigInteger
没有位置。
sha256(appId)
提供256位密钥,只需使用它即可。
不需要以下内容,sha256
的结果是256位:
final int keysize = 256;
byte[] keyData = new byte[keysize];
System.arraycopy(givenKey, 0, keyData, 0, Math.min(givenKey.length, keyData.length));
sha256(appId)
提供256位密钥,只需使用它即可。不需要以下内容:
final int keysize = 256;
byte[] keyData = new byte[keysize];
System.arraycopy(givenKey, 0, keyData, 0, Math.min(givenKey.length, keyData.length));
mcrypt
“MCRYPT_RIJNDAEL_256”指定256位块大小,这意味着它不是AES,“MCRYPT_RIJNDAEL_128”是应该使用的AES。
mcrypt
使用非标准的空填充,需要适应。
使用SHA-256哈希是不够安全的,请使用密码派生函数,如PBKDF2。