我有一个使用SRP6进行加密的服务器程序。为了达到这个目的,它使用了OpenSSL LIBEAY32.dll。它使用BN函数和IntPtr,但是我对于DLL函数中实际发生的事情完全神秘。更糟糕的是,我不确定是否有一些自定义元素添加到使用的加密中。srp6 IntPtr到BigInteger
为了让我明白这一点,所以我可以彻底了解我想要转换代码的过程,使它使用BigInteger并在DLL之外执行计算。但是因为我的知识在这方面严重缺乏,所以我希望能朝正确的方向发展。
以下代码计算x。现在我不知道为什么字节数组被颠倒过来。但是我在代码中看到了很多,字节数组被颠倒过来,然后通过BN_bin2bn函数转换为BN。是否有一个原因?
Public Sub CalculateX(ByVal I As Byte())
'x = sha (s, I) , I = sha ("username:password");'
Dim buffer As Byte() = objSha1Managed.ComputeHash(salt.Concat(I).ToArray())
Array.Reverse(buffer)
_x = New BigInteger(buffer)
End Sub
然后我们有代码来计算诉
Private Sub CalculateV()
'v = g^x % N'
_BNv = BN_new("")
Dim ptr1 As IntPtr = BN_CTX_new("")
Dim x As IntPtr = BN_bin2bn(_x.ToByteArray(), _x.ToByteArray().Length, IntPtr.Zero, "")
BN_mod_exp(_BNv, _BNg, x, _BNn, ptr1, "")
Dim v() As Byte = New Byte(31) {}
BN_bn2bin(_BNv, v, "")
End Sub
我想这段代码改写为以下。我已经清理了很多代码,但你仍然可以看到我尝试了各种各样的东西:再次颠倒byte数组x,为正数添加0字节。我被卡住的地方是:我是,假设上面的代码中的字节数组v()应该与下面代码中的字节数组myV()具有相同的值。但我无法到达那里。我的假设是否正确?如果是这样,我的错误在哪里?如果不是,如果我无法比较值,我该如何转换整个项目?
Private Sub CalculateV()
'v = g^x % N'
'Dim BIGINTEGER_N As BigInteger = New BigInteger(N.Concat(New Byte() {0}).ToArray())'
Dim BIGINTEGER_N As BigInteger = New BigInteger(N)
Dim tempX As Byte() = _x.ToByteArray()
Array.Reverse(tempX)
Dim BIGINTEGER_X As BigInteger = New BigInteger(tempX.Concat(New Byte() {0}).ToArray())
'Dim BIGINTEGER_X As BigInteger = New BigInteger(tempX)'
Dim myV() As Byte = BigInteger.ModPow(New BigInteger(g), BIGINTEGER_X, BIGINTEGER_N).ToByteArray()
End Sub
谢谢你的时间。
谢谢你的回复。我认为这可能是endian相关的。所以如果我得到这个正确的,endian基本上是。两台电脑上有10个号码。在大端序列中它被称为1010.在小端序列中它被称为0101?这个假设是否正确? – bdebaere