2015-06-19 6 views
1

Мне нужно использовать алгоритм ECDSA, чтобы подписать сообщение и отправить его получателю в java. Затем приемник должен проверить подпись отправителя.Преобразование байтового массива в publickey ECDSA

Таким образом, для этого, ресивер имеет открытый ключ отправителя, но в формате массива байтов после преобразования java.security.PublicKey в массив байтов с помощью команды ниже:

byte[] byteArrayPublicKey = publickey.getEncoded(); 

Формат открытого ключа в алгоритме ECDSA (до его преобразования байтовый массив) выглядит следующим образом:

Public Key:

X: 8a83c389e7bb817c17bf2db4ed71055f18342b630221b2a3a1ca752502dc2e21 

Y: 3eaf48c9ab1700fe0966a0cde196b85af66bb8f0bacef711c9dca2368f9d8470 

Но, проблема в том, чтобы преобразовать этот массив байтов в удобном формате для V подтвердите подписью java.security.PublicKey приемником.

В общем, есть ли какое-либо решение для проверки подписи без преобразования его в массив байтов? Другими словами, проблема заключается в проверке подписи открытым ключом отправителя с использованием любого метода.

+0

Если у вас есть результат 'PublicKey.getEncoded()', который является ** не ** просто общедоступной точкой X и Y; он содержит также AlgId, включая параметры. Java вызывает это кодирование «X509», и вы можете напрямую передать его в «KeyFactory.getInstance» («EC»). GeneratePublic() '. Если у вас на самом деле есть только отдельные координаты точки ** и кривая **, см. Http://stackoverflow.com/questions/22646792/how-does-one-convert-a-public-ec-code-point-and-curve -name-in-a-publickey и http://stackoverflow.com/questions/30445997/loading-raw-64-byte-long-ecdsa-public-key-in-java. –

ответ

2

Но проблема состоит в том, чтобы преобразовать этот массив байтов в полезный формат, чтобы проверить подпись, которая является java.security.PublicKey получателем.

Вы можете решить эту проблему, как таким образом:

public static ECPublicKey genEcPubKey() throws Exception { 
    KeyFactory factory = KeyFactory.getInstance("ECDSA", "BC"); 
    java.security.PublicKey ecPublicKey = (ECPublicKey) factory 
      .generatePublic(new X509EncodedKeySpec(Helper 
        .toByte(ecRemotePubKey))); // Helper.toByte(ecRemotePubKey)) is java.security.PublicKey#getEncoded() 
    return (ECPublicKey) ecPublicKey; 
} 

Обратите внимание, что вам нужно BouncyCastle поставщика, чтобы сделать это.

Но остается вопрос, как вы создаете закрытый ключ?

public KeyPair ecKeyPairGenerator(String curveName) throws Exception { 
    KeyPair keyPair; 
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
      "ECDSA", "BC"); 
    ECGenParameterSpec ecGenParameterSpec = new ECGenParameterSpec(
      curveName); 
    keyPairGenerator.initialize(ecGenParameterSpec, new SecureRandom()); 
    keyPair = keyPairGenerator.generateKeyPair(); 
    java.security.PublicKey ecPublicKey = (ECPublicKey) keyPair.getPublic(); 
    System.out.println("JAVA EC PublicKey: " 
      + Helper.toHex(ecPublicKey.getEncoded())); 

    // write private key into a file. Just for testing purpose 
    FileOutputStream fileOutputStream = new FileOutputStream(
      "ECPrivateKey.key"); 
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(
      fileOutputStream); 
    objectOutputStream.writeObject(keyPair.getPrivate()); 
    objectOutputStream.close(); 
    return keyPair; 
} 

У меня есть полный ходовой код для знака EC/проверить в github. Вы можете взглянуть на лучшее понимание.

+0

Rakeb void, большое вам спасибо за ваш полезный и отличный ответ. нужно добавить еще одну вещь, которую я объяснил здесь в другом вопросе: http://stackoverflow.com/questions/30956867/signature-verification-is-always-false-java?noredirect1_comment49946507_30956867 вопрос соблюдается ASN.1 подписи и проверки. – sas

+0

Если это тот ответ, который вы ищете, попробуйте его принять. Ty. –

+0

Я пытаюсь проголосовать за это, чтобы принять этот ответ, но на самом деле для этого требуется минимум 15 репутации. Моя репутация - 7. Я пытаюсь сделать это, как только смогу проголосовать. – sas

 Смежные вопросы

  • Нет связанных вопросов^_^