【问题标题】:Elliptic Curve PublicKey (Java - bouncycastle): How to get 32 byte X and 32 byte Y value from ECPublicKey.toString()椭圆曲线 PublicKey (Java - bouncycastle):如何从 ECPublicKey.toString() 获取 32 字节 X 和 32 字节 Y 值
【发布时间】: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


【解决方案1】:

今天我遇到了同样的问题。我以这种方式解决了它,在我看来它比解析字符串更容易。

ECPublicKey publickeyJava = (ECPublicKey)keyPair.getPublic();
ECPoint ecp = chiavePubblica.getW();
// to access X and Y you can use
ecp.getAffineX()
ecp.getAffineY()

【讨论】:

    【解决方案2】:

    尝试toString(int radix) 基数为 16,如下所示以获得相同的 X 和 Y 值

    Log.d("LOG_TAG", "BigInteger X value is = " + ((ECPublicKey) publickeyJava).getW().getAffineX().**toString(16)**); Log.d("LOG_TAG", "BigInteger Y value is = " + ((ECPublicKey) publickeyJava).getW().getAffineY().**toString(**16**)**);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多