3

暗号化されたデータを保持するために使用されるバイト配列の最後のブロックとして、データの暗号化に使用される 16 ビット IV を追加しようとしています。暗号化/復号化の呼び出しごとに完全にランダムな IV を使用できるように、明らかに復号化の部分でこれを行いたいと考えています。テスト目的で次のものがあります。

public static String encrypt(String plainText) throws Exception {
   encryptionKey = new SecretKeySpec(eKey.getBytes("UTF-8"), "AES");

   cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
   cipher.init(Cipher.ENCRYPT_MODE, encryptionKey, initialisationVector);

   byte[] eDataAndIv = appendIvToEncryptedData(cipher.doFinal(plainText.getBytes("UTF-8")), initialisationVector.getIV());
   return bytesToHexString(eDataAndIv);
}

public static String decrypt(String hexEncoded) throws Exception {
   byte[] decodedBytes = hexStringToBytes(hexEncoded);

   ArrayList<byte[]> al = retreiveIvFromByteArray(decodedBytes);
   byte[] eData = al.get(0);
   byte[] iv = al.get(1);

   cipher.init(Cipher.DECRYPT_MODE, encryptionKey, new IvParameterSpec(iv));
   return reconstructedPlainText(cipher.doFinal(eData));
}

private static byte[] appendIvToEncryptedData(byte[] eData, byte[] iv) throws Exception {
   ByteArrayOutputStream os = new ByteArrayOutputStream();
   os.write(eData);
   os.write(iv);
   return os.toByteArray();
}

private static ArrayList<byte[]> retreiveIvFromByteArray(byte[] dataPlusIv) {
   ByteArrayOutputStream iv = new ByteArrayOutputStream(16);
   ByteArrayOutputStream eData = new ByteArrayOutputStream();

   iv.write(dataPlusIv, dataPlusIv.length - 16, 16);
   eData.write(dataPlusIv, 0, dataPlusIv.length - 16);

   ArrayList<byte[]> al = new ArrayList<byte[]>();
   al.add(eData.toByteArray());
   al.add(iv.toByteArray());

   return al;
}

暗号化の手順のリストは次のとおりです。

  1. 作成 IV
  2. データを暗号化する
  3. 暗号化されたデータのバイト配列の末尾に IV を追加
  4. 16 進数を使用してバイト配列をエンコードする

復号化の手順のリストは次のとおりです。

  1. 16進数をデコード
  2. 暗号化されたデータと IV をバイト配列から切り離す
  3. IV を使用してデータを復号化する

私が持っているものはうまくいきますが、知りたいのは、これを行う「より良い」方法はありますか? つまり、Cipher*型を使用してこれを行うためのセットまたはより簡単な方法はありますか? 私はそれらを見つけることができません。

ありがとう。

4

1 に答える 1