5

私の目的は、テキスト ファイル ( cipher text) を暗号化する Java プログラムを を使用して作成することAES algorithmです。次に、その暗号化されたファイル ( cipher text) を復号​​化してプレーン テキストを取得する別のプログラムを作成します。暗号化と復号化のプロセスに同じキー (同じキー、一度生成し、どこかに保存し、暗号化と復号化の両方のプログラムで使用) を使用したいと考えています。キーを生成し、同じプログラムで行ごとに暗号化と復号化を行うと、完全に機能します。そのための作業コードスニペットを次に示します。

        String strDataToEncrypt = new String();
        String strCipherText = new String();
        String strDecryptedText = new String();

        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128);
        SecretKey secretKey = keyGen.generateKey();

        Cipher aesCipher = Cipher.getInstance("AES");
        aesCipher.init(Cipher.ENCRYPT_MODE,secretKey);

        strDataToEncrypt = "any text input";
        byte[] byteDataToEncrypt = strDataToEncrypt.getBytes();
        byte[] byteCipherText = aesCipher.doFinal(byteDataToEncrypt); 
        strCipherText = new BASE64Encoder().encode(byteCipherText);
        System.out.println("cipher text: " +strCipherText);
        aesCipher.init(Cipher.DECRYPT_MODE,secretKey,aesCipher.getParameters());
        byte[] byteDecryptedText = aesCipher.doFinal(new BASE64Decoder().decodeBuffer(strCipherText));
        strDecryptedText = new String(byteDecryptedText);
        System.out.println("plain text again: " +strDecryptedText);

ただし、暗号化と復号化には 2 つの異なるプログラム (Java ファイル) が必要です。したがって、何らかの方法でキーを生成し、それをどこかに保存する必要があります。次に、暗号化プログラムと復号化プログラムの両方に同じキーを使用します。どうやってやるの?

EDIT_1

KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey secretKey = keyGen.generateKey();
byte[] encoded = secretKey.getEncoded(); 
System.out.println("key: "+encoded);// key: [B@52b2a2d8

上記のプログラムを使用して、エンコードされたキー値を取得できます。しかし、私の質問は、復号化プログラムでこの値を使用して SecretKey を生成する方法です。

4

2 に答える 2

18

SecretKeyあなたの質問を誤解していたらすみませんが、バイト配列でエンコードされた既存のキーからオブジェクトを再構築したいと考えています。

これは、javax.crypto.spec.SecretKeySpecのコンストラクターをそのまま使用することで簡単に実行できます。

byte[] encoded = //Key data

SecretKey secretKey = new SecretKeySpec(encoded, "AES");

SecretKeySpecのサブクラスであるためSecretKey、キャストは必要ありません。暗号化/解読アルゴリズムが変更された場合は、コンストラクターで使用される文字列リテラルAESを、将来使用することを決定したアルゴリズムに変更してください。

于 2013-12-15T05:34:23.783 に答える
1

配列の値を 16 進数で出力する1 つの方法を次に示します。byte[]

byte[] a = {-120, 17, 42,121};
for (byte b : a)
{
    System.out.printf("%2X",b);
}
System.out.println();
于 2013-11-27T04:39:53.097 に答える