2013-10-22 1 views
0

나는 레일 3.2을 사용하고 있는데 AES-CBC를 사용하여 암호화 뭔가를 위해 pbkdf2_hmac_sha1 기능에서 키와 IV를 생성하기 위해 노력하고있다 256OpenSSL :: PKCS5.pbkdf2_hmac_sha1이 다른 길이의 키를 생성하는 이유는 무엇입니까?

내가 그것을 생성하는 데 사용하는 코드는 다음과 같습니다

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 바이트 길이)를 생성합니다.

누군가 내가 뭘 잘못하고 있는지 알 수 있습니까?

답변

1

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" 
+0

답변 감사합니다! 문자열에서 '\ n'을 실제로 제거했지만 내부 '\ n'도 제거했습니다. – MarcosCunhaLima

관련 문제