Java到C#转换 - base64字节数组pbkdf2EncryptionConfiguration

时间:2018-01-25 03:59:35

标签: java c# arrays byte pbkdf2

基本上将数据从基于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);
}

----------结束代码-------

但我没有得到正确的价值

1 个答案:

答案 0 :(得分:0)

  • def保留轮数,但您将其硬编码为128000。
  • 您应该从流中读取salt并将其作为输入传递给Rfc2898DeriveBytes,但是您告诉该类生成一个8字节的随机盐。

由于你让盐随机生成,你现在有了大约100毫秒的代码来产生一个可以在~10ns内产生的随机答案。

字节流中的每个值(大部分都不是)读取都很重要。如果你发现你已经对任何值进行了硬编码,那么你就做错了。