我正在尝试使用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
我仍然遇到相同的问题,不是所有文件都被返回,但是现在缺少的字符更少了。我现在认为此问题是由于初始加密阶段引起的。
对于可能遇到相同问题的其他人,我忘记了在加密和解密方面都包含cipher.final。
#Encryption
encData << cipher.final
#Decryption
decData << cipher.final
这解决了我的问题。