【问题标题】:Convert Encrypt code in java to Ruby将Java中的加密代码转换为Ruby
【发布时间】:2015-03-29 21:50:10
【问题描述】:

我一直在尝试将用于在 java 中加密的代码转换为 ruby​​,但我无法完全做到这一点。我得到不同的值。

   passphrase = passphrase + STATIC_KEY;
   byte[] key = passphrase.getBytes("UTF-8");

   MessageDigest sha = MessageDigest.getInstance("SHA-1");
   key = sha.digest(key);
   key = Arrays.copyOf(key, 16);
   SecretKey secretKey = new SecretKeySpec(key, "AES");

   Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
   IvParameterSpec initialisationVector = new IvParameterSpec(
           new byte[16]);
   cipher.init(Cipher.ENCRYPT_MODE, secretKey, initialisationVector);

   byte[] encryptedData = cipher.doFinal(plainText.getBytes("UTF-8"));

   return SimpleCrypto.toHex(encryptedData);

谁能告诉我,如何在 ruby​​ 中做到这一点。

  unencrypted = "passphrase"
  c = OpenSSL::Cipher.new("aes-128-cbc")
  c.encrypt
  c.key = Digest::SHA1.hexdigest('secret_key')[0...32]
  e = c.update(unencrypted)
  e << c.final
  return e

【问题讨论】:

  • 如果我的回答正确,请告诉我
  • @railrailrail,我已经发布了我的答案。我试过你的代码。 hex_to_bin 密钥转换是缺失的部分。请检查我的答案。

标签: java ruby ruby-on-rails-3 aes sha


【解决方案1】:
require 'openssl'

加密:

unencrypted = "I am a secret!"

初始化密码以进行加密

cipher = OpenSSL::Cipher::AES.new(128, :CBC)
cipher.encrypt

使用 SHA1 创建密钥

key = Digest::SHA1.hexdigest('secret_key')[0...32]
cipher.key = key

使用输入创建初始化向量

iv = Digest::SHA1.hexdigest('secret_iv')[0...32]
cipher.iv = iv

创建一个随机初始化向量

iv = cipher.random_iv

运行加密

encrypted = cipher.update(unencrypted) + cipher.final

解密:

初始化密码以进行解密

decipher = OpenSSL::Cipher::AES.new(128, :CBC)
decipher.decrypt

加载密钥和初始化向量

decipher.key = key
decipher.iv = iv

解密明文

plain = decipher.update(encrypted) + decipher.final

匹配吗?

puts unencrypted == plain #=> true

有关更多信息,请查看该课程的 Ruby 文档 - OpenSSL::Cipher

【讨论】:

  • 嘿,伙计,我能够找出代码。 +1 为您的努力。我也会试试你的代码。
【解决方案2】:

加密代码:

def aes(key,string)
  cipher = OpenSSL::Cipher::Cipher.new("aes-128-cbc")
  cipher.encrypt
  cipher.padding = 1
  cipher.key = hex_to_bin(Digest::SHA1.hexdigest('secret_key')[0..32])
  cipher_text = cipher.update(string)
  cipher_text << cipher.final
  return bin_to_hex(cipher_text).upcase
end

解密代码:

def aes_decrypt(key, encrypted)
  encrypted = hex_to_bin(encrypted.downcase)
  cipher = OpenSSL::Cipher::Cipher.new("aes-128-cbc")
  cipher.decrypt
  cipher.padding = 1
  cipher.key = hex_to_bin(Digest::SHA1.hexdigest('secret_key')[0..32])
  d = cipher.update(encrypted)
  d << cipher.final
end

hex_to_bin 和 bin_to_hex

def hex_to_bin(str)
  [str].pack "H*"
end

def bin_to_hex(s)
  s.unpack('C*').map{ |b| "%02X" % b }.join('')
end

在我的例子中,java 代码使用了默认的初始化向量,所以我没有设置任何 iv,另外,hex_to_bin 是一个缺失的部分。所以在那之后,一切都开始正常工作了。

如果有人遇到此问题,我希望对他们有所帮助。

【讨论】:

    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2019-08-05
    相关资源
    最近更新 更多