Java中的OpenSSL&n; BN_bin2bn等价物

时间:2015-06-05 15:53:52

标签: java c openssl unsigned-integer

我有16个字节的数组数据,需要将其转换为OpenSSL BN_bin2bn提供的类似输出。每OpenSSL documents

  

BN_bin2bn()将长度为len的big-endian形式的正整数转换为BIGNUM,并将其置于ret中。如果ret为NULL,则创建一个新的BIGNUM。

我很难这样做。 BN_bin2bn使用unsigned long来表示值,但在Java中,unsigned不支持。我尝试了下面提到的代码来实现相同的但是在这里只有前4个字节的数据与bin2bn匹配。其余数据不同。唯一可能的原因是在C中,unsigned long可以存储16个字节的数据,但在Java中只能存储8个字节。

当我尝试转换为无符号时,对于5-8个字节,它会越过8字节限制并为long变量赋予负值。

我也尝试使用BigInteger。结果是一样的。前4个字节匹配,但结果不匹配。非常感谢任何帮助..这是代码:

byte[] arrayValue = hexToByteArray("53ABA93B9131C439D2942C7CBC483FA5"); 
long op1 = 0L; 
int n = 16 , m = 7;
int x = 0;
while (n-- > 0) {
    op1 = (op1 << 8L) | (0xFF & arrayValue[x++]);
    System.out.println(op1);
    if (m-- == 0) {
        op1 = 0L;
    }
}

输出结果为:

83
21419
5483433  
1403758907
359362280337
91996743766321
23551166404178372
6029098599469663289
210
53908
13800492
3532926076
904429075644
231533843364936
59272663901423679
-3272942114945089627

使用Big Integer:

BigInteger op = BigInteger.ZERO;

while (n-- > 0) {
    int temp1 = 0xFF & arrayValue[k++];
    op = op.shiftLeft(8).or(new BigInteger(String.valueOf(temp1)));
    System.out.println(op);
}

输出结果为:

83
21419
5483433
1403758907
359362280337 
91996743766321
23551166404178372
6029098599469663289
210
53908
13800492
3532926076
904429075644
231533843364936

bin2bn方法的输出:

83
21419
5483433
1403758907
2879994769
2839253297
999371204
2435957817
210
53908
13800492
3532926076
2485943484
746372168
2092714047
3158851493

0 个答案:

没有答案