Я пытаюсь использовать шифрование AES для шифрования файлов, сохраняемых на MongoDB. При этом используется гем GridFS.
Ключ AES сам зашифровывается RSA, а затем сохраняется вместе с документом в Mon go.
Я ранее использовал 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
У меня все еще есть та же проблема, не весь файл возвращается, однако теперь пропущено меньше символов. Теперь я предполагаю, что эта проблема связана с начальной стадией шифрования.