在Nodejs和Ruby中encryption
我想encryption一个string并传递给Rails应用程序,所以我在Nodejs和Ruby中都find了encryption库。
在Nodejs中:
var crypto = require('crypto'), algorithm = 'aes-256-ctr', password = 'd6F3Efeqd6F3Efeqd6F3Efeqd6F3Efeq'; function encrypt(text){ var cipher = crypto.createCipher(algorithm,password) var crypted = cipher.update(text,'ascii',"base64") crypted += cipher.final("base64"); return crypted; }
结果是:
encrypt("1") //-输出 2g==
在Ruby中
def encrypt(des_text) des = OpenSSL::Cipher::Cipher.new('aes-256-ctr') des.encrypt des.key = 'd6F3Efeqd6F3Efeqd6F3Efeqd6F3Efeq' result = des.update(des_text) result << des.final return Base64.encode64 result end
结果是:
encrypt("1") # 输出 1A==
所以我用同样的方法和密钥encryption一个相同的string,为什么结果是不一样的?
crypto.createCipher(algorithm,密码)和crypto.createCipheriv(algorithm,密钥,iv)之间的区别在于使用密码来导出密钥和IV。
var crypto = require('crypto'), algorithm = 'aes-256-ctr', key = 'd6F3Efeqd6F3Efeqd6F3Efeqd6F3Efeq', iv = "1234567890123456"; function encrypt(text){ var cipher = crypto.createCipheriv(algorithm,key,iv) var crypted = cipher.update(text,'utf-8',"base64") crypted += cipher.final("base64"); return crypted; } console.log(encrypt("1")); // return bQ==
在Ruby中,如果你没有指定iv,那么它将使用默认的iv。
require 'openssl' require 'base64' def encrypt(des_text) des = OpenSSL::Cipher::Cipher.new('aes-256-ctr') des.encrypt des.key = 'd6F3Efeqd6F3Efeqd6F3Efeqd6F3Efeq' des.iv = "1234567890123456" result = des.update(des_text) result << des.final return Base64.encode64 result end p encrypt("1").strip # return bQ==