从c#加密密钥派生到Ruby (PBKDF2)
本文关键字:Ruby PBKDF2 派生 加密 密钥 | 更新日期: 2023-09-27 18:03:02
我正在尝试将以下用c#编写的密钥生成方法重写为Ruby等效方法:
private static byte[] CreateKey(string password, int length)
{
var salt = new byte[] { 0x01, 0x02, 0x23, 0x34, 0x37, 0x48, 0x24, 0x63, 0x99, 0x04 };
const int Iterations = 1000;
using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, Iterations))
return rfc2898DeriveBytes.GetBytes(length);
}
我正在使用PBKDF2实现。下面是我的Ruby代码:
def create_key password, length
salt_a = [0x01, 0x02, 0x23, 0x34, 0x37, 0x48, 0x24, 0x63, 0x99, 0x04]
salt = salt_a.pack('C*') # Think here there is something to change
iterations = 1000
derived_b = PBKDF2.new do |p|
p.password = password
p.salt = salt
p.iterations = iterations
p.key_length = length
p.hash_function = OpenSSL::Digest::SHA1
end
derived_b.bin_string # and here too
end
为了工作,这两个方法应该返回相同的输出。问题是我不知道该怎么做。PBKDF2实现将salt作为字符串,但c#采用字节数组…我认为问题就在那里。
如果您可以使用最新版本的OpenSSL,那么这对我来说是有效的:
SALT = [ 0x94, 0x67, 0x16, 0xe6, 0x20, 0xd4, 0x56, 0x46, 0x67, 0x56, 0x46, 0x56, 0x23 ].pack("c*")
PBKDF2_ITERATIONS = 1000
def create_key(password, length)
OpenSSL::PKCS5::pbkdf2_hmac_sha1(password, SALT, PBKDF2_ITERATIONS, length)
end