Rfc2898DeriveBytes的Java等效解密抛出无效的AES密钥长度

Rfc2898DeriveBytes的Java等效解密抛出无效的AES密钥长度,java,javax.crypto,Java,Javax.crypto,我有一个同事编写的C#应用程序的以下解密代码: 私有静态字符串UrlEncryptionKey=“x0iiR!RG@753!"; // 这里没有真正的价值 私有静态字节[]salt=新字节[]{0x41、0x71、0x61、0x6e、0x21、0x4d、0x65、0x64、0x76、0x64、0x63、0x62、0x72} 公共静态字符串解密(字符串密文) { 字节[]cipherBytes=Convert.FromBase64String(密文); 使用(Aes encryptor=Aes.

我有一个同事编写的C#应用程序的以下解密代码:

私有静态字符串UrlEncryptionKey=“x0iiR!RG@753!"; // 这里没有真正的价值
私有静态字节[]salt=新字节[]{0x41、0x71、0x61、0x6e、0x21、0x4d、0x65、0x64、0x76、0x64、0x63、0x62、0x72}
公共静态字符串解密(字符串密文)
{ 
字节[]cipherBytes=Convert.FromBase64String(密文);
使用(Aes encryptor=Aes.Create())
{
Rfc2898DeriveBytes pdb=新的Rfc2898DeriveBytes(UrlEncryptionKey,salt);
encryptor.Key=pdb.GetBytes(32);
encryptor.IV=pdb.GetBytes(16);
使用(MemoryStream ms=new MemoryStream())
{
使用(CryptoStream cs=new CryptoStream(ms,encryptor.CreateDecryptor(),CryptoStreamMode.Write))
{
cs.Write(cipherBytes,0,cipherBytes.Length);
cs.Close();
}
cipherText=Encoding.Unicode.GetString(ms.ToArray());
}
}
返回密文;
}
将等效的加密技术拼凑在一起,我目前使用的Java等效技术如下:

公共静态字符串解密(字符串密文)引发异常{
SecretKeyFactory factory=SecretKeyFactory.getInstance(“PBKDF2WithHmacSHA1”);
PBEKeySpec PBEKeySpec=新的PBEKeySpec(UrlEncryptionKey.toCharArray(),salt,1000384);
密钥secretKey=factory.generateSecret(pbeKeySpec);
字节[]键=新字节[32];
字节[]iv=新字节[16];
数组复制(secretKey.getEncoded(),0,key,0,32);
数组复制(secretKey.getEncoded(),32,iv,0,16);
AlgorithmParameterSpec ivSpec=新的IvParameterSpec(iv);
SecretKey secretKeyAES=新的SecretKeySpec(SecretKey.getEncoded(),“AES”);
Cipher Cipher=Cipher.getInstance(“AES/CBC/PKCS5Padding”);
cipher.init(cipher.DECRYPT_模式,secretKeyAES,ivSpec);
byte[]decoded=Base64.getDecoder().decode(密文.getBytes(“UTF-8”);
字节[]原始=cipher.doFinal(已解码);
字符串originalString=新字符串(原始“UTF-8”);
返回原始字符串;
}
但它抛出了一个例外:

线程“main”java.security.InvalidKeyException中的异常:无效AES密钥长度:48字节 位于com.sun.crypto.provider.AESCrypt.init(AESCrypt.java:87) 位于com.sun.crypto.provider.CipherBlockChaining.init(CipherBlockChaining.java:93) 位于com.sun.crypto.provider.CipherCore.init(CipherCore.java:591) 位于com.sun.crypto.provider.aesciper.engineInit(aesciper.java:346) 位于javax.crypto.Cipher.implInit(Cipher.java:809) 在javax.crypto.Cipher.chooseProvider(Cipher.java:867)上 位于javax.crypto.Cipher.init(Cipher.java:1399) 位于javax.crypto.Cipher.init(Cipher.java:1330) atscratch.AESUtil.Decrypt(AESUtil.java:55) atscratch.AESUtil.main(AESUtil.java:93)
我不明白为什么密钥长度无效

这是否回答了您的问题?将行“SecretKey secretKeyAES=new SecretKeySpec(SecretKey.getEncoded(),“AES”);”更改为“SecretKey secretKeyAES=new SecretKeySpec(key,AES”);”。您的问题是通过PBKDF2派生密钥和iv,将结果拆分为密钥和iv,但使用完整的PBKDF2输出(48字节长)作为密钥。