java-将IV添加到加密的字节数组中作为最终块

我试图将用于加密数据的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;
}

加密步骤列表为:

>创建IV
>加密数据
>将IV附加到加密数据字节数组的末尾
>使用十六进制编码字节数组

解密步骤列表为:

>解码十六进制
>从字节数组破坏加密的数据和IV
>使用IV解密数据

我所拥有的有效,但是我想我想知道的是,是否有一种“更好”的方式来做到这一点?我的意思是,是否存在使用Cipher *类型执行此操作的一组或更简单的方法?我找不到他们.

谢谢.

解决方法:

好吧,您当然可以避免冗长的retreiveIvFromByteArray代码:

public static String decrypt(String hexEncoded) throws Exception {
   byte[] decodedBytes = hexStringToBytes(hexEncoded);
   int ivIndex = decodedBytes.length - 16;
   cipher.init(Cipher.DECRYPT_MODE, encryptionKey,
       new IvParameterSpec(decodedBytes, ivIndex, 16));
   return reconstructedPlainText(cipher.doFinal(decodedBytes, 0, ivIndex));
}

那是您在想的事情吗?

同样,对于appendIvToEncryptedData,您可以只创建一个适当长度的新字节数组,然后使用System.arraycopy两次.

上一篇:用C#加密并在Flex中解密


下一篇:DB proxy, mysql proxy