我有做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;
}
我对密码学不是很满意。提前致谢!
最佳答案
错误消息很清楚:“初始化向量的长度必须与块大小相同”。您正在指定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)。
关于java - 在Java中使用IV进行RIJNDAEL 256 CBC加密,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45442114/