Java Stream Cipher(带输入和输出txt文件)输出随机字符不完整解密字符串

时间:2016-02-24 06:55:57

标签: java encryption input output stream-cipher

不知道我错在哪里但我的程序应该是一个流密码,它接受99 78 68 56 52 4 3 31 78 56 52 4 3 31 26 56 4 3 26 25 4 3 1 4 3 1 1 的input.txt文件并将其加密成数字,然后将其解密回{{1} }。

我的问题是我输入:

chars

(加密txt到输出文件,它工作正常,) 输入文件如下:

chars

输出文件如下:

java Program4 -e 71 < inp.txt > out.txt

然后我解密文件..

guess what? Chicken butt

它是这样的:

222 204 220 202 202 153 206 209 216 205 134 153 250 209 208 218 210 220 215 153 219 204 205 205

我不知道我做错了什么,但我猜这是我的解密方法或我的加密如何在某些值上给出相同的数字? 我非常感谢任何帮助!

java Program4 -d 71 < out.txt

1 个答案:

答案 0 :(得分:1)

您在两种情况下使用随机数生成器的方式不同。在加密代码中,您生成一个随机数,并将其用于所有字符:

Random rng = new Random(key);
int randomNum = rng.nextInt(256);
while (scan.hasNextLine())
{
    String s = scan.nextLine();
    for (int i = 0; i < s.length(); i++)
    {
        char allChars = s.charAt(i);
        int cipherNums = allChars ^ randomNum;
        System.out.print(cipherNums + " ");
    }
}

在您的解密代码中,您为每个字符生成一个新的随机数

while (scan.hasNextInt())
{
    int next = scan.nextInt();
    int randomNum = rng.nextInt(256);
    int decipher = next ^ randomNum;
    System.out.print((char)decipher + " ");
}

解决此问题的最佳方法(例如,为了避免每个人总是加密到相同的数字)将在加密时为每个字符使用新的随机数:

Random rng = new Random(key);
while (scan.hasNextLine())
{
    String s = scan.nextLine();
    for (int i = 0; i < s.length(); i++)
    {
        char allChars = s.charAt(i);
        int randomNum = rng.nextInt(256);
        int cipherNums = allChars ^ randomNum;
        System.out.print(cipherNums + " ");
    }
}

(当然,此代码不应用于真正的加密 - 我认为它仅用于教育目的。)