[英]Encrypt text using AES in Javascript then Decrypt in C# WCF Service
我正在尝试使用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方法加密hello时,我收到:
Y9nb8DrV73+rmmYRUcJiOg==
我提前感谢你的帮助!
javascript代码:
function EncryptText()
{
var text = CryptoJS.enc.Utf8.parse(document.getElementById('textbox').value);
var Key = CryptoJS.enc.Utf8.parse("PSVJQRk9QTEpNVU1DWUZCRVFGV1VVT0="); //secret key
var IV = CryptoJS.enc.Utf8.parse("2314345645678765"); //16 digit
var encryptedText = CryptoJS.AES.encrypt(text, Key, {keySize: 128 / 8,iv: IV, mode: CryptoJS.mode.CBC, padding:CryptoJS.pad.Pkcs7});
var encrypted = document.getElementById('encrypted');
encrypted.value = encryptedText;
//Pass encryptedText through service
}
C#代码:
private String AES_decrypt(string encrypted,String secretKey,String initVec)
{
byte[] encryptedBytes = Convert.FromBase64String(encrypted);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
//aes.BlockSize = 128; Not Required
//aes.KeySize = 256; Not Required
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.Pkcs7;
aes.Key = Encoding.UTF8.GetBytes(secretKey);PSVJQRk9QTEpNVU1DWUZCRVFGV1VVT0=
aes.IV = Encoding.UTF8.GetBytes(initVec); //2314345645678765
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);
}
使用上面的代码工作正常!!!
尝试使用var Key = CryptoJS.enc.Utf8.parse(“PSVJQRk9QTEpNVU1DWUZCRVFGV1VVT0 =”); 而不是HEX。
因为实际上你放入密钥(和IV)并解析的字符串不是十六进制字符串。 十六进制是0到F.
首先,JS中的Key
变量包含一个包含32个字符的字符串(在奇怪的解析调用之后)。 虽然这可能被解释为128位密钥,但CryptoJS有可能将其作为密码短语(并使用某种算法从中生成密钥)。 所以你的实际密钥看起来很不一样。 该字符串看起来也像十六进制编码一样可疑,因此可能会对其C#值产生一些额外的混淆。 您必须确保在JS和C#中使用相同的密钥。
其次,解析后的IV
变量看起来像十六进制编码的值。 所以你必须要小心你在C#端使用的价值。
仅供参考,以下是解析后Key
和IV
的值: Key = 00000000000e00000d000c0000010000
, IV = 0000000e000f0a00
谢谢“Uwe”解析UTF8解决了一切。
如果使用会发生什么:var Key = CryptoJS.enc.Utf8.parse(“PSVJQRk9QTEpNVU1DWUZCRVFGV1VVT0 =”); 而不是HEX? 你在C#中的Key和IV是什么? 因为实际上你放入密钥和>解析的字符串不是十六进制字符串。 十六进制是0到F.
非常感谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.