XSL文件的AES加密丢失结尾

问题描述 投票:0回答:1

我正在尝试使用AES加密,以便对正在MongoDB上保存的文件进行加密。这使用了GridFS gem。

[AES密钥由RSA本身加密,然后与文档一起存储在Mongo中。

我以前使用的Mongoid::EncryptedFields.cipher.encrypt可以正常工作,但是,客户端希望使用RSA密钥。

我的xsl_action:

tempFile = params[:stylesheet].tempfile
file = File.open(tempFile)

grid_fs = Mongoid::GridFS

#Encryption
pub_file = CaseCenter::Config::Reader.get('pub_key');
public_key = OpenSSL::PKey::RSA.new(File.read(pub_file))
cipher = OpenSSL::Cipher.new('aes-256-cbc')
cipher.encrypt
key = cipher.random_key
encData = cipher.update(File.read(file))
#End Encryption

File.open(file, 'wb') do |f|
  f.write(encData)
end
encrypted_aes = Base64.encode64(public_key.public_encrypt(key))
stylesheet.aes_key = encrypted_aes

grid_file = grid_fs.put(file.path)
stylesheet.stylesheet_id = grid_file.id

要解密文件,我用这个:

grid_fs = Mongoid::GridFs
f = grid_fs.get(stylesheet_id)

#Decryption
key = CaseCenter::Config::Reader.get('priv_key')
passphrase = CaseCenter::Config::Reader.get('key_pass')
if key.include? "-----BEGIN RSA PRIVATE KEY-----"
  private_key = OpenSSL::PKey::RSA.new(key,passphrase)
else
  private_key = OpenSSL::PKey::RSA.new(File.read(key),passphrase)
end
decKey = private_key.private_decrypt(Base64.decode64(doc[:aes_key]))
cipher = OpenSSL::Cipher.new('aes-256-cbc')
cipher.decrypt
cipher.key = decKey
decData = cipher.update(f.data)

AES密钥和文件已正确加密,但是在解密时,文件会丢失最后30个字符。加密期间我做错了吗?

编辑1:以为可能是我没有包含cipher.final。

我现在包括

encData << cipher.final

我仍然遇到相同的问题,不是所有文件都被返回,但是现在缺少的字符更少了。我现在认为此问题是由于初始加密阶段引起的。

ruby-on-rails openssl aes rsa mongoid
1个回答
0
投票

对于可能遇到相同问题的其他人,我忘记了在加密和解密方面都包含cipher.final。

#Encryption
encData << cipher.final

#Decryption
decData << cipher.final

这解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.