我正在处理一个第三方网关,该网关需要带有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
据我所知,您有两个问题:
-
key
是 Utf8,必须以这种方式parse
, -
ciphertext.toString()
实际上是一个包含 Base 64 编码密文的字符串,因此您需要在解密过程中将其解析为Base64
。
正如Maarten Bodewes在评论中所说,由于您没有使用填充,因此必须确保明文是8字节的倍数。