算法 [已解决] 关于 ruby 和 nodejs 中的 crypto

hxh1246996371 · November 26, 2015 · Last by hxh1246996371 replied at November 26, 2015 · 9137 hits

最近我想实现一个功能,从 Rails 里面传一个 crypto 加密过的字符串到 node 中,所以想找了一下两种语言中相关的库。

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

不知道为什么同样的加密方式和 key 加密出来的结果不一样呢?

猜一下原因,ascii VS utf-8

#1 楼 @serco 换成 utf-8 也是一样的结果

#2 楼 @hxh1246996371 嗯,我傻了,测试的是 1,ascii 和 utf-8 本来就是一致的。。

#2 楼 @hxh1246996371 node 中 crypto.createCipher(algorithm, password) 和 crypto.createCipheriv(algorithm, key, iv) 的区别是 password is used to derive key and IV。

而 ruby 里面 你只指定了 key,而 iv 是默认的,这里的 key 并不等于 node 里的 password

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

#4 楼 @serco 👍 非常感谢,原来是这样

#5 楼 @hxh1246996371 node 不熟,完全只是看文档看到的。搜索的时候居然第一个结果是你的 stackoverflow 问题。。。

#6 楼 @serco 😄 在 stackoverflow 上也提了问,看来得把加密的原理搞清楚才行

You need to Sign in before reply, if you don't have an account, please Sign up first.