擬似乱数を使用してXORでテキストを暗号化し、暗号化されたテキストをファイルに書き込もうとしています。次に、ファイルを再度読み込み、ユーザーが正しいキーを入力すると、テキストを復号化します。 しかし、私が得るのは?????
です。私は間違って何をしていますか?Javaフィルタストリームを使用してXORで文字列を暗号化する
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Random;
import java.util.Scanner;
public class MainTest
{
public static void main(String[] args)
{
long seed = 754; // key
Random random = new Random(seed);
String message = "hello";
try
{
OutputStream os = new FileOutputStream("test.txt");
OutputStream bos = new BufferedOutputStream(os);
EncryptOutputStream eos = new EncryptOutputStream(bos);
for(int i = 0; i < message.length(); i++)
{
int z = random.nextInt();
eos.write(message.charAt(i), z);
}
eos.close();
InputStream is = new FileInputStream("test.txt");
InputStream bis = new BufferedInputStream(is);
DecryptInputStream dis = new DecryptInputStream(bis);
Scanner scanner = new Scanner(System.in);
System.out.print("Enter key: ");
long key = scanner.nextLong();
scanner.close();
random = new Random(key);
int c;
while((c = dis.read(random.nextInt())) != -1)
{
System.out.print((char)c);
}
dis.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
public class DecryptInputStream extends FilterInputStream
{
protected DecryptInputStream(InputStream in)
{
super(in);
}
public int read(int z) throws IOException
{
int c = super.read();
if(c == -1) return -1;
return c^z;
}
}
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class EncryptOutputStream extends FilterOutputStream
{
public EncryptOutputStream(OutputStream o)
{
super(o);
}
public void write(int c, int z) throws IOException
{
super.write(c^z);
}
}
多分 'int'ではなく' byte'を使うべきです( 'random.nextInt()'ではありません) –
解読のために正しい 'seed'を入力しましたか?おそらく、暗号化に使用したのと同じ値を使用するだけです。 –
私はこれが安全ではない乱数ジェネレータと低いエントロピーシードのために簡単に破壊可能であるため、これは本番ソフトウェアでは使用されないと仮定します。 – TheGreatContini