使用十六进制密钥加密的Ruby OpenSSL返回空字符串

时间:2015-11-29 16:21:48

标签: ruby encryption openssl base64 aes

大家好,这是我的第一个问题。我会直截了当地说。感谢您的帮助。

我正在尝试使用从32字节十六进制字符串创建的base64密钥和使用16字节十六进制字符串和AES-128-CBC算法创建的base64中的salt来加密字符串。

这是代码(ruby):

base64_key = 'NTQ2ODY5NzMyMDY5NzMyMDYxNmUyMDY1Nzg2MTZkNzA='
base64_iv  = 'NTQ2ODY5NzMyMDY5NzMyMA=='

# create an OpenSSL Cipher to encrypt the user name
encrypter = OpenSSL::Cipher.new('AES-128-CBC')
encrypter.encrypt

# the key and iv must be a byte array
encrypter.key = Base64.decode64(base64_key)
encrypter.iv  = Base64.decode64(base64_iv)

# add the username to encrypt
enc_string = encrypter.update 'somestring'
# push the rest of the string encrypted
enc_string << encrypter.final

# the enc_string value must be sent encoded as base64
enc_string = Base64.encode64(enc_string)

问题是enc_string最终为空。

我使用从

这样的短语生成的base64密钥尝试了此代码
key = Base64.encode64('This_is_test')
encrypter.key = Base64.decode64(key)

这很有效。

任何见解?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

经过一些反复和前进后,我想出了如何让它发挥作用。

我必须在实例化密码后添加encrypter.padding = 1

这就是代码现在的样子:

require 'openssl'
require 'base64'

base64_key = 'NTQ2ODY5NzMyMDY5NzMyMDYxNmUyMDY1Nzg2MTZkNzA='
base64_iv  = 'NTQ2ODY5NzMyMDY5NzMyMA=='

# create an OpenSSL Cipher to encrypt the user name
encrypter = OpenSSL::Cipher.new('AES-256-CBC')
encrypter.padding = 1
encrypter.encrypt

# the key and iv must be a byte array
encrypter.key = Base64.decode64(base64_key)
encrypter.iv  = Base64.decode64(base64_iv)

# add the username to encrypt
enc_string = encrypter.update 'somestring'
# push the rest of the string encrypted
enc_string << encrypter.final

# the enc_string value must be sent encoded as base64
enc_string = Base64.encode64(enc_string)