【发布时间】:2018-02-16 17:41:16
【问题描述】:
我正在尝试学习一些加密编码,并生成了一个当前保存在字节数组中的 32 字节私钥 (byte[] privatekey)。我知道公钥是使用 secp256k1 命名的椭圆曲线参数和publickey = G * privatekey 的公式生成的,其中 G 是椭圆曲线上的某个点(ECPoint?),但我无法转移将命名参数规范和公式转换为公钥的实际编码。我知道从 java 7 开始,java.security.* 和 java.security.spec.* 包中包含的类可以用简短的代码执行此操作,但我找不到一个很好的示例来说明如何在不使用第三方库的情况下执行此操作。
编辑/更新:我尝试使用以下代码获取我需要的内容:
String secp256k1_G_uncompressed_string = "0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8";
byte[] secp256k1_G_uncompressed_bytes = DatatypeConverter.parseHexBinary(secp256k1_G_uncompressed_string);
String privatekeystring = "1184CD2CDD640CA42CFC3A091C51D549B2F016D454B2774019C2B2D2E08529FD";
byte[] privatekeybytes = DatatypeConverter.parseHexBinary(privatekeystring);
BigInteger secp256k1_G_num = new BigInteger(1, secp256k1_G_uncompressed_bytes);
BigInteger privatekey_num = new BigInteger(1, privatekeybytes);
BigInteger curvepoint = secp256k1_G_num.multiply(privatekey_num);
byte[] publickeybytes = curvepoint.toByteArray();
System.out.println(DatatypeConverter.printHexBinary(privatekeybytes));
System.out.println(DatatypeConverter.printHexBinary(publickeybytes));
使用正确编码生成的公钥是这样的:
04d0988bfa799f7d7ef9ab3de97ef481cd0f75d2367ad456607647edde665d6f6 fbdd594388756a7beaf73b4822bc22d36e9bda7db82df2b8b623673eefc0b7495
但是正在生成的公钥是这样的:
4E6801418BB6EF9F462F69830F82EB51BB9224219B9D89C8C34FB746297F59779D8B986194181BD7AB99DC7E3086914EA13C4B37E05716CADCA0AE391CE81C4B85E0F09E8628F0F81692B5D08D0D8B9E20615A5D23DE0F591D02C650554BB1D8 P>
【问题讨论】:
-
也许我应该获取曲线点的 X 和 Y 值并从中创建和 ECPoint 并尝试从 ECPoint 制作公钥?
标签: java public-key elliptic-curve