我需要编写使用AES (Rijndael)加密字符串的Java代码。
有一个已经在工作的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字节长
我真的不能用Java Rijndael加密(使用32字节密钥)编写吗?
另一个不同之处是,C#中的填充是PKCS7,而在Java中则是PKCS5。还能用吗?
发布于 2014-12-15 20:54:23
基本的Java加密扩展只提供与128位块大小的Rijndael兼容的AES实现。您应该使用128位BlockSize,以便与大多数实现AES的实现兼容。如果您这样做,那么填充是没有问题的,因为PKCS#5 is the same as PKCS#7 padding in AES。
重要的是要注意,AES是标准化的,Rijndael不是标准化的。
发布于 2019-08-22 15:31:05
由于填充物的问题,我很难做到这一点。根据理论,来自java的PKCS#5应该与来自.Net的PKCS#7填充相匹配。当我深入研究这个问题时,我发现Base64编码器存在一个问题。Java有不同的库来将字节编码到base64中。默认情况下,java使用来自Base64的java.util,并给出了填充问题。当我使用不同的库来达到这个目的时,我可以得到所需的库。
org.apache.commons.codec.binary.Base64.encodeBase64String (byte[] encryptedtext)https://stackoverflow.com/questions/27492292
复制相似问题