我需要转换一个大整数 https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html以大端格式编码的无符号整数,但我遇到了问题BigInteger.toByteArray https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#toByteArray()返回一个签名表示。如何将此值转换为无符号格式?
(相对)有用的背景
我正在编写一些代码,这些代码使用 JNI 让 c++ 调用一些 Java 方法来处理一些加密功能(这是一个 Microsoft CNG 提供程序,它将一些功能卸载到 Java)。我有 Java 中的公钥,我需要转换的 BigInteger 值是椭圆曲线公钥的坐标 https://docs.oracle.com/javase/7/docs/api/java/security/spec/ECPoint.html#getAffineX()。根据我需要将这些点提供为“以大端格式编码的无符号整数”。
Edit
事后看来,这可能是一个愚蠢的帖子。我对负数和正数以及如何处理它感到困惑(因为已经晚了,我的头脑已经变得混乱),但事实证明我不需要处理这个问题,因为椭圆曲线点不会为负数 https://crypto.stackexchange.com/questions/16604/why-are-there-only-positive-value-points-on-an-elliptic-curve。感谢所有在这里回复的人!我会把它保留下来,以防它对其他人有帮助。
借助 2 的补码参考值,我们可以像下面这样执行此操作
private static final BigInteger TWO_COMPL_REF = BigInteger.ONE.shiftLeft(64);
public static byte[] parseBigIntegerPositive(BigInteger b) {
if (b.compareTo(BigInteger.ZERO) < 0)
b = b.add(TWO_COMPL_REF);
byte[] unsignedbyteArray= b.toByteArray();
return unsignedbyteArray;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)