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()上得到了一个“不好的解密”,并且无法找出原因。
encrypt3DES
我在这里做错了什么?
声明 不,这不会用于生产。我只是在四处闲逛所以请抱着“你不知道你在做什么所以你不应该这样做”谈话
答案 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
希望有帮助。