出于学术目的,我正在使用java和java加密编写一个小型基于加密的应用程序。但是,通常我使用C或C++(在这方面非常容易),所以如果这是一个显而易见的问题,我表示歉意。我的问题在于我想要解密信息时遇到了困难。问题实际上并不是与使用加密相关(或其他什么东西),而是正确检索我的初始化向量。目前,我有一个明文文件,格式为新行/冒号分隔(是的,这很不安全,但这是一种学术练习——显然,在现实世界中,密钥文件不会以明文形式存在)。
password:salt:<IV>
其中<IV>
为初始化向量。我决定直接以二进制格式写出初始化向量,但是这时我的问题开始了。我能够正确地写出数据(通过hexdump验证),但似乎并没有被正确地读回程序中。例如,考虑一个计数器值
00 18 C0 98 (decimal: 1622168)
这个值正确地被写出。但是,当我尝试读取它时,这个值完全错误。我怀疑这是由于BufferedReader.readLine()
引起的。我只是读取这一行并将其写入另一个文件,然后这个值就会改变为
BD EF BF BD (decimal: who cares, very wrong...)
但是ASCII值(密码和盐)保持不变,冒号分隔符也保留。初始化向量二进制则完全被混淆。
我试图做的事情是:
BufferedReader reader = new BufferedReader(new FileReader(f));
String last = null;
String parse = null;
while((last = reader.readLine()) != null) {
parse = last;
}
reader.close();
int offset = // A few indexOf() statements to find the positon;
byte[] iv = parse.substring(offset).getBytes();
目前,iv.length > 16
(使用128位AES)已经是错误的。因此,我不确定如何实现ASCII二进制混合(也许一开始就是不良设计)。我的一个问题是在Java中char != byte
,如果要读取整行(无论如何使用readLine()
),我不能简单地将所有内容读取为字节。但是否有任何方法可以解决这个问题?因为我想要整行,但我还想从该行中提取二进制数据。
另外,我也尝试过直接转换。
for(int i = 0 ; i < 16 ; ++i)
iv[i] = (byte)parse.charAt(offset + i);
但这也不起作用。另一段代码(基于getBytes()
)在我的个人计算机上使用的是java version "1.6.0_37"
,但部署环境使用的是java version "1.6.0_33"
,因此失败了。感谢任何帮助。