2016-09-25 78 views
0

我有一个使用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 

谢谢你的时间。

回答

0

现在我不知道为什么字节数组被颠倒过来。但是我在代码中看到了很多,字节数组被颠倒过来,然后通过BN_bin2bn函数转换为BN。是否有一个原因?

微软的API通常是小端,而加密代码通常与“自然”字节排序,这是大端。此外,一些CPU,如基于Intel的IA-32,是小端。至少,它有时候更容易处理处理器的功能。由于微软主要运行在英特尔处理器上,因此微处理器采用小端技术。

关于“加密代码通常与”自然“字节排序...”,Botan,Crypto ++和OpenSSL等库在多个平台上运行,因此它们使用自然表示法。他们还经常为ARM,IA-32,PPC,SPARC提供专门的实现,但它通常隐藏在API用户的内部细节中。隐藏的一个反例是由OpenSSL和configuring with enable-ec_nistp_64_gcc_128

上的小型平台时使用GCC支持__uint128_t。 ECDH约为 约快2到4倍。默认情况下未启用,因为配置 无法确定它。如果您的编译器定义了 __SIZEOF_INT128__,那么启用它,CPU是小端的,它容忍未对齐的数据访问。


我不(在上次的已经有好几年)使用.Net和互操作过于频繁,所以我要离开的.Net问题的。网络专家。

+0

谢谢你的回复。我认为这可能是endian相关的。所以如果我得到这个正确的,endian基本上是。两台电脑上有10个号码。在大端序列中它被称为1010.在小端序列中它被称为0101?这个假设是否正确? – bdebaere