ECB 模式下的 CryptoJS DES



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

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

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

我面临着node中crypt-js模块的奇怪(对我来说)行为.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和所有其他模块都是最新版本。有人可以向我解释一下吗?

这个为我做到了,效果很好:https://gist.github.com/ufologist/5581486

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

  1. key是 Utf8,必须以这种方式parse
  2. ciphertext.toString()实际上是一个包含 Base 64 编码密文的字符串,因此您需要在解密过程中将其解析为Base64

正如Maarten Bodewes在评论中所说,由于您没有使用填充,因此必须确保明文是8字节的倍数。

最新更新