AES Encryption теряет конец XSL-файла - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь использовать шифрование 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

У меня все еще есть та же проблема, не весь файл возвращается, однако теперь пропущено меньше символов. Теперь я предполагаю, что эта проблема связана с начальной стадией шифрования.

1 Ответ

0 голосов
/ 09 марта 2020

Для всех, кто может столкнуться с той же проблемой, я забыл включить cipher.final как в шифрование, так и в дешифрование.

#Encryption
encData << cipher.final

#Decryption
decData << cipher.final

Это решило мою проблему.

...