Elliptic Curve PublicKey(Java - bouncycastle):如何从ECPublicKey.toString()获取32字节X和32字节Y值

时间:2015-10-04 17:56:17

标签: java android bouncycastle jce elliptic-curve

我有一个用于Elliptic曲线的自定义加密引擎,我试图使它与Java的弹性城堡加密兼容,所以我正在测试我的API(密钥对生成)对抗Java的bouncycastle。

首先要分享Java和Java之间的公钥。我的加密引擎,我可以得到相同的共享秘密。

我的模块采用椭圆曲线32字节X& 32字节Y值。我能够输出X&来自Java代码的Y通过调用" publickeyJava .toString()"下面和输出形成为' X:....和Y:....." (如下所示)。我复制粘贴这些X& Y值到我的自定义加密引擎并验证我能够获得与Java的充气城堡相同的秘密,所以我知道我的转换是手动的。

问题是如何提取这些32-BYTE X& JAVA中的Y值是程序性的吗?我使用java类来获得X& Y坐标并用" getW.getAffineX()和getW.AffineY()"打印(如下面的代码所示)但值似乎与" publickey.tostring"生成的输出相匹配。 (这是我的模块所需要的。)

有没有办法提取X&来自print" pubclickey.tostring"的Y值请建议。

/ ***打印椭圆曲线X&的Java代码Y来自bouncycastle crypto **** /

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;
}

/ ******** OUTPUT ******** /

X & Y values are ....EC Public Key             
    X: f98c87d3b6db30895b275630f30df9d796d067b06e4836f5615cad84965f4f85 
    Y: b8b58cb767f23e4bc4db0cc371ffb50cf12aa30407c1ba236f78a6c38948c2ee

BigInteger X value is = 324637435756455760457435640555474465574856445654455076545679
BigInteger Y value is = 954378375783465749076758439759347657056597437786534984623864

由于

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

尝试使用基数为 16 的 toString(int radix),如下所示以获得相同的 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**)**);