【发布时间】:2015-10-04 17:56:16
【问题描述】:
我有一个用于椭圆曲线的自定义加密引擎,我正在尝试使其与 Java 的充气城堡加密兼容,因此我正在针对 Java 的 bouncycastle 测试我的 API(密钥对生成)。
第一件事是在 Java 和我的加密引擎之间共享公钥,这样我可以获得相同的共享密钥。
我的模块采用椭圆曲线 32 字节 X 和 32 字节 Y 值。我可以通过调用下面的“publickeyJava .toString()”从 Java 代码中输出 X 和 Y,输出格式为“X: .... and Y: .....”(如下所示)。我复制将这些 X 和 Y 值粘贴到我的自定义加密引擎中,并验证我能够获得与 Java 充气城堡生成的相同的秘密,因此我知道我的转换是手动进行的。
问题是如何在 JAVA 中以编程方式提取这些 32 字节的 X 和 Y 值? 我使用 Java 类来获取 X 和 Y 坐标并使用“getW.getAffineX() 和 getW. AffineY()”(如下面的代码所示),但这些值似乎与“publickey.tostring”生成的输出不匹配(这是我的模块需要的)。
有没有办法从 print "pubclickey.tostring" 中提取 X & Y 值?请提出建议。
/*** 从 bouncycastle crypto 打印椭圆曲线 X 和 Y 的 Java 代码 ****/
public static int generateECKeys() {
try {
ECNamedCurveParameterSpec parameterSpec = ECNamedCurveTable.getParameterSpec("secp256r1");
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDH", "SC");
keyPairGenerator.initialize(parameterSpec);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publickeyJava = keyPair.getPublic();
Log.e(TAG_LOG, "X & Y values are ...." + publickeyJava .toString());
Log.d("LOG_TAG", "BigInteger X value is = " + ((ECPublicKey) publickeyJava).getW().getAffineX().toString());
Log.d("LOG_TAG", "BigInteger Y value is = " + ((ECPublicKey) publickeyJava).getW().getAffineY().toString());
/* .....code to generate shared secret ..... */
return 1;
} catch(Exception e){e.printStackTrace();}
return 0;
}
/******** 输出 ********/
X & Y values are ....EC Public Key
X: f98c87d3b6db30895b275630f30df9d796d067b06e4836f5615cad84965f4f85
Y: b8b58cb767f23e4bc4db0cc371ffb50cf12aa30407c1ba236f78a6c38948c2ee
BigInteger X value is = 324637435756455760457435640555474465574856445654455076545679
BigInteger Y value is = 954378375783465749076758439759347657056597437786534984623864
谢谢
【问题讨论】:
-
最后两行显然是错误的,因为这些数字太小了。我在桌面上使用 bouncycastle 1.52 尝试了您的代码并得到了正确答案。我无法解释你的输出。
-
第一组数字是十六进制的,而你打印的数字是十进制的。尝试以 16 进制(十六进制)打印数字,它们应该匹配。
-
@Iamsomeone:显然它们不匹配。十六进制值是 256 位,十进制值要小得多。
-
我解决了这个问题。我解析了包含 X 和 Y 的字符串并转换为字节数组以在我的 CE 中使用。
标签: java android bouncycastle jce elliptic-curve