我正在编写一个程序来加密数据。 我用这种方式创建了一个随机IV:
byte[] ivBytes = new byte[16];
IvParameterSpec iv = new IvParameterSpec(ivBytes);
并将其用于密码。 现在我想将这个IV存储在配置文件中,以便将其传输到解密函数,为此我需要将IV转换为字符串格式。
我使用byte curIV[] = cipher.getIV();
来获取IV并将其打印到控制台,但是当我将其转换为字符串时,
这样String ivString = new String(curIV);
,它不会返回任何内容。
答案 0 :(得分:2)
byte[] ivBytes = new byte[16];
这将创建一个16字节的数组,初始化为0
。 0x00
不是可打印的字符(它是control character),因此您可能无法看到它打印(打印时出现问题或查看打印结果的问题)。
根据您的需要,您可能希望:
Arrays.toString()
进行打印(但是在某些程序中不能正确看到打印结果,您需要使用hexa查看器才能正确查看)答案 1 :(得分:2)
数组初始化为16
,其中16
个字节均为0
。
现在,让我们看看ascii表,找到0
的正确字符。
啊哈,0
的字符是字符NUL
。
如果您执行new String(cipher.getIV());
,则会成为不包含任何信息的有效字符串值。
只需将大小为16的字符串转换为字节。
byte[] ivBytes = "123456789abcdef".getBytes();
计算机计算良好但随机值不好。随机值很难估计。这使随机值对安全性很重要。这使得16x0字节数组成为一个坏主意。
最后,您需要将该信息存储到配置中。嗯,因为这个字符不是可读字符,所以很难将其保存到基于文本的配置中。
注重安全性,您不应该允许16x0 IV。因此,16x0 IV必须无法存储到配置中。
请改用:
String ivString = "blahblah"; // read from configuration if required
IvParameterSpec iv = new IvParameterSpec(ivString.getBytes());
ivString = new String(iv.getIV()); //write to configuration if required