2013-11-26 41 views
0
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()的“糟糕的解密”,并且找不到原因。加密所以当NodeJS Triple DES实现上的解密不好?

  1. 节点需要一个缓冲你看我提供的的encrypt3DES
  2. 开始我把从加密缓冲输出的原始直入解密方法

我在做什么这里错了吗?

免责声明 不,这不会用于生产。我只是玩弄左右,所以请与“你不知道你这样做,你不应该做什么”持有谈

回答

1

update结果在你的代码被扔掉:

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

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

+0

当使用流时,我得到了相同的结果,我相信*这是正确的实现,因为节点中的密码也是流,因此在使用update时并不打算分配给新变量。 –

+0

我仔细阅读了CryptoJS的文档,我相信*你错了。在你发表评论之前,你有没有尝试**我的解决方案?如果你想将它们用作流,我认为你应该使用'write'或'read'方法。我不认为他们是*汇*或*来源*。 –

+0

是的,我第一次使用本地流API(监听数据和结束,使用输入数据消防流)。我会给它多一些镜头,如果你是对的,我一定会返回并标记正确的:-) –