2

このコードを使用して文字列を2回暗号化しようとしているこの問題があります:

KeySpec keySpec = new X509EncodedKeySpec(new BigInteger(publicKey, 36).toByteArray());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Key decodedPublicKey = keyFactory.generatePublic(keySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, decodedPublicKey);     
byte a1[] = cipher.doFinal(z.getBytes());

KeySpec keySpec2 = new X509EncodedKeySpec(new BigInteger(publicKey, 36).toByteArray());
KeyFactory keyFactory2 = KeyFactory.getInstance("RSA");
Key decodedPublicKey2 = keyFactory2.generatePublic(keySpec2);
Cipher cipher2 = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher2.init(Cipher.ENCRYPT_MODE, decodedPublicKey2);
byte a2[] = cipher.doFinal(z.getBytes());

どちらも同じpublicKeyと同じ入力を使用しますzが、2 つのコード ブロックのそれぞれが異なるバイト配列を作成します ( a1!=a2) 等しくしたいのですが、その方法がわかりません (調べようとしましたが、答えはまだです)。

誰かが私を助けてくれれば本当に感謝しています。

ありがとう

編集 :

暗号化するデータは非常に小さいため (単なるパスワード)、AES 暗号化は使用しませんでした。

クライアントとサーバーがあり、誰かがクライアントに接続したときに、彼のパスワードを確認したい (彼の暗号化されたパスワードは Android SD カードのファイルにある) ので、実際のパスワードとユーザーが入力したパスワードを比較したいログインページ

クライアントに秘密鍵がないため、既にデバイス上にある暗号化されたパスを復号化できません。そのため、暗号化されたパスワードを比較しようとしました (これは、同じではないことがわかっているものと同じだと思いました) )

多分あなたは私が何ができるか考えていますか?公開鍵しか持っていないパスワードと暗号化されたパスワードを比較する方法

ありがとう

4

2 に答える 2

2

PKCS#1 パディングは、同一の平文が同じ暗号文に暗号化されないようにするために使用されます。PKCS#1 は、wikipedia で説明されている最適な非対称暗号化パディングの形式です。同じ平文に対して異なる暗号文を持つことは良いことです。

良い暗号を台無しにしたい場合は、「PCKS1Padding」の代わりに「NoPadding」を指定できます。これの欠点は、パディングがメッセージの長さの指定も処理することです。"NoPadding" を使用すると、暗号化テキストを復号化するときに、メッセージの前にゼロ バイトがたくさん付いていることがわかります。

また、これは RSA でメッセージを暗号化する方法ではないことにもコメントします。RSA は短いデータにのみ適しています。たとえば、1024 ビットの RSA 暗号は 117 バイトしか暗号化できません。RSA でメッセージを暗号化する正しい方法は、ワンタイム AES 暗号キーを生成し、RSA で AES 暗号キーを暗号化し、AES でメッセージを暗号化することです。これにより、任意の長さのメッセージを安全に送信できます。

于 2012-11-14T00:07:39.113 に答える
1

この質問に対するトップの回答をご覧になることをお勧めします。短いバージョンは、公開鍵で暗号化するたびに、結果の暗号化されたデータが異なるということです. 秘密鍵で暗号化すると、毎回同じ結果が得られます。

于 2012-11-13T23:40:49.237 に答える