我正在嘗試AES加密一些數據,並且我使用random_iv
來生成初始化向量。未轉義報價(')打破Ruby中的Base64
def encrypt (data)
cipher = OpenSSL::Cipher::AES.new(256, :CBC)
cipher.encrypt
cipher.key = @key
iv = cipher.random_iv
encrypted = cipher.update(data) + cipher.final
encoded = Base64.encode64(encrypted+iv)
return encoded, self.sign(encoded)
end
如果iv
包含'
,編碼字符串結尾那裏,'
後一切都將被忽略。我認爲random_iv
是OpenSSL::Random.random_bytes(16)
,還沒有檢查源碼。當我random_iv
這樣的:
"0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>"
編碼字符串的最後16個字符都沒有像它(結束於C8
)。
Base64.decode64('1JCQvhD6mrDXkhW4Hn9HIIr32TmYlBmp803oxOtrZMg=\n')[-16,16]
# => "\x8A\xF7\xD99\x98\x94\x19\xA9\xF3M\xE8\xC4\xEBkd\xC8"
如果在iv
沒有'
,它工作正常。現在,我解決這樣這個問題:
cipher.iv = Digest::MD5.new.digest(cipher.random_iv)
因爲MD5
是16byte
過,並符合iv
要求。
Digest::MD5.new.digest('test').bytesize
# => 16
想知道是否有更好的方法來做到這一點。爲什麼'
在random_iv
第一?我應該如何轉移傳遞給encode64
的數據?
此外,我是否需要追加字節到我的數據,直到data.bytesize
可以被16
整除?或者Cipher::AES
爲我做?
cipher.update(data)
同樣在這裏。我嘗試了各種不同的引號和二進制數據組合,並且無法讓它突破。如果Base64會像這樣被破壞,這似乎很奇怪。其他人很久以前就會注意到它。 – Casper 2013-02-11 08:00:43
嗨。原來的代碼iv中的yes與定義中的編碼相同,所以我的不好之處......在這裏發佈時弄亂了東西。 – 2013-02-11 10:29:10
無論如何,我測試了它,沒有.force_encoding('BINARY')它的破損。與,它工作正常。 – 2013-02-11 10:29:46