【问题标题】:Stream cipher using java使用java的流密码
【发布时间】:2016-02-27 08:06:42
【问题描述】:

我正在尝试使用 Java 创建一个流密码,其中我从文件中获取纯文本对其进行加密(使用带有种子值的随机密钥的简单 XOR)并将其存储在不同的文件中,然后再次解密从文件中获取密文并解密(与加密密钥相同的 XOR 操作)并存储在文件中。

但是当我尝试加密大字符串时遇到了问题。字符串的一半被正确解密,但另一半仍然是不可读的格式。

                FileReader fileReader = new FileReader(file);

                // Always wrap FileReader in BufferedReader.
                BufferedReader bufferedReader = 
                    new BufferedReader(fileReader);

                FileWriter fileWriter =
                        new FileWriter(file2);

                    // Always wrap FileWriter in BufferedWriter.
                    BufferedWriter bufferedWriter =
                        new BufferedWriter(fileWriter);


                while((line = bufferedReader.readLine()) != null) {
                    sb = new StringBuffer (line);

                    int lenStr = line.length();
                    int lenKey = String.valueOf(random).length();

                    // For each character in our string, encrypt it...
                    for ( int i = 0, j = 0; i < lenStr; i++, j++ ) 
                    {
                       if ( j >= lenKey ) j = 0;  // Wrap 'round to beginning of key string.

                       //
                       // XOR the chars together. Must cast back to char to avoid compile error. 
                       //
                       String key = random + "";
                       bufferedWriter.write((char)(line.charAt(i) ^ key.charAt(j)));

                    }
                }   

                // Always close files.
                bufferedReader.close();  
                bufferedWriter.close();

【问题讨论】:

  • 哪一半?你的琴弦有多长?

标签: java encryption stream-cipher


【解决方案1】:

您在没有足够小心的情况下混合了二进制和字符和字符串。字符的异或很可能导致字符不代表字符串。如果两个相同的字符被异或在一起,那么结果将是一个空字符,通常解释为 FILE 的 END。

相反,在 XOR'ing 时最好保持一切二进制。 XOR 是二元运算,而不是对字符的运算。所以你改用字节数组。

【讨论】:

  • 那么在我的程序中我该如何实现呢?
  • PlainText:这只是为了检查程序是否正常工作。密文:yYXF^JZBCYEZTQVS\ZYTA_RKD_UACZPEX^^CF^G\^WTGBBATG[N\B^BE 解密后的明文:这只是为了检查lrkerog#ntkovii`m#wurlevny.eq'irh。任何人都请帮我解决这个问题。我还尝试将其转换为二进制然后 XOR,然后再次转换为 char 并将其存储在文件中,但输出与上述程序相同。
  • 我相信你现在已经解决了(添加这个问题的答案会很好)。你看过 java 的 CipherOutputStream 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 2013-04-23
  • 2011-08-03
  • 2016-10-15
  • 2016-01-31
相关资源
最近更新 更多