1

次のコードを使用してデータを暗号化しています

final SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(),
        "AES");
        final String myIV = "89ABCDEF01234567"; 
        Cipher c = null;
        try {
            try {
                c = Cipher.getInstance("AES/CBC/PKCS5Padding");
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(
                    myIV.getBytes()));


            byte[] encrypted = c.doFinal(msgfromEB.getBytes(),0,msgfromEB.getBytes().length);

そして、私はこのように解読しています

c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(
                    myIV.getBytes()));  

            byte[] decryptedBytes = c.doFinal(encrypted ,0,encrypted .length);

            System.out.println("decrypted string is"+new String(decryptedBytes));

正常に暗号化および復号化できます。

しかし、このような文字列に変換する場合

String myString = new String (encrypted);

そして再びこのようなバイト配列を取得します

byte[] newbytearray = myString.getBytes();

今、私は解読しようとしています

c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(
                    myIV.getBytes()));  

            byte[] decryptedBytes = c.doFinal(newbytearray ,0,newbytearray .length);

            System.out.println("decrypted string is"+new String(decryptedBytes));

今、エラーが発生しています

javax.crypto.IllegalBlockSizeException: 復号化で最後のブロックが不完全です

base64 変換を使用している場合は正常に動作していますが、長さが長くなるため、実行したくありません。これを克服するための他の選択肢はありますか?

4

1 に答える 1

1

別の方法は、文字列の代わりにバイトを転送することです。

を実行しているときはnew String(bytes)、プラットフォームのデフォルトのエンコーディングを使用して、バイトおよびバイトのシーケンスを文字として解釈するように求めています。問題は、すべてのバイトとバイトのシーケンスが有効な文字を表していないことです。したがって、アルゴリズムは不可逆です。これは、カラー画像を白黒に変換してから、白黒からカラーに変換しようとするようなものです。動作しません。したがって、base64が必要です。

追加の問題は、明示的なエンコーディングを指定しないことです。つまり、送信者と受信者がまったく同じプラットフォーム上にない場合、異なるエンコーディングを使用する可能性があります。

于 2012-05-17T05:39:53.653 に答える