我需要从.Net WebService 提供的盐和密码生成Java(Android)中的AES 密钥。我需要具有与 .net 中生成的密钥相同的密钥,并且具有相同的密码和盐(使用 Rfc2898DeriveBytes 和 AesManaged())。这是我在 Android 中的代码:
char[] passwordAsCharArray = password.toCharArray();
PBEKeySpec pbeKeySpec = new PBEKeySpec(passwordAsCharArray, salt, 1000, 256);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
SecretKeySpec secretKey = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
这是.net中的代码:
byte[] keyBytes = Encoding.Unicode.GetBytes(key);
Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes(key, keyBytes);
AesManaged rijndaelCSP = new AesManaged();
rijndaelCSP.BlockSize = 128;
rijndaelCSP.KeySize = 256;
rijndaelCSP.Key = derivedKey.GetBytes(rijndaelCSP.KeySize / 8);
rijndaelCSP.IV = derivedKey.GetBytes(rijndaelCSP.BlockSize / 8);
ICryptoTransform decryptor = rijndaelCSP.CreateDecryptor();
当我比较两个键时,它们是不同的。任何想法如何在 Android 上生成与 .Net 中相同的密钥?(我知道在.net 中生成的密钥是正确的)。.Net 中的迭代次数为 1000,salt 和密码也与 Android 相同。
好的,事实证明我不需要完全相同的密钥(作为字节数组)。我需要这个来解密已经在.Net中加密的文件(用Java) - 使用这个密钥它给了我Bad Padding Exception所以我认为密钥不同并且导致问题,但我需要做的就是生成IV 像一把钥匙 - 这解决了我的问题。感谢您的回复!