有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java BufferedReader。readLine()将二进制文件撕碎

出于学术目的,我正在使用java和java crypto开发一个基于加密的小型应用程序。也就是说,我通常在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值(密码和salt)和冒号分隔符保持不变。初始化向量二进制是所有被置乱的向量

我想做的是:

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二进制混合(也许从一开始就是糟糕的设计)。我的部分问题是char != byte在Java中,如果我想读一整行(无论如何都要使用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",这是失败的。感谢您的帮助


共 (0) 个答案