Преобразование шестнадцатеричной строки в кодировку x509 - PullRequest
0 голосов
/ 29 мая 2018

Я работаю с некоторым Android-кодом Java, который использует ключи ECDSA.Код компилируется и работает нормально, но имеет некоторые логические ошибки в процессе проверки.Я хочу попробовать использовать пару постоянных ключей (это, как известно, является действительным) для устранения неполадок в программе.

Используя онлайн-генератор , я получил открытый ключ EC в шестнадцатеричном виде,

1007 * 0x044fb7cebbb1f4a1e0412c8e0b6f2d675ebfee000c5e860a81ffd795b5743033dec0e114abfba3de8db8705fc8ed985c5550c66a6ee9fdd258d058a2ef749eba78

Как и действующий закрытый ключ для завершения пары,

0x0c84e7e707b31ecf0254e8cb3040513883d92d81e977ad4754a409a6ab18ee51

можно преобразоватьшестнадцатеричная строка в примитивном байтовом массиве, но этот байтовый массив представляется неверным.Я не могу понять, как преобразовать шестнадцатеричное представление моих ключей в представление X509, чтобы я мог сделать ключевой объект Java.

KeyFactory mFactory = KeyFactory.getInstance("EC");
X509EncodedKeySpec mPublicKey = new X509EncodedKeySpec(publicKeyBytes);
PublicKey publicKey = mFactory.generatePublic(mPublicKey);

Этот код приводит к:

java.security.spec.InvalidKeySpecException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: Error parsing public key

Я вполне уверен, что мое преобразование из шестнадцатеричной строки в байтовый массив работает, но я также включу этот метод для проверки работоспособности.

private static byte[] hexStringToByteArray(String s) throws IllegalArgumentException {
    int len = s.length();
    if (len % 2 == 1) {
        throw new IllegalArgumentException("Hex string must have even number of characters");
    }
    byte[] data = new byte[len / 2]; // Allocate 1 byte per 2 hex characters
    for (int i = 0; i < len; i += 2) {
        // Convert each character into a integer (base-16), then bit-shift into place
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

Конечная цель - иметь постоянный действительный PublicKey/ PrivateKey объект для тестирования.Любой совет о том, как генерировать эти объекты, будет принята с благодарностью.

...