Node JS Triple DES实现中的解密错误?

时间:2013-11-26 21:58:35

标签: node.js encryption

var cardInfo = "<Card><CVV></CVV><CardNumber></CardNumber><ExpMonth></ExpMonth><ExpYear></ExpYear><Member></Member></Card>"

function genKeyPair(passphrase){
    var iv = crypto.createHash('md5').update(passphrase).digest('hex').substring(0, 8)
    var key = crypto.createHash('md5').update(passphrase).digest('hex').substring(0, 24)
    return {
        key: key,
        iv: iv
    }
}

function encrypt3DES(key, vector, data){
    var encryptor = crypto.createCipheriv('des3', key, vector)
    var raw = new Buffer(data)
    encryptor.update(raw)
    var encrypted = encryptor.final()
    return encrypted
}

function decrypt3DES(key, vector, data){
    var decryptor = crypto.createDecipheriv('des3', key, vector)
    decryptor.update(data)
    var decrypted = decryptor.final()
    return decrypted
}

var key = genKeyPair('test')
var data3DES = encrypt3DES(key.key, key.iv, cardInfo)
var decryptedCard = decrypt3DES(key.key, key.iv, data3DES)

所以,我在decryptor.final()上得到了一个“不好的解密”,并且无法找出原因。

  1. 节点在加密时需要缓冲区,因此您可以看到我在encrypt3DES
  2. 的开头提供了缓冲区
  3. 我将加密的原始缓冲区输出直接放入解密方法
  4. 我在这里做错了什么?

    声明 不,这不会用于生产。我只是在四处闲逛所以请抱着“你不知道你在做什么所以你不应该这样做”谈话

2 个答案:

答案 0 :(得分:1)

update的结果会丢失在您的代码中:

  

返回加密的内容,并且可以在流式传输时使用新数据多次调用。

该代码还使用了不包含足够熵的3DES ABC键(键应该是二进制数据,而不是十六进制数)。至少尝试使用crypto.createCipher(algorithm, password)或尝试在JavaScript中找到PBKDF2的实现。

答案 1 :(得分:0)

这是与算法相关的密钥和iv长度的关系,如

>>> iter(1)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    iter(1)
TypeError: 'int' object is not iterable
>>> iter('a')
<str_iterator object at 0x000000CE599A40B8>
>>> 

这是一个可运行的示例

DES-ECB       Key: 8;  IV: 0
DES-CBC       Key: 8;  IV: 8
DES-CFB       Key: 8;  IV: 8
DES-CFB1      Key: 8;  IV: 8
DES-CFB8      Key: 8;  IV: 8
DES-EDE-CBC   Key: 16; IV: 8
DES-EDE-CFB   Key: 16; IV: 8
DES-EDE-OFB   Key: 16; IV: 8
DES-EDE3-CBC  Key: 24; IV: 8
DESX-CBC      Key: 24; IV: 8

希望有帮助。