Problema de generación de clave pública a partir de clave privada

Encontré algunos problemas cuando intentaba escribir una función capaz de crear una clave pública de Bitcoin a partir de una clave privada. Estaba usando el tutorial: http://procbits.com/2013/08/27/generating-a-bitcoin-address-with-javascript ---> La parte de "clave pública" es la más importante.

Parte de mi código se ve así:

public String generatePublicKey(String privateKey)
{
    BigInteger privKey = new BigInteger(privateKey,16);
    X9ECParameters ecp = SECNamedCurves.getByName("secp256k1");
    ECPoint curvePt = ecp.getG().multiply(privKey);
    BigInteger x = curvePt.getXCoord().toBigInteger();
    BigInteger y = curvePt.getYCoord().toBigInteger();
    byte[] xBytes = this.removeSignByte(x.toByteArray());
    byte[] yBytes = this.removeSignByte(y.toByteArray());
    byte[] pubKeyBytes = new byte[65];
    pubKeyBytes[0] = new Byte("04");
    System.arraycopy(xBytes,0, pubKeyBytes, 1, xBytes.length);
    System.arraycopy(yBytes, 0, pubKeyBytes, 33, yBytes.length);
    return this.bytesToHex(pubKeyBytes);}

También hay dos funciones:

final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    int v;
    for ( int j = 0; j < bytes.length; j++ ) {
        v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}

private byte[] removeSignByte(byte[] arr)
{
    if(arr.length==33)
    {
        byte[] newArr = new byte[32];
        System.arraycopy(arr, 1, newArr, 0, newArr.length);
        return newArr;
    }
    return arr;
}

Sin embargo, usé bytesToHex() antes y no hubo ningún problema. Entonces, el problema es que generatePublicKey() no funciona correctamente. Intenté insertar una clave privada conocida de la wiki de bitcoin:

18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725

(de https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses )

Debería crear una clave pública larga (incluso antes de todo el hash) - paso 2 en wiki:

0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6

Lamentablemente la respuesta es incorrecta. ¿Podrían ustedes mirar esto y señalar mis errores?

Ofc, el lenguaje de programación es Java y el proveedor criptográfico fue Bouncy Castle.

EDITAR: Accidentalmente resolví mi problema. Cuando estaba escribiendo esta función, Eclipse me dijo que la función getX() (y getY()) está obsoleta. Entonces usé getXCoord(), porque pensé que el resultado era el mismo. Al sentirme desesperado, usé getX() en lugar de getXCoord() y ¡toda la función funcionó mágicamente!

¿Cuál es la diferencia entre getX() y getXCoord() ?

¿Echaste un vistazo a cómo bitcoinj hace esto?
Para conocer la diferencia entre getX()y getXCoord(), puede consultar la fuente . La diferencia parece ser la "normalización", sea lo que sea.
Realmente debería decir en las primeras oraciones de su pregunta en qué idioma está escribiendo su código y qué bibliotecas está usando para hacer el ECDSA.

Respuestas (1)

Accidentalmente resolví mi problema. Cuando estaba escribiendo esta función, Eclipse me dijo que la función getX() (y getY()) está obsoleta. Entonces usé getXCoord(), porque pensé que el resultado era el mismo. Al sentirme desesperado, usé getX() en lugar de getXCoord() y ¡toda la función funcionó mágicamente!

¿Cuál es la diferencia entre getX() y getXCoord() ?

La última pregunta probablemente obtenga una buena respuesta en stackoverflow.