ECB模式下的CryptoJS DES

时间:2014-12-29 14:43:46

标签: javascript cryptography des cryptojs

我正在处理需要DES ECB和PKCS1填充的第三方网关。所以这段代码不是我自己使用的,而是将消息发送给其他人。

在你问他们为什么在互联网上使用对称密钥加密之前:我首先必须发送用SHA算法加密的对称密钥,然后用DES密钥对消息进行编码。 这不是我的想法。但这对我的项目来说非常重要。

我将自己做填充功能,所以请不要指向我的NoPadding选项。这段代码只是为了测试DES是否能正常使用。

我在node.js中面临一个奇怪的(对我来说)crypt-js模块的行为 这是代码:

var C = require('crypto-js'),
    source = 'abcdefghabcdefgh',
    key = '1234test';

var encrypted = C.DES.encrypt(
    C.enc.Utf8.parse(source),
    C.enc.Hex.parse(key),
    { mode: C.mode.ECB, padding: C.pad.NoPadding }
).ciphertext.toString();

var decrypted = C.DES.decrypt(
    C.lib.CipherParams.create({ ciphertext: C.enc.Utf8.parse(encrypted) }),
    C.enc.Hex.parse(key),
    { mode: C.mode.ECB, padding: C.pad.NoPadding }
).toString();

if (source === decrypted) {
    console.log('Glad :)');
} else {
    console.log('Sad :(');
}

代码不会这样高兴。 Crypto-JS和所有其他模块都是最新版本。 有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:1)

据我所知,你有两个问题:

  1. key是Utf8,必须parse这样,
  2. ciphertext.toString()实际上是一个包含Base 64编码密文的字符串,因此您需要在解密期间将其解析为Base64
  3. 正如Maarten Bodewes在评论中所说,由于你没有使用填充,你必须确保你的明文是8字节的倍数。

答案 1 :(得分:1)

这个为我做了,完美地运作:https://gist.github.com/ufologist/5581486