在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==