繁体   English   中英

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

[英]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#端使用的价值。

仅供参考,以下是解析后KeyIV的值: Key = 00000000000e00000d000c0000010000IV = 0000000e000f0a00

谢谢“Uwe”解析UTF8解决了一切。

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

非常感谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM