gpt4 book ai didi

java - 如何使用 XOR 在 Java 中开发​OTPInputStream​

转载 作者:行者123 更新时间:2023-12-02 01:04:05 26 4
gpt4 key购买 nike

我想用Java开发一个​OTPInputStream ​,它扩展​InputStream​并获取另一个 key 数据输入流并提供一个加密/解密输入流的流.我需要开发一个测试程序来展示使用XOR和任意数据的OTPInputStream的使用。

我尝试使用这段代码,但我遇到了问题

java.io.FileInputStream cannot be cast to java.lang.CharSequence

我应该在这里做什么?

public class Bitwise_Encryption {

static String file = "" ;
static String key = "VFGHTrbg";

private static int[] encrypt(FileInputStream file, String key) {
int[] output = new int[((CharSequence) file).length()];
for(int i = 0; i < ((CharSequence) file).length(); i++) {
int o = (Integer.valueOf(((CharSequence) file).charAt(i)) ^ Integer.valueOf(key.charAt(i % (key.length() - 1)))) + '0';
output[i] = o;
}
return output;
}


private static String decrypt(int[] input, String key) {
String output = "";
for(int i = 0; i < input.length; i++) {
output += (char) ((input[i] - 48) ^ (int) key.charAt(i % (key.length() - 1)));
}
return output;
}


public static void main(String args[]) throws FileNotFoundException {
FileInputStream file = new FileInputStream("directory");

encrypt(file,key);
//decrypt();
int[] encrypted = encrypt(file,key);

System.out.println("Encrypted Data is :");
for(int i = 0; i < encrypted.length; i++)
System.out.printf("%d,", encrypted[i]);

System.out.println("");
System.out.println("---------------------------------------------------");
System.out.println("Decrypted Data is :");
System.out.println(decrypt(encrypted,key));

}
}

最佳答案

认为您想要的只是 file.read()file.getChannel().size() 一次读取一个字符并获取大小文件

尝试这样的事情:

private static int[] encrypt(FileInputStream file, String key) {
int fileSize = file.getChannel().size();
int[] output = new int[fileSize];
for(int i = 0; i < output.length; i++) {
char char1 = (char) file.read();
int o = (char1 ^ Integer.valueOf(key.charAt(i % (key.length() - 1)))) + '0';
output[i] = o;
}
return output;
}

必须进行一些错误处理,因为如果到达文件末尾,file.read() 将返回 -1,并且正如指出的那样,一次读取一个字节是大量 IO 操作,并且会降低性能。您可以将数据保存在缓冲区中并以另一种方式读取它,如下所示:

private static int[] encrypt(FileInputStream file, String key) {
int fileSize = file.getChannel().size();
int[] output = new int[fileSize];

int read = 0;
int offset = 0;
byte[] buffer = new byte[1024];
while((read = file.read(buffer)) > 0) {
for(int i = 0; i < read; i++) {
char char1 = (char) buffer[i];
int o = (char1 ^ Integer.valueOf(key.charAt(i % (key.length() - 1)))) + '0';
output[i + offset] = o;
}
offset += read;
}
return output;
}

这将从文件中一次读取 1024 个字节并将其存储在缓冲区中,然后您可以循环遍历缓冲区来执行逻辑。偏移值用于存储当前点在输出中的位置。此外,您还必须确保 i + offset 不超过数组大小。

更新

使用它之后;我决定切换到 Base64 编码/解码以删除不可打印的字符:

  private static String encrypt(InputStream file, String key) throws Exception {
int read = 0;
byte[] buffer = new byte[1024];
try(ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
while((read = file.read(buffer)) > 0) {
baos.write(buffer, 0, read);
}
return base64Encode(xorWithKey(baos.toByteArray(), key.getBytes()));
}
}

private static String decrypt(String input, String key) {
byte[] decoded = base64Decode(input);
return new String(xorWithKey(decoded, key.getBytes()));
}

private static byte[] xorWithKey(byte[] a, byte[] key) {
byte[] out = new byte[a.length];
for (int i = 0; i < a.length; i++) {
out[i] = (byte) (a[i] ^ key[i%key.length]);
}
return out;
}

private static byte[] base64Decode(String s) {
return Base64.getDecoder().decode(s.trim());
}

private static String base64Encode(byte[] bytes) {
return Base64.getEncoder().encodeToString(bytes);
}

此方法更简洁,不需要知道 InputStream 的大小或执行任何字符转换。它将您的 InputStream 读取到 OutputStream 中以进行 Base64 编码以及删除不可打印的字符。

我已经对此进行了测试,它适用于加密和解密。

我从这个答案中得到了这个想法:

XOR operation with two strings in java

关于java - 如何使用 XOR 在 Java 中开发​OTPInputStream​,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60276486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com