我曾与Node的crypto
库和Ruby的OpenSSL
库互换工作。
我遇到的挑战是,我可以在两个库中使用aes256
进行加密。
然而,在使用crypto.createDecipher('aes256', key)
的节点中,我可能有一个小于32位长的密钥,但ruby在使用时会抛出一个错误,说密钥不够长
cipher = OpenSSL::Cipher.new 'aes256'
cipher.encrypt
key = 'geeses'
我也不必为node设置初始化向量,但ruby似乎在幕后设置了一个。我对加密货币很陌生,这里发生了什么?
虽然@mscdex的答案很完美,但我想补充一下,当您的算法不需要使用crypto.createCipheriv
或crypto.createDecipheriv
的初始化矢量时,如何使用特定密钥获得密码
以AES-256-ECB为例,其中没有进行链接,因此没有使用IV。您可以将空缓冲区作为IV传递。
var data = "plaintext";
const key = crypto.randomBytes(32);
var iv = new Buffer('');
var cipher = crypto.createCipheriv('AES-256-ECB',key,iv);
var encrypted = cipher.update(data,'utf8','base64');
encrypted += cipheriv.final('base64');
console.log('encrypted AES-256-ECB',encrypted);
并且使用相同的模式进行解密:
var decipheriv = crypto.createDecipheriv('AES-256-ECB',key,iv);
var decryptediv = decipheriv.update(encrypted,'base64','utf8');
decryptediv += decipheriv.final('utf8');
console.log('decrypted base64 aes-256 ',decryptediv);
使用crypto.createDecipher()
时,作为第二个参数传递的值是一个密码,密钥和IV将从该密码派生(使用MD5哈希的一次迭代)。这是通过使用EVP_BytesToKey()
来创建这两个值来实现的。OpenSSL知道两个值需要的正确长度,因为密码也传递给EVP_BytesToKey()
。
因此,Ruby函数很可能更类似于节点的crypto.createDecipheriv()
,它接受密钥和IV(这需要是密码的正确长度)。