Java 字节数组到字符串返回null

Java 字节数组到字符串返回null,java,string,encryption,byte,Java,String,Encryption,Byte,我正在写一个加密数据的程序。 我以这种方式创建了一个随机IV: byte[] ivBytes = new byte[16]; IvParameterSpec iv = new IvParameterSpec(ivBytes); 然后用它来做密码。 现在我想将这个IV存储在一个配置文件中,这样我就可以将它传输到解密函数,为此我需要将IV转换为字符串格式 我使用了byte curIV[]=cipher.getIV()获取IV并将其值打印到控制台,但当我将其转换为字符串时, 这样stringivst

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

byte[] ivBytes = new byte[16];
IvParameterSpec iv = new IvParameterSpec(ivBytes);
然后用它来做密码。 现在我想将这个IV存储在一个配置文件中,这样我就可以将它传输到解密函数,为此我需要将IV转换为字符串格式

我使用了
byte curIV[]=cipher.getIV()
获取IV并将其值打印到控制台,但当我将其转换为字符串时, 这样
stringivstring=新字符串(curIV),它不返回任何内容

byte[] ivBytes = new byte[16];
这将创建一个初始化为
0
的16字节数组
0x00
不是可打印字符(它是a),因此您可能无法看到打印的字符(打印时出现问题或查看打印结果时出现问题)

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

  • 按照@TmTron的建议,使用
    Arrays.toString()
    打印它(但如果希望在某些程序中无法正确看到打印的结果,则需要hexa viewer才能正确查看)
  • 以十六进制表示形式打印
  • 使用
您的代码工作正常 数组初始化为
16
,其中每个
16
字节都是
0

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

啊哈,
0
的字符是character
NUL

如果执行
新字符串(cipher.getIV())您将成为不包含任何信息的有效字符串值

如何解决 只需将大小为16的字符串转换为字节

byte[] ivBytes = "123456789abcdef".getBytes();
安全 计算机在计算方面很好,但在随机值方面很差。随机值很难估计。这使得随机值对于安全性非常重要。这使得16x0字节数组不是一个好主意

配置 最后,您需要将该信息存储到配置中。嗯,因为这个字符不是可读字符,所以很难将它保存到基于文本的配置中

注重安全性,不应允许16x0 IVs。因此,16x0 IVs不能存储到配置中

建议 改用这个:

String ivString = "blahblah"; // read from configuration if required
IvParameterSpec iv = new IvParameterSpec(ivString.getBytes());
ivString = new String(iv.getIV()); //write to configuration if required

嘿,什么是IV?你好,IV是一个初始化向量,它作为一个参数传递给密码。您可以在这里阅读更多内容-字节数组可能包含不可打印的字符-您可以使用-看到这一点,但您希望它有什么?我没有看到任何代码向字节添加任何值array@LenosVbytearray在数组中初始化为16x0。这是一个有效的静脉注射,但不是很安全!那么您建议将IV中的字节限制为字母数字/可打印字符值?这会不会将可能的组合从
2^128
减少到
95^16
~
2^112
?@JiriTousek是的,它确实减少了(95^16??)。安全性将得到提高,因为您必须使用
IV>0
。但它确实违反了真理的单一版本,即不清楚是谁定义了IV的值范围:规范还是Impl。在我看来,如果规范sais
0
是一个有效的、原子的、真实的值(如此好的值),那么我希望Impl更清楚:D。问题确实是IV的错误初始化,谢谢!你的建议很好。但是,关键是调用0x00任何类型的字符都没有意义。非文本不是文本。