我一直在使用one-time pad和Xor加密程序。我对这个主题进行了一些研究并寻找了我的问题的答案,但如果我错过了任何一个,请随时在评论中告诉我。基本上我一直在将输入文本文件转换为BufferReaders
,从那里我一直在为文档的每一行创建一个字符串。然后我使用n个字符的一次性填充并使用以下行:
for(int x=0;x<stringLine.length()-1;x++){
byte z= (byte) (stringLine.charAt(x)^oTP.get(y));
y
对于实际问题并不重要,但它会跟踪一次性缓冲区的整体索引,通过每次使用(使用相同的pad加密多个.txt文件)以及每一行。
我也使用类似的转换技术,但是从字节到它们的原始char表示:
for (int x=0; x<bit.size(); x++){
for (int q=0; q<bit.get(x).size(); q++){
outF.print((char) (bit.get(x).get(q)).byteValue());
bit
是ArrayList<ArrayList<Byte>>
,其中包含多个ArrayList<Byte>
,每个索引代表一行中每个字符的加密字节。 outF
只是用于编写加密文件的简单PrintWriter
。
这一直是我最后一个问题的背景:从byte
到char
,反之亦然,这是解决这个问题的最佳方法吗?如果我想要的输出是每个字节的ASCII表示,而不仅仅是数字表示,这是最佳和最有效的方法来实现它吗?
该程序似乎到目前为止工作,但我不确定它是否按照我的意愿工作。
提前感谢您提供任何帮助和/或建议。
答案 0 :(得分:3)
不,将char
投射到byte
不是一个好习惯。要将文本转换为字节字符串,您应该使用Charset
或其他API,它提供了众所周知的字符到字节编码。例如:
byte[] encoded = str.getBytes(StandardCharsets.US_ASCII);
同样适用于将字节解码为文本:
String str = new String(buf, StandardCharsets.US_ASCII);
但是,根据您的应用程序的描述,您根本不应该转换为文本。使用这样的东西:
static void encrypt(InputStream is, OneTimePad otp, OutputStream os) throws IOException {
long index = 0;
byte[] buffer = new byte[8192];
while (true) {
int n = is.read(buffer);
if (n < 0)
break;
for (int i = 0; i < n; ++i)
buffer[i] ^= otp.get(index++);
os.write(buffer, 0, n);
}
}