基本上将数据从基于java的系统移动到C#one。
java端的代码对密码执行以下操作
---------- code -------
ByteBuffer byteBuffer = ByteBuffer.allocate( 2 * 4 + saltBytes.length + secretKeyBytes.length);
byteBuffer.putInt(pbkdf2EncryptionConfiguration.getKeySize());
byteBuffer.putInt(pbkdf2EncryptionConfiguration.getRounds());
byteBuffer.put(saltBytes);
byteBuffer.put(secretKeyBytes);
return Base64.encode(byteBuffer.array());
----------结束代码-------
总之,一个以数字开头的字节数组有另一个数字,后跟salt,后跟secretKey
我的问题是,java字节与C#(有符号/无符号)不同,我基本上只想提取salt / secret密钥。
到目前为止我在C#中的过程是
---------- code -------
byte[] actualPasswordByteArray = Convert.FromBase64String(hash);
int abc = BitConverter.ToInt32(items, 0);
int def = BitConverter.ToInt32(items, 4);
byte[] salt = new byte[SaltByteSize];
byte[] key = new byte[HashByteSize];
using (var deriveBytes = new Rfc2898DeriveBytes(password, 8, 128000))
{
salt = deriveBytes.Salt;
key = deriveBytes.GetBytes(leftOverBytes);
}
----------结束代码-------
但我没有得到正确的价值
答案 0 :(得分:0)
def
保留轮数,但您将其硬编码为128000。Rfc2898DeriveBytes
,但是您告诉该类生成一个8字节的随机盐。由于你让盐随机生成,你现在有了大约100毫秒的代码来产生一个可以在~10ns内产生的随机答案。
字节流中的每个值(大部分都不是)读取都很重要。如果你发现你已经对任何值进行了硬编码,那么你就做错了。