2015-11-26 69 views
1

我想加密一個字符串並傳遞給Rails應用程序,所以我在Nodejs和Ruby中都找到了加密庫。在Nodejs和Ruby中加密

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

所以我用相同的方法和密鑰加密一個相同的字符串,爲什麼結果不一樣?

+0

什麼都在你面前的加密字節的base64編碼呢? –

回答

2

crypto.createCipher(算法,密碼)和crypto.createCipheriv(算法,密鑰,iv)之間的區別在於密碼用於派生密鑰和IV。

var crypto = require('crypto'), 
    algorithm = 'aes-256-ctr', 
    key = 'd6F3Efeqd6F3Efeqd6F3Efeqd6F3Efeq', 
    iv = "123456789"; 

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 = "123456789" 
    result = des.update(des_text) 
    result << des.final 
    return Base64.encode64 result 
end 

p encrypt("1").strip # return bQ==