Java 如何使用XOR开发a​;OTPInputStream​;在爪哇

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

我想开发一个​<代码>OTPInputStream​在Java中,它扩展了​<代码>输入流​并获取另一个密钥数据输入流,并提供一个加密/解密输入流​<代码>OTPInputStream​

我尝试了这个代码,但我有一个问题,那就是

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
我得到加密的所有输出为零