Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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
C# 使用非标准密钥长度调用CryptoJS.AES.encrypt/decrypt时如何处理AES密钥?_C#_Javascript_Cryptography_Cryptojs - Fatal编程技术网

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

C# 使用非标准密钥长度调用CryptoJS.AES.encrypt/decrypt时如何处理AES密钥?,c#,javascript,cryptography,cryptojs,C#,Javascript,Cryptography,Cryptojs,我目前在解密C#中使用长度不是128、192或256位的密钥加密的项目时遇到问题。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.pa

我目前在解密C#中使用长度不是128、192或256位的密钥加密的项目时遇到问题。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#

我的问题是,javascript代码中的密钥会发生什么变化,以允许它用于加密/解密?衬垫?截断?CryptoJS中的AES实现是否调整为使用“奇数”密钥长度


我试图通过截断或填充(开头和结尾)字节数组来调整C#代码的键,但没有效果。我对javascript语法不是很熟悉,并且在没有了解很多事情的情况下查看了CryptoJS源代码。

我快速查看了CryptoJS源代码,它似乎在默默地做一些非标准的事情。如果这是真的,那么就没有办法用标准AES复制它的功能


但是,为了确保没有密钥派生之类的,请尝试执行
警报(result.key)
并查看它是否与您的输入相同。

result.key
返回上例中的
54686973206b6579206973203136302062697473
,与输入键完全相同。在将这个答案标记为正确答案之前,我将再做一些深入的研究。你必须原谅我,但我想100%肯定这一点:)虽然这不是一个完全直截了当的回答,但我确实得到了一个答复。对于当前的CryptoJS 3.1.2,不支持以文档指定以外的方式使用API。我在编写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);
    }
}