密文和其他数据的分隔符

Separator for ciphertext and other data

如何在文件中存储密文和 IV(分组密码操作模式,例如 AES-GCM)?如果我用一个对应于“:”字符的字节将它们分开,那么在读取它时我必须将整个字节数组转换为字符串,然后将字符串拆分为由“:”分隔的块,然后再次将块转换为字节阵列。有更简单的方法吗?也许我们确定一个字节不会出现在 AES 加密和初始化向量中?

当前代码(在 Java 中)是后续代码,但我不确定这是否是执行我所要求的最佳方式,即使它有效,因为我不知道是否表示“:”的字节可以出现在IV或密文中。

FileInputStream keyfis = new FileInputStream("test");
byte[] byteRead = new byte[keyfis.available()];
keyfis.read(byteRead);
keyfis.close();
String textRead=new String(byteRead); 

String[] parts = textRead.split(":");
byte[] encrAESkey=parts[0].getBytes();
byte[] myIV=parts[1].getBytes();
byte[] myencrtext=parts[2].getBytes();

传统上 IV 是前置的,因为它需要恰好是一个块长度 (16 bytes),并且分组密码模式(ECB 除外)都需要 IV(或随机数 + 计数器)。然后你的解密代码只是从密文输入中提取第一个16 bytes作为IV,对剩下的n - 16 bytes进行解密操作。

然而,您应该使用编码方案来保护序列化到文件的密文,因为如果您 write/read 原始二进制字节,您很可能会遇到问题。十六进制或 Base64 编码是此操作的标准。

从您的代码中还可以看出,您将 AES 密钥与 IV 和密文一起存储。虽然 IV 可以与密文一起不受保护地存储,但 密钥不能 如果不有效地删除加密提供的任何保护。