我需要编写Java代码以使用AES(Rijndael)加密字符串。
有一个已经正常工作的C#代码,出于相同的目的执行相同的加密。
C#代码:
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.KeySize = 256;
rijndaelCipher.BlockSize = 256;
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;
byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(password); // password is 32 bytes long
byte[] keyBytes = new byte[32];
System.Array.Copy(pwdBytes, keyBytes, 32);
rijndaelCipher.Key = keyBytes;
rijndaelCipher.IV = keyBytes;
ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
我想到的Java代码:
byte[] sessionKey = SENDER_KEY.getBytes(StandardCharsets.UTF_8);
byte[] iv = SENDER_KEY.getBytes(StandardCharsets.UTF_8) ;
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
SecretKeySpec secretKeySpec = new SecretKeySpec(sessionKey, "AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] cipheredText = cipher.doFinal(stringedXmlForSending.getBytes());
当我执行Java代码时,出现异常:
java.security.InvalidAlgorithmParameterException:错误的IV长度:必须为16个字节长
我不能使用使用32字节密钥的Java Rijndael加密写代码吗?
另一个区别是C#中的填充为PKCS7,而Java中为PKCS5。还能用吗?
最佳答案
基本的Java加密扩展仅提供与Rijndael兼容的AES实现,块大小为128位。您应该使用128位BlockSize
,以便与大多数实现AES的实现兼容。如果这样做,则填充是没有问题的,因为PKCS#5 is the same as PKCS#7 padding in AES。
重要的是要注意,AES是Rijndael尚未实现的标准化。