1

Rails 3.2 を使用しており、AES-CBC 256 を使用して何かを暗号化するために、 pbkdf2_hmac_sha1関数からキーと IV を生成しようとしています。

それを生成するために使用するコードは次のとおりです。

require "openssl"
require "base64"
require "digest"
require "securerandom"

@chave = "fd5d148867091d7595c388ac0dc50bb465052b764c4db8b4b4c3448b52ee0b33df16975830acca82"

cipher = OpenSSL::Cipher.new("AES-256-CBC")
key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(@chave, salt, 2000, cipher.key_len+cipher.iv_len)
key = key_iv[0, cipher.key_len]
iv  = key_iv[cipher.key_len, cipher.iv_len]

SecureRandom.urlsafe_base64 を使用してランダム ソルトを生成すると、いくつかのソルトを使用すると、IV の長さ (16 バイトである必要があります) が 16 バイトではなく 15 バイトになる場合があることに気付きました。

たとえば、salt = "lzbH78AwVK7U1eo-ephK6A" がある場合、IV = "604ff394b52e79255fa35b081684b0" (15 バイト長) が生成されます。

誰かが私が間違っていることの手がかりを得ることができますか?

4

1 に答える 1

2

文字列を生成するためpbkdf2_hmac_sha1、16 進数への変換が間違っているようです。(この例では値を使用):

irb(main):029:0> iv  = key_iv[cipher.key_len, cipher.iv_len]
=> "`O\xF3\x94\n\xB5.y%_\xA3[\b\x16\x84\xB0"
irb(main):030:0> iv.length
=> 16
irb(main):032:0> iv.each_char { |c| puts c.ord.to_s(16) }
60
4f
f3
94
a     ### this one is missing in your number -- it maps to \n
b5
2e
79
25
5f
a3
5b
8
16
84
b0
=> "`O\xF3\x94\n\xB5.y%_\xA3[\b\x16\x84\xB0"
于 2014-02-20T15:21:00.683 に答える