Java 如何使用XOR开发a;OTPInputStream;在爪哇
我想开发一个<代码>OTPInputStream在Java中,它扩展了<代码>输入流并获取另一个密钥数据输入流,并提供一个加密/解密输入流<代码>OTPInputStream使用XOR和任意数据的代码> 我尝试了这个代码,但我有一个问题,那就是Java 如何使用XOR开发a;OTPInputStream;在爪哇,java,bit-manipulation,fileinputstream,Java,Bit Manipulation,Fileinputstream,我想开发一个OTPInputStream在Java中,它扩展了输入流并获取另一个密钥数据输入流,并提供一个加密/解密输入流OTPInputStream 我尝试了这个代码,但我有一个问题,那就是 java.io.FileInputStream不能强制转换为java.lang.CharSequence 我在这里该怎么办 public class Bitwise_Encryption { static String file = "" ; static String ke
java.io.FileInputStream
不能强制转换为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));
}
}
公共类按位加密{
静态字符串文件=”;
静态字符串键=“VFGHTrbg”;
私有静态int[]加密(FileInputStream文件,字符串密钥){
int[]输出=新的int[((CharSequence)文件).length();
对于(int i=0;i<((CharSequence)文件).length();i++){
int o=(Integer.valueOf((CharSequence)file.charAt(i))^Integer.valueOf(key.charAt(i%(key.length()-1)))+'0';
输出[i]=o;
}
返回输出;
}
私有静态字符串解密(int[]输入,字符串密钥){
字符串输出=”;
for(int i=0;i
想想你想要的只是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;
}
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;
}
此方法更简洁,不需要知道InputStream
的大小,也不需要进行任何字符转换。它将您的InputStream
读入一个OutputStream,以进行Base64编码,同时删除不可打印的字符
我已经测试过了,它对加密和解密都有效
我从这个答案中得到了这个想法:
想想你想要的只是
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;
}
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;
}
此方法更简洁,不需要知道InputStream
的大小,也不需要进行任何字符转换。它将您的InputStream
读入一个OutputStream,以进行Base64编码,同时删除不可打印的字符
我已经测试过了,它对加密和解密都有效
我从这个答案中得到了这个想法:
(CharSequence)文件
您希望它做什么?(CharSequence)文件
您希望它做什么?在不影响您回答的情况下,指出一次读取一个字节对于磁盘IO来说是非常昂贵的。最好是读取字节块或使用缓冲读取器。我对输出的解密数据有问题吗?init,@Hala您正在加密数据,结果必然包含不可打印的字符,这没什么问题。@Hala抱歉编辑了。这是您的文件输入流文件
。我只是键入并将我所有的FileInputStream
命名为fis
我得到加密的所有输出为零。在不影响您回答的情况下,指出一次读取一个字节对于磁盘IO来说是非常昂贵的。最好是读取字节块或使用缓冲读取器。我对输出的解密数据有问题吗?init,@Hala您正在加密数据,结果必然包含不可打印的字符,这没什么问题。@Hala抱歉编辑了。这是您的文件输入流文件
。我只是键入并将我所有的FileInputStream
命名为fis
我得到加密的所有输出为零