繁体   English   中英

使用非标准密钥长度调用CryptoJS.AES.encrypt / decrypt时,如何处理AES密钥?

[英]How is an AES key processed when calling CryptoJS.AES.encrypt/decrypt with a non-standard key length?

我目前在使用长度不为128、192或256位的密钥解密CryptoJS中加密的C#中的项目时遇到问题。 CryptoJS允许在加密/解密过程中使用“奇数”长度的密钥,但是C#中的对称算法类(例如RijndaelManaged )不允许这样做。

使用Javascript

var key =  CryptoJS.enc.Utf8.parse("This key is 160 bits"); // Not 128, 192, or 256 bits, but is allowed
var iv = CryptoJS.enc.Hex.parse("101112131415161718191a1b1c1d1e1f");
var result = CryptoJS.AES.encrypt("Encrypt Me!", key, { iv: iv });

// result.ciphertext = 2839aff89d889dd29480b038679fbd6e
// or result.ciphertext.toString(CryptoJS.enc.Base64) = KDmv+J2IndKUgLA4Z5+9bg==

C#

byte[] key = Encoding.UTF8.GetBytes("This key is 160 bits");
byte[] iv = { 0x10, 0x11, 0x12, 0x13,
              0x14, 0x15, 0x16, 0x17,
              0x18, 0x19, 0x1a, 0x1b,
              0x1c, 0x1d, 0x1e, 0x1f };
byte[] encryptMe = Encoding.UTF8.GetBytes("Encrypt Me!");

using (RijndaelManaged rm = new RijndaelManaged())
{
    rm.IV = iv;
    rm.Key = key; //This is not allowed due to the key size being 160 bits. Exception thrown here.

    using (ICryptoTransform ict = rm.CreateEncryptor())
    {
        byte[] encrypted = ict.TransformFinalBlock(encryptMe, 0, encryptMe.Length);
    }
}

我的问题是,JavaScript代码中的密钥究竟会发生什么,以使其可以用于加密/解密? 填充? 截断? 是否将CryptoJS中的AES实现调整为与“奇数”密钥长度配合使用?

我试图通过将字节数组截断或填充(开始和结束)都无济于事,从而调整了C#代码的键。 我对javascript语法并不十分熟悉,并且在不了解所发生的事情的情况下查看了CryptoJS源代码。

我快速浏览了CryptoJS的源代码,似乎它默默地做了一些非标准的事情。 如果是这样,则无法使用标准AES复制其操作。

但是,要确保没有任何派生密钥之类,请尝试执行alert(result.key); 看看是否与您输入的内容相同。

暂无
暂无

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

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