3

以下のコードに記載されているように、メッセージを暗号化および復号化しようとしています。基本的に、公開鍵でメッセージを暗号化し、その暗号化されたメッセージをバイト配列から文字列に変換したいと思います。そして、この文字列を元のテキストに復号化します。これが両方の方法です。ここでは暗号化は正常に機能しますが、復号化は失敗します(エラーは「データはゼロで始まる必要があります」です)。暗号化されたバイト配列を文字列に変換するため、これが原因だと思います。

どうすればこれを解決できますか?(暗号化されたバイト配列を文字列として使用し、復号化に使用したい)他のアプローチはありますか(公開鍵と秘密鍵を使用)

public static String getEncryptedMessage(String publicKeyFilePath,

    String plainMessage) {
    byte[] encryptedBytes;
    try {
        Cipher cipher = Cipher.getInstance("RSA");
        byte[] publicKeyContentsAsByteArray = getBytesFromFile(publicKeyFilePath);
        PublicKey publicKey = getPublicKey(publicKeyContentsAsByteArray);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        encryptedBytes = cipher.doFinal(plainMessage.getBytes());
        return new String(encryptedBytes);
    } catch (Throwable t) {

    }

}
public static String getDecryptedMessage(
        String privateKeyFilePath, String encryptedMessage)
         {
    byte[] decryptedMessage;
    try {
        Cipher cipher = Cipher.getInstance("RSA");
        byte[] privateKeyContentsAsByteArray = getBytesFromFile(privateKeyFilePath);
        PrivateKey privateKey = getPrivateKey(privateKeyContentsAsByteArray);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        decryptedMessage = cipher.doFinal(encryptedMessage.getBytes());
        return new String(decryptedMessage);
    } catch (Throwable t) {


}
4

3 に答える 3

2

このページ(http://www.wikijava.org/wiki/Secret_Key_Cryptography_Tutorial)を見ると、バイトを文字列に変換するためにbase-64エンコードを実行する必要があります。次に、復号化するには、デコードしてから復号化します。

Base-64エンコーディングでは、バイトの最初の7ビットを使用して、たとえば、印刷可能または電子メールで送信可能なものを作成します。

アップデート:

私は間違いを犯しました。印刷可能なものとして使いやすくするために、64文字がエンコードされます。

于 2011-03-19T01:03:25.813 に答える
2

メッセージを暗号化から復号化までのバイト配列として扱ってみませんか?なぜ途中で文字列に変更するのですか?(私はそれが質問のように見えることを知っています、しかしそれは実際には答えです...)

于 2011-03-19T01:07:13.843 に答える
2

フォーマットされていないデータに対してRSAを直接使用すると、アプリケーションが適応的選択暗号文攻撃に対して脆弱になる可能性があります。詳細については、CRCPressから無料で入手できる『 Handbook of Applied Cryptography』の第8章、288〜289ページを参照してください。(暗号化に本当に興味がある場合は、バインドされたエディションを購入する価値があります。価格に見合った品質に驚かれることでしょう。)

この攻撃のため、RSAを統合するほとんどのプロトコルは、ランダムに生成されたセッションキーを暗号化するか、ランダムと区別できないはずの出力でハッシュ関数に署名するか、正しく解釈されない非常に注意深くフォーマットされたメッセージを使用するためにRSAを使用します。(詳細については、HACの注8.63を参照してください。)

于 2011-03-19T02:00:10.883 に答える