我用以下代码加密data
字符串:
cipher = OpenSSL::Cipher.new('aes-128-cbc')
cipher.encrypt
key = cipher.key = Digest::SHA256.hexdigest password
iv = cipher.random_iv
encrypted = cipher.update(data) + cipher.final
base64_iv = Base64.encode64 iv
base64_encrypted = Base64.encode64 encrypted
puts base64_iv
puts base64_encrypted
File.write enc_iv_base64_filename, base64_iv
File.write encrypted_base64_filename, base64_encrypted
我通常会用这个程序解读:
decipher = OpenSSL::Cipher.new('aes-128-cbc')
decipher.decrypt
# decipher.padding = 0
decipher.key = Digest::SHA256.hexdigest password
decipher.iv = Base64.decode64 (File.read base64_iv)
plain = decipher.update(Base64.decode64(File.read base64_encrypted)) + decipher.final
它一直适用于我尝试使用data
包含小字符串的所有值。
现在我正在尝试使用内容为~500MB文件的字符串,大多数由“可读”字符组成(一个奇怪的事实是,拥有1100MB的可用内存是不够的,但是在添加2G交换之后做了工作;对这个问题不重要=))。该文件已解密,上载到服务器,然后再次下载。通过尝试解密它,它抛出了这个异常:
:in `final': wrong final block length (OpenSSL::Cipher::CipherError)
然后,我评论道:
decipher.padding = 0
解密到底 - 这表明解密参数,如iv
,key
等都是正确的 - 但是,数据完全不可读 - 暗示我是有编码问题。填充是否可以改变data
字符串的解码方式?任何人都可以确认该文件只能在传输过程中被破坏吗?这个谜题的答案是什么?
答案 0 :(得分:0)
错误是任何key
都会破译密码,但只有正确的key
才能解密到原始流的某些内容(类似)。
在我的情况下,我使用了一个带有隐形字符的错误password
。 password
之前已经通过相同的程序解密。如果没有padding = 0
,则无法正确生成密码。添加padding = 0
后,会在输出中添加一些填充。请注意,puts
不会打印“隐身”字符,但会p
。
如何确保解密文本是原始加密文本仍然存在疑问。然而,问题本身得到了解答。