首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将java中的加密代码转换为Ruby

将java中的加密代码转换为Ruby
EN

Stack Overflow用户
提问于 2015-01-30 12:06:30
回答 2查看 864关注 0票数 3

我一直在尝试将java中的加密代码转换为ruby,但我不能完全做到。我得到了不同的价值观。

代码语言:javascript
复制
   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);

谁能让我知道,这怎么能在红宝石里完成。

代码语言:javascript
复制
  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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-09 07:27:37

加密代码:

代码语言:javascript
复制
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

解密代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
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缺失的部分。在那之后,所有的人都开始正常工作。

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

票数 0
EN

Stack Overflow用户

发布于 2015-02-04 01:48:12

代码语言:javascript
复制
require 'openssl'

加密:

代码语言:javascript
复制
unencrypted = "I am a secret!"

初始化用于加密的密码

代码语言:javascript
复制
cipher = OpenSSL::Cipher::AES.new(128, :CBC)
cipher.encrypt

使用SHA1创建密钥

代码语言:javascript
复制
key = Digest::SHA1.hexdigest('secret_key')[0...32]
cipher.key = key

使用输入创建initialisationVector

代码语言:javascript
复制
iv = Digest::SHA1.hexdigest('secret_iv')[0...32]
cipher.iv = iv

创建随机initialisationVector

代码语言:javascript
复制
iv = cipher.random_iv

运行加密

代码语言:javascript
复制
encrypted = cipher.update(unencrypted) + cipher.final

解密:

初始化解密密码

代码语言:javascript
复制
decipher = OpenSSL::Cipher::AES.new(128, :CBC)
decipher.decrypt

加载密钥和initialisationVector

代码语言:javascript
复制
decipher.key = key
decipher.iv = iv

解密明文

代码语言:javascript
复制
plain = decipher.update(encrypted) + decipher.final

匹配吗?

代码语言:javascript
复制
puts unencrypted == plain #=> true

有关更多信息,请参见类- OpenSSL::密码的Ruby。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28235569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档