【发布时间】:2011-11-14 19:37:09
【问题描述】:
我试图用 JAVA 解密一个用 C# 加密的字符串。 在c#中,使用此方法解密成功:
AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider();
aesProvider.BlockSize = 128;
aesProvider.KeySize = 128;
aesProvider.Key = strKey;
aesProvider.IV = strIV;
aesProvider.Padding = PaddingMode.PKCS7;
aesProvider.Mode = CipherMode.CBC;
ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor(aesProvider.Key, aesProvider.IV);
byte[] DecryptedBytes = cryptoTransform.TransformFinalBlock(EncryptedBytes, 0, EncryptedBytes.Length);
return System.Text.Encoding.UTF8.GetString(DecryptedBytes);
我想要做的是将此方法转换为 JAVA (Android),这是我尝试过的,但收到一条错误消息(“垫块损坏”):
try
{
byte[] IV = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
byte[] KEY = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
SecretKeySpec key = new SecretKeySpec(KEY, "AES/CBC/PKCS7Padding");
Cipher cipher = Cipher.getInstance ("AES/CBC/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(IV));
byte[] bytesData = Utilities.Base64Coder.decode(data);
Log.i("bytesData", String.valueOf(bytesData.length));
String strResult = new String(cipher.doFinal(bytesData));
Log.i("decrypted string", strResult);
return strResult;
}
catch (Exception e) {
Log.i("decrypted FAILED", e.getMessage());
return null;
}
10X :)
【问题讨论】:
-
我确实看过,但没有在那里找到答案。实际上大多数相关问题从未解决。
-
我会先为每个人编写加密器代码,比较已知输入的加密版本,然后调整每个人的设置,直到它们匹配。查看您的异常情况,您在 C# 中为
aesProvider.Padding = PaddingMode.PKCS7尝试了哪些其他选项? -
再次检查密钥和 IV,确保 Base64Decoder 正常工作。您的算法看起来与我兼容。顺便说一句,在你成功解密数据后,你会想要使用
new String(cipher.doFinal(bytesData), "UTF-8");之类的东西。
标签: c# android encryption aes