字节数组到字符串返回null

时间:2018-05-12 07:48:21

标签: java string encryption byte

我正在编写一个程序来加密数据。 我用这种方式创建了一个随机IV:

byte[] ivBytes = new byte[16];
IvParameterSpec iv = new IvParameterSpec(ivBytes);

并将其用于密码。 现在我想将这个IV存储在配置文件中,以便将其传输到解密函数,为此我需要将IV转换为字符串格式。

我使用byte curIV[] = cipher.getIV();来获取IV并将其打印到控制台,但是当我将其转换为字符串时,  这样String ivString = new String(curIV);,它不会返回任何内容。

2 个答案:

答案 0 :(得分:2)

byte[] ivBytes = new byte[16];

这将创建一个16字节的数组,初始化为00x00不是可打印的字符(它是control character),因此您可能无法看到它打印(打印时出现问题或查看打印结果的问题)。

根据您的需要,您可能希望:

  • 按照@TmTron的建议使用Arrays.toString()进行打印(但是在某些程序中不能正确看到打印结果,您需要使用hexa查看器才能正确查看)
  • 以十六进制表示形式打印
  • 使用Base64
  • 对其进行编码

答案 1 :(得分:2)

您的代码正常运行

数组初始化为16,其中16个字节均为0

现在,让我们看看ascii表,找到0的正确字符。

enter image description here

啊哈,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