3

ECDSA アルゴリズムを使用してメッセージに署名し、Java で受信者に送信する必要があります。次に、受信者は送信者の署名を確認する必要があります。

したがって、このために、受信者は送信者の公開鍵を持っていますがjava.security.PublicKey、次のコマンドでバイト配列に変換した後、バイト配列形式になります。

byte[] byteArrayPublicKey = publickey.getEncoded();

ECDSA アルゴリズムの公開鍵の形式 (バイト配列に変換する前) は次のとおりです。

公開鍵:

X: 8a83c389e7bb817c17bf2db4ed71055f18342b630221b2a3a1ca752502dc2e21

Y: 3eaf48c9ab1700fe0966a0cde196b85af66bb8f0bacef711c9dca2368f9d8470

ただし、問題は、このバイト配列を使用可能な形式に変換してjava.security.PublicKey、受信者による署名を検証することです。

一般に、署名をバイト配列に変換せずに検証する解決策はありますか? 言い換えれば、問題は送信者の公開鍵によって署名を検証することです。任意の方法を使用します。

4

1 に答える 1

3

ただし、問題は、このバイト配列を使用可能な形式に変換して、受信者が 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;
}

githubに EC 署名/検証用の完全な実行コードがあります。理解を深めるためにご覧ください。

于 2015-06-19T21:04:59.240 に答える