Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中使用AES加密文本,然后在C#WCF服务中解密_Javascript_C#_Wcf_Encryption_Cryptography - Fatal编程技术网

在Javascript中使用AES加密文本,然后在C#WCF服务中解密

在Javascript中使用AES加密文本,然后在C#WCF服务中解密,javascript,c#,wcf,encryption,cryptography,Javascript,C#,Wcf,Encryption,Cryptography,我正在尝试使用AES 128位加密对字符串进行加密。我有Javascript和C#的代码。主要目标是使用Javascript CryptoJS对字符串进行加密,然后获取生成的密文,并使用C#AES AES CryptoServiceProvider对其进行解密 Javascript代码: function EncryptText() { var text = document.getElementById('textbox').value; var Key = CryptoJS.enc.Hex.

我正在尝试使用AES 128位加密对字符串进行加密。我有Javascript和C#的代码。主要目标是使用Javascript CryptoJS对字符串进行加密,然后获取生成的密文,并使用C#AES AES CryptoServiceProvider对其进行解密

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#代码:

当使用“hello”作为javascript的纯文本时,我得到以下密文:

uqhe5ya+mISuK4uc1WxxeQ==
将其传递到C#应用程序时,在运行Decrypt方法时,我收到:

Padding is invalid and cannot be removed.
我在这里被难住了,并且尝试了许多解决方案,导致了同样的错误

通过C#encryption AES方法加密hello时,我收到:

Y9nb8DrV73+rmmYRUcJiOg==

我提前感谢你的帮助

首先,JS中的
变量包含一个包含32个字符的字符串(在奇怪的解析调用之后)。虽然这可能被解释为128位密钥,但CryptoJS有一定的机会将其作为密码短语(并使用某种算法从中生成密钥)。所以你的实际钥匙看起来很不一样。字符串看起来也像是十六进制编码的,因此可能会对其C#值产生一些额外的混淆。您必须确保在JS和C#中使用相同的密钥

其次,
IV
变量在解析后看起来也像一个十六进制编码的值。因此,你也必须注意你在C#端使用了什么值

仅供参考,以下是解析后
IV
的值:
Key=00000000000e00000d000c0000010000
IV=0000000 E000F0A00

谢谢您使用UTF8进行的“Uwe”解析解决了所有问题


如果使用:var Key=CryptoJS.enc.Utf8.parse(“psvjqrk9qtepnvu1dwuzcrvfgfv1vvvt0=”);而不是十六进制?你的C#的钥匙和IV是什么?因为实际上,您放入密钥和>解析的字符串不是十六进制字符串。十六进制是0到F


非常感谢你

尝试使用var Key=CryptoJS.enc.Utf8.parse(“psvjqrk9qtepnvu1dwuzcrvgfv1vvvt0=”);而不是十六进制。
因为实际上,您放入密钥(和IV)并进行解析的字符串不是十六进制字符串。十六进制是0到F。

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#代码:


使用以上代码工作良好

如果使用:var Key=CryptoJS.enc.Utf8.parse(“psvjqrk9qtepnvu1dwuzcrvfgfv1vvvt0=”);而不是十六进制?你的C#的钥匙和IV是什么?因为实际上,您放入密钥和解析的字符串不是十六进制字符串。hex是0,事实上,Javascript中的IV字符串也不是hex。嗨,Uwe,如果你将此评论作为答案发布,我会很乐意将其标记为答案。把它改成utf8就行了!万分感谢!谢谢你的建议,真是太好了!他很有魅力。(Angular 7和.net 4.7.2)适用于Angular 8和net Core 2.2!
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 
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);
}