Ruby / OpenSSL:解密最终throwsOpenSSL :: Cipher :: CipherError,padding = 0将无法解决

时间:2018-03-06 16:32:35

标签: ruby encoding openssl cryptography puzzle

我用以下代码加密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

解密到底 - 这表明解密参数,如ivkey等都是正确的 - 但是,数据完全不可读 - 暗示我是有编码问题。填充是否可以改变data字符串的解码方式?任何人都可以确认该文件只能在传输过程中被破坏吗?这个谜题的答案是什么?

1 个答案:

答案 0 :(得分:0)

错误是任何key都会破译密码,但只有正确的key才能解密到原始流的某些内容(类似)。

在我的情况下,我使用了一个带有隐形字符的错误passwordpassword之前已经通过相同的程序解密。如果没有padding = 0,则无法正确生成密码。添加padding = 0后,会在输出中添加一些填充。请注意,puts不会打印“隐身”字符,但会p

如何确保解密文本是原始加密文本仍然存在疑问。然而,问题本身得到了解答。