我有两个共享用户数据库的系统,因此身份验证必须相同。

密码当前使用C#的Cryptography.Rijndael(N.B。不是RijndaelManaged)进行加密。使用自定义键和iv(初始化向量)。 (CBC模式和Pkcs7填充)

C#加密如下:

Rijndael alg = Rijndael.Create();
alg.Key = key;
alg.IV = IV;
CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(clearData, 0, clearData.Length);
cs.Close();
byte[] encryptedData = ms.ToArray();


key是256位(32字节),iv(初始化向量)是128位(16字节)。块大小为128位(16字节)。

key和iv是通过以下方式来自base64字符串的字节数组:

byte[] key = Convert.FromBase64String(base64Key);
byte[] iv = Convert.FromBase64String(base64IV);


N.B.我无法控制C#代码(旧版系统)。

在基于javascript的系统上,我必须完全以相同的方式加密密码。我尝试使用节点crypto-js无济于事。
我的代码看起来像这样:

var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(password), keyCodeWords, {
    iv: ivCodeWords,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});


keyCodeWords和ivCodeWords是来自相同base64密钥和iv的CryptoJS代码字,如下所示:

var keyCodeWords = CryptoJS.enc.Base64.parse(base64Key);
var ivCodeWords = CryptoJS.enc.Base64.parse(base64IV);


加密确实有效(就我可以加密然后解密以得到相同的值而言)。但是,问题在于加密的值(encrypted.ciphertext)与C#的值不同,因此我无法进行身份验证。

比较是在比较base64加密输出字符串的基础上完成的。

如何使crypto-js(或任何其他JavaScript加密库)与C#Rijndael一致?

最佳答案

代码正确运行...您的问题可能是在C#或Javascript中处理密码/ IV ...在C#:https://ideone.com/APC4MM和Javascript:https://jsfiddle.net/jjwy5472/

在两种情况下,我都使用了相同的密码:

byte[] key = new byte[]
{
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
    0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
};

byte[] iv = new byte[]
{
    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
    0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
};


明文是

"Hello world! This is a wonderful day! àèéìòù"


在两种情况下,生成的加密文本都是

aa429aa5c1c928b86d81b43ff3fb6cc46f24cc73957bc7c00829357bf441eb3be9cf8aef2ff6f819f9b95c69886b169b6959c4f7ece0620c6a28f849516adee9


但是请注意,Javascript中的encrypted变量是一个复杂的对象,包含具有加密数据各种版本的各种属性。 encrypted.toString()返回加密数据的base64版本,encrypted.ciphertextWordArray(等同于byte[]的CryptoJS),而encrypted.ciphertext.toString()是其十六进制版本(等同于在C#中执行BitConverter.ToString(encryptedData).Replace("-", "").ToLowerInvariant() )。

关于javascript - 将C#加密.Rijndael加密转换为Javascript(首选crypto-js),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36196425/

10-16 13:44