【发布时间】:2014-11-19 14:19:39
【问题描述】:
我正在尝试使用 AES 128 位加密来加密字符串。我有 Javascript 和 C# 的代码。主要目标是使用 Javascript CryptoJS 加密字符串,然后获取生成的密文并使用 C# AES AesCryptoServiceProvider 对其进行解密。
Javascript 代码:
function EncryptText()
{
var text = document.getElementById('textbox').value;
var Key = CryptoJS.enc.Hex.parse("PSVJQRk9QTEpNVU1DWUZCRVFGV1VVT0=");
var IV = CryptoJS.enc.Hex.parse("YWlFLVEZZUFNaWl=");
var encryptedText = CryptoJS.AES.encrypt(text, Key, {iv: IV, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7});
//var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
var encrypted = document.getElementById('encrypted');
encrypted.value = encryptedText;
}
C#代码:
private String AES_decrypt(string encrypted)
{
byte[] encryptedBytes = Convert.FromBase64String(encrypted);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.BlockSize = 128;
aes.KeySize = 256;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.Pkcs7;
aes.Key = Key;
aes.IV = IV;
ICryptoTransform crypto = aes.CreateDecryptor(aes.Key, aes.IV);
byte[] secret = crypto.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
crypto.Dispose();
return System.Text.ASCIIEncoding.ASCII.GetString(secret);
}
当使用“hello”作为 javascript 的纯文本时,我得到了这个密文:
uqhe5ya+mISuK4uc1WxxeQ==
将其传递到 C# 应用程序时,在运行 Decrypt 方法时我收到:
Padding is invalid and cannot be removed.
我被难住了,并尝试了许多解决方案,导致同样的错误。
当通过我收到的 C# 加密 AES 方法加密你好时:
Y9nb8DrV73+rmmYRUcJiOg==
提前感谢您的帮助!
【问题讨论】:
-
如果你使用会发生什么: var Key = CryptoJS.enc.Utf8.parse("PSVJQRk9QTEpNVU1DWUZCRVFGV1VVT0=");而不是十六进制?你在 C# 中的 Key 和 IV 是什么?因为实际上您放入密钥和解析的字符串不是十六进制字符串。十六进制为 0 到 F
-
实际上你在 Javascript 中的 IV 字符串也不是十六进制的。
-
嗨 Uwe,如果您将此评论作为答案发布,我很乐意将其标记为答案。将其更改为 utf8 有效!谢谢一百万!
标签: javascript c# wcf encryption cryptography