3

次のコードを使用していますが、テキストを適切に復号化していません。出力として何が得られますか

暗号化: %öNo2F?¢¶SHºûÅ“?¾

平文: こんにちは × am originalÎl

public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub

    // Dernier exemple CTR mode
    // Clé 16 bits
    byte[] keyBytes = new byte[] { (byte) 0x36, (byte) 0xf1, (byte) 0x83,
            (byte) 0x57, (byte) 0xbe, (byte) 0x4d, (byte) 0xbd,
            (byte) 0x77, (byte) 0xf0, (byte) 0x50, (byte) 0x51,
            (byte) 0x5c, 0x73, (byte) 0xfc, (byte) 0xf9, (byte) 0xf2 };
    // IV 16 bits (préfixe du cipherText)
    byte[] ivBytes = new byte[] { (byte) 0x69, (byte) 0xdd, (byte) 0xa8,
            (byte) 0x45, (byte) 0x5c, (byte) 0x7d, (byte) 0xd4,
            (byte) 0x25, (byte) 0x4b, (byte) 0xf3, (byte) 0x53,
            (byte) 0xb7, (byte) 0x73, (byte) 0x30, (byte) 0x4e, (byte) 0xec };

    // Initialisation
    SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);

    // Mode
    Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");

    String originalText = "hello i am original";
    // ///////////////////////////////ENCRYPTING
    cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
    byte[] ciphered = cipher.doFinal(originalText.getBytes());
    String cipherText = new String(ciphered,"UTF-8");
    System.out.println("ciphered: " + cipherText);
    // ///////////////////////////////DECRYPTING
    cipher = Cipher.getInstance("AES/CTR/NoPadding");

    cipher.**init(Cipher.DECRYPT_MODE**, key, ivSpec);
    byte[] plain = **cipher.doFinal(ciphered);**
    originalText = new String(plain,"UTF-8");
    System.out.println("plaintext: " + originalText);
}

私は何が間違っているのか理解できませんでした.どんな助けでも大歓迎です. また、今回は一部のデータを暗号化するための適切な方法です。4 バイトの市の暗証番号を暗号化しようとしています。少し早いですがお礼を

////

これらの変更を行いましたが、正常に動作していますが、 cipherText.getByte() を cipher.init() 関数に渡すとどうなりますか。お気に入り

byte[] plain = cipher.doFinal(cipherText.getByte("UTF-8"));

n' ご協力ありがとうございます。

4

2 に答える 2

5

復号化するには、で暗号を初期化する必要がありますDECRYPT_MODE。また、byte[] から String への変換も正しくありません (他の回答を参照)。

于 2013-01-15T13:49:47.533 に答える
2

暗号化されたバイトをそのような文字列に変換することはできません。「バイト」と「文字」はまったく別のものです。バイトを文字列に変換し、暗号化と復号化の間で再び元に戻すコードを削除すると、コードが機能するはずです(他の回答で指摘されているように、2番目のステップではDECRYPT_MODE.

プラットフォームの文字エンコーディングを使用してバイトと文字/文字列を変換する場合は注意が必要です。これはプラットフォームによって異なる可能性があるためです。これにより、データをクロス プラットフォームで移動する必要がある場合に問題が発生する可能性があります。デフォルトのプラットフォーム エンコーディングが、使用しているテキスト内のすべての文字をサポートしていない場合にも、損失が発生する可能性があります。

于 2013-01-15T13:47:13.567 に答える