5

次のリンク を暗号化に使用していて、Stringsで試してみましたが、機能しました。ただし、私は画像を扱っているため、バイト配列で暗号化/復号化プロセスを実行する必要がありました。そこで、そのリンクのコードを次のように変更しました。

public class AESencrp {

    private static final String ALGO = "AES";
    private static final byte[] keyValue = 
    new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't',
'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };

    public static byte[] encrypt(byte[] Data) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.ENCRYPT_MODE, key);
        byte[] encVal = c.doFinal(Data);
        //String encryptedValue = new BASE64Encoder().encode(encVal);
        return encVal;
    }

    public static byte[] decrypt(byte[] encryptedData) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.DECRYPT_MODE, key);

        byte[] decValue = c.doFinal(encryptedData);
        return decValue;
    }

    private static Key generateKey() throws Exception {
        Key key = new SecretKeySpec(keyValue, ALGO);
        return key;
    }

チェッカークラスは次のとおりです。

public class Checker {

    public static void main(String[] args) throws Exception {

        byte[] array = new byte[]{127,-128,0};
        byte[] arrayEnc = AESencrp.encrypt(array);
        byte[] arrayDec = AESencrp.decrypt(arrayEnc);

        System.out.println("Plain Text : " + array);
        System.out.println("Encrypted Text : " + arrayEnc);
        System.out.println("Decrypted Text : " + arrayDec);
    }
}

ただし、私の出力は次のとおりです。

Plain Text : [B@1b10d42
Encrypted Text : [B@dd87b2
Decrypted Text : [B@1f7d134

したがって、復号化されたテキストはプレーンテキストと同じではありません。元のリンクの例を試し、Stringsで機能したことを知って、これを修正するにはどうすればよいですか?

4

3 に答える 3

8

ただし、私の出力は次のとおりです。

Plain Text : [B@1b10d42
Encrypted Text : [B@dd87b2
Decrypted Text : [B@1f7d134

toString()これは、バイト配列を呼び出した結果を出力しているためです。これは、参照IDの提案以外に役立つものを示すものではありません。

プレーンテキストデータを復号化されたデータバイトごとに比較するか(これはで実行できますArrays.equals(byte[], byte[]))、本当に内容を表示したい場合は、16進数またはbase64表現を印刷する必要があります。[Arrays.toString(byte\[\])][2]表現が得られますが 16進数の方が読みやすいでしょう。サードパーティのライブラリには16進フォーマットのクラスがたくさんあります。または、StackOverflowでメソッドを見つけることができます。

于 2012-05-12T10:32:02.243 に答える
8

表示されているのは、配列のtoString()メソッドの結果です。バイト配列の内容ではありません。java.util.Arrays.toString(array)配列の内容を表示するために使用します。

[Bはタイプ(バイトの配列)であり、1b10d42は配列のhashCodeです。

于 2012-05-12T10:33:11.637 に答える
2

手遅れだとは思いますが、答えを共有しています。ここでは、いくつかの変更を加えてコードを使用しました。以下のチェッカークラスを試して、バイト配列を暗号化および復号化します。

チェッカークラス:

public class Checker {

    public static void main(String[] args) throws Exception {

        byte[] array = "going to encrypt".getBytes();
        byte[] arrayEnc = AESencrp.encrypt(array);
        byte[] arrayDec = AESencrp.decrypt(arrayEnc);

        System.out.println("Plain Text : " + array);
        System.out.println("Encrypted Text : " + arrayEnc);
        System.out.println("Decrypted Text : " + new String(arrayDec));
    }
}
于 2014-01-14T18:30:27.903 に答える