我正在使用 Bouncy Castle 生成 ECC 密钥对:
KeyPairGenerator kpg = null;
try {
kpg = KeyPairGenerator.getInstance("ECDH", BouncyCastleProvider.PROVIDER_NAME);
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
throw new CustomException("Exception: " + e.getMessage());
}
try {
kpg.initialize(paramSpec, new SecureRandom());
} catch (InvalidAlgorithmParameterException e) {
throw new CustomException("Exception: " + e.getMessage());
}
return kpg.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)
的类型paramSpec来自ECParameterSpec. java.security.spec我在用着brainpoolP256r1。
效果很好。然后我想将密钥对中的公钥值(来自 EC 公共点的 X 和 Y 坐标)转换为八位字节字符串。
为此,我使用BigInteger.toByteArray()函数。
我的问题和我想要理解的是为什么坐标的大小并不总是相同?
每个坐标应为 32 字节。但有时,我会得到 31 字节或 33 字节。toByteArray()据我所知,它与返回一个包含此 BigInteger 的补码表示的 …