【问题标题】:Invalid key length node.js triple DES encrpytion无效的密钥长度 node.js 三重 DES 加密
【发布时间】:2016-03-02 07:14:01
【问题描述】:
var tripleDES = new TripleDESCryptoServiceProvider();
var sha1 = new SHA1CryptoServiceProvider();

var keyBytes = System.Text.Encoding.Unicode.GetBytes(key);
var hashKey = sha1.ComputeHash(keyBytes);
System.Array.Resize(ref hashKey, ((tripleDES.KeySize / 8)));
tripleDES.Key = hashKey;

我是 node.js 的新手,正在尝试将加密从 c# 切换到 node.js,但它给出了一个错误 Invalid key length 22 下面是 node.js 代码。

var text = "test";
var des_key = new Buffer("abcdefghijklmnopqrstuv",'utf8');
var des_iv = new Buffer(0);

var des_decryption = crypto.createCipheriv("DES-EDE3", des_key, des_iv);
var test = des_decryption.update(text,'utf8','base64');
test+=des_decryption.final('base64')
console.log("test:"+test)

我已经编辑了下面的代码以显示正确的代码

var text = "test";
var des_key = new Buffer("abcdefghijklmnopqrstuv",'base64');
var des_iv = new Buffer(IV,'base64');

var des_decryption = crypto.createCipheriv("DES-EDE3-CBC", des_key, des_iv);
var test = des_decryption.update(text,'ucs2','base64'); //ucs2 is the same as utf16
test+=des_decryption.final('base64')
console.log("test:"+test)

【问题讨论】:

  • 好吧,在 node.js 中使用 SHA-1 之前,您似乎忘记对“密钥”进行哈希处理。
  • 此外,不要忘记将随机 IV 从 C# 传输到 node.js。
  • 传输随机 IV 是什么意思?
  • @ArtjomB。在我使用哈希后,它可以工作,但加密的输出与 c# 代码不同。 node.js: eiw7XmQOYGo= c#: i14HzuoyWokHK1VwzkI1ZQ==
  • 如果你使用TripleDESCryptoServiceProvider,默认是CBC模式,需要IV,自动随机生成。您必须在解密期间使用相同的 IV,因此您必须将其与密文一起传输。此外,node.js 中的 DES-EDE3 可能使用 ECB 模式而不是 CBC 模式,您必须使用 DES-EDE3-CBC

标签: c# node.js encryption cryptography tripledes


【解决方案1】:

这可能是由不匹配的key-length 引起的。三重 DES 预计密钥长度为 128-bit 或 192-bit,具体取决于其 KeySize 设置。因此,您必须为128-bit 提供16 bytes 密钥或为192-bit 提供24 bytes。

在这里,您的错误表明您提供了具有22 bytes 密钥长度的Triple DES 密钥:

无效的密钥长度 22

这在任何一种情况下都是不可接受的。

检查您的tripleDES.KeySize。如果是128,确保你的hashKey是16字节长度,如果是192,确保你的hashKey是24-bytes长度。

【讨论】:

  • keysize 是 192,但我在 c# 代码中使用相同的密钥,所以它也应该在 node.js 上工作,不是吗?
  • @Dylan 可能不是这样,看到你的 node.js: var des_key = new Buffer("abcdefghijklmnopqrstuv",'utf8'); 它只有 22 个字节......不幸的是
  • 我尝试将 des_key 更改为 new Buffer("Gk7XHvGStyzIuoGsZ9OZeJ1E0mQAAAAA", 'base64'),这是我从 c# 中的密钥加密中获得的,并且该函数有效,但加密后的输出与 c# 代码不同
  • @Dylan DES 相当复杂...可能是因为使用了不同的 IV 吗?
  • 据我所知,des 不接受 iv,这就是我使用 Buffer(0) 启动的原因
猜你喜欢
  • 2015-06-22
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多