現在、Java でデジタル署名アプレットを実装しています。ユーザーは、秘密鍵のキーストアとそれぞれの証明書を含むトークンを取得します。証明書と秘密鍵には異なるエイリアスがあります。
私がする必要があるのは、署名時にユーザーが選択した証明書に、ストア内の秘密鍵を呼び出す/一致させることです。Javaで秘密鍵をそれぞれの証明書に一致させるにはどうすればよいですか? 選択した証明書とキーの一致からエイリアスが派生する getkey(alias, password) のようなものが必要です。
現在、Java でデジタル署名アプレットを実装しています。ユーザーは、秘密鍵のキーストアとそれぞれの証明書を含むトークンを取得します。証明書と秘密鍵には異なるエイリアスがあります。
私がする必要があるのは、署名時にユーザーが選択した証明書に、ストア内の秘密鍵を呼び出す/一致させることです。Javaで秘密鍵をそれぞれの証明書に一致させるにはどうすればよいですか? 選択した証明書とキーの一致からエイリアスが派生する getkey(alias, password) のようなものが必要です。
ECCを使用している場合
Q = k * P
ここで、 Qは公開鍵であるため、秘密鍵kがわかっている場合は、基点Pと曲線もわかっているため、公開鍵を「簡単に」計算できます。
指数 e が固定されているよく知られた実装を使用する場合、RSA の問題も単純です。修正されていない場合、扱いにくい場合がありますが、それほど難しくはありません。
完全に別の問題は...指定された公開鍵を保存された証明書とどのように一致させるでしょうか? もう 1 つの質問は、なぜこのようなことをするのかということです。署名後に証明書情報を保持し、Java キー ストア内の対応する証明書にアクセスする必要があります。あいまいさは常に問題です。特に暗号通貨では、できるだけ明確にする必要があります。
私があなたのデザインを理解していれば、あなたのアイデアはあなたが進めるべきものではありませんが、Java はあなたが必要とするものをサポートする必要があります:
次のコードを使用します。
KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry)
ks.getEntry("privateKeyAlias", password);
Certificate certificateFromPrivateKey = pkEntry.getCertificate();
KeyStore.TrustedCertificateEntry certEntry = (KeyStore.TrustedCertificateEntry)ks.getEntry("certificateAlias, password);
Certificate certificateFromPublicKey = certEntry.getCertificate();
if (certificateFromPrivateKey.equals(certificateFromPublicKey)) ...
詳細については、javadocを参照してください。ただし、これは間違った方法で進めていると思います。
また、関連する API (使用していると思います) - http://docs.oracle.com/javase/6/docs/api/java/security/Signature.html