我有一个数字签名 ( byte[] signedBytes
) 在byte[] array
. 我需要将其转换为BigInteger
( bigSignedBytes
),将生成的数字用于某事,然后byte[] convertBackSignedBytes
从BigInteger
.
byte[] signedBytes = rsa.sign();
BigInteger bigSigned = new BigInteger(signedBytes);
convertBackSignedBytes = bigSigned.toByteArray();
//signedBytes and convertBackSignedBytes differ.
问题是在从BigInteger
back to重新转换之后byte[] convertBackSignedBytes
- 它似乎与我的原始signedBytes
变量不同。我知道BigInteger.toByteArray()
返回一个二进制补码byte[] value
- 这可能是负责任的。
那么如何在BigInteger
没有二进制补码的情况下获取原始字节呢?
有人推荐这个:
byte[] convertBackSignedBytes = bigIntegerValue.toByteArray();
if (convertBackSignedBytes[0] == 0) {
byte[] tmp = new byte[convertBackSignedBytes.length - 1];
System.arraycopy(convertBackSignedBytes, 1, tmp, 0, tmp.length);
convertBackSignedBytes = tmp;
}
试过了 - 没用。仍然从 original 返回不同的 byte[]value signedBytes
。
如果我尝试验证原始签名 - 它会成功。
但是,如果我尝试使用转换后的签名进行验证 - 它会失败。所以signedBytes
和convertBackSignedBytes
不再一样。
请问有什么快速的指点吗?