4

変更暗号化アルゴリズム (理論的には私が開発したもの) を実装しようとしていますが、要件の一部として、RSA キー ペアを生成してデータベースに保存し、後で暗号化プロセスの一部として取得できるようにする必要があります (暗号化されたメッセージと一緒に安全に送信できるように、セッション キーを暗号化するためにのみ使用されます)。

RSA キー ペアを生成する私の試みは機能しているように見えますが、コードが実行されるたびに新しいペアを提供するのではなく、同じ値を何度も生成し続けます。私は何を間違えましたか?また、これらの値がマシン自体に依存している場合 (したがって、同じ値が表示されている場合)、キー ペアの生成を提供された電子メール アドレスにリンクして、新しい電子メール アドレスが入力されるたびに異なる RSA キー ペアが出力されるようにする方法はありますか? ?

次のコードは、キーペアを生成するための私の試みです:

import java.security.*;
import java.security.*;
/**
 * @author Speedy gonzales
 */
public class test {

    public static void main(String[] args) throws NoSuchAlgorithmException,        NoSuchProviderException {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(1024);

        byte[] publicKey = keyGen.genKeyPair().getPublic().getEncoded();
        StringBuffer retString1 = new StringBuffer();
        retString1.append("[");

        for (int puk = 0; puk < publicKey.length; ++puk) {
            retString1.append(publicKey[puk]);
           // retString1.append(", ");
        }
        retString1 = retString1.delete(retString1.length()-2,retString1.length());
        retString1.append("]");
        System.out.println(retString1);

          byte[] privateKey = keyGen.genKeyPair().getPrivate().getEncoded();
        StringBuffer retString2 = new StringBuffer();
        retString2.append("[");

        for (int pri = 0; pri < privateKey.length; ++pri) {
            retString2.append(privateKey[pri]);
           // retString2.append(", ");
        }
        retString2 = retString2.delete(retString2.length()-2,retString2.length());
        retString2.append("]");
        System.out.println(retString2); 
    }
}

ありがとう

4

1 に答える 1

5

さて、あなたの最初の問題は次のとおりです。

keyGen.genKeyPair().getPublic().getEncoded();
keyGen.genKeyPair().getPrivate().getEncoded();

キーペアを保存していないため、一致しない公開キーと秘密キーを生成しています。javadocs によると、次のようにgenKeyPair()動作します。

これにより、呼び出されるたびに新しいキー ペアが生成されます。

次に、getEncoded() はキーをバイト配列として返すだけです。データベースがバイナリ値を保存できる場合は、そのまま保存してください。それ以外の場合は、何らかの方法で文字列に変換する方がうまくいくでしょう。たとえば、この巧妙な小さなトリックで base 64 エンコードすることができます (おそらく、あなたがしていることよりも信頼性が高いでしょう):

String keyAsString = new BigInteger(publicKey.getEncoded()).toString(64);

その後、次の方法で元のバイトを取得できます。

byte[] bytes = new BigInteger(keyAsString, 64).toByteArray();

あなたは、実行するたびに同じ値を取得していると言っています (そして、これを気にする前に、そうであることを確認してください)。その理由は 100% わかりません。アルゴリズム パラメーターにアクセスできるはずです (キーを別の型にキャストする必要がある場合があります)。それらを印刷して、それらが同じかどうかを確認してください。誰かがあなたの乱数発生器をチェックすると言いましたが、それも良い考えかもしれません。

于 2012-08-13T18:35:51.630 に答える