Java 凯撒加密的ASCII文本部分解密

Java 凯撒加密的ASCII文本部分解密,java,encryption,cryptography,ascii,Java,Encryption,Cryptography,Ascii,我试图用暴力破解凯撒编码的256位ASCII文本。 有关案文是: dy}uƒ0^u‡0b}q~K‹lvAlv‚}q~lv€‚Blvsxq‚ƒu„B0c‰}r|K‹lvBlvƒ‡yƒƒlv€‚Blvsxq‚ƒu„@0Q‚yq|K‹lvClv‚}q~lv€‚Blvsxq‚ƒu„@0\yru‚q„y~0cu‚yv‹l:lvq|„0dy}uƒ0^u‡0b}q~K‹lvDlvƒ‡yƒƒlv€‚Blvsxq‚ƒu„@0\yru‚q„y~0cq~ƒ‹l:lvq|„0Q‚yq|K‹lvElv‚}q~lv€‚@l

我试图用暴力破解凯撒编码的256位ASCII文本。 有关案文是:

dy}uƒ0^u‡0b}q~K‹lvAlv‚}q~lv€‚Blvsxq‚ƒu„B0c‰}r|K‹lvBlvƒ‡yƒƒlv€‚Blvsxq‚ƒu„@0Q‚yq|K‹lvClv‚}q~lv€‚Blvsxq‚ƒu„@0\yru‚q„y~0cu‚yv‹l:lvq|„0dy}uƒ0^u‡0b}q~K‹lvDlvƒ‡yƒƒlv€‚Blvsxq‚ƒu„@0\yru‚q„y~0cq~ƒ‹l:lvq|„0Q‚yq|K‹lvElv‚}q~lv€‚@lvsxq‚ƒu„ABH0dy}uƒ0^u‡0b}q~K‹lvFlv~y|l
使用这个小型java程序:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class Run {
    private static FileWriter fr;
    static String b;
    private static BufferedReader br;

    public static void main(String[] args) throws IOException {

        // encrypted file
        File enc_f = new File("caesar.rtf.enc");
        //decrypted file
        File dec_f = new File("caesar.rtf.dec");

        // init variables
        String text_enc = new String();
        String text_dec = new String();

        // read file
        br = new BufferedReader(new FileReader(enc_f));
        for (String line; (line = br.readLine()) != null; text_enc += line);
        char[] stringToCharArray = text_enc.toCharArray();

        // parse file and convert string to char
        for (int shift = 0; shift < 257; shift++) {

            for (char output : stringToCharArray) {

                // convert ascii to int
                int ascii = (int) output;

                // shift 
                ascii = ascii + shift;
                ascii = ascii % 256;

                // convert back to ascii
                char chTemp = (char) ascii;
                text_dec += chTemp;

            }

            // visual representation
            text_dec += System.lineSeparator();
            text_dec += System.lineSeparator();
            text_dec += shift;
            text_dec += System.lineSeparator();
            System.out.println(shift);

            // write decrypted file
            fr = new FileWriter(dec_f);
            fr.write(text_dec);

        }
        fr.close();
    }
}
正如我所看到的,我可以阅读《新罗马时代》,但也可以阅读《新罗马时代》中不应该出现的地方,我不明白为什么,好像移位不正确,那么所有的文本都应该是错误的,而不仅仅是其中的一部分。此外,加密文本也可以正确解密。
如果您有任何想法,请给出提示。

您犯了一个非常基本的错误:将二进制/字节与字符串混淆

没有“256 ASCII”,ASCII是7位,即在[0..127]内编码,前32个值和最后一个值是控制字符

您所说的是字节,应该对这些字节执行操作。如果在Java中对字节执行计算,它将自动在0..255范围内。您必须小心,虽然字节不是“提升”为整数,但偶尔使用
(byte)
回退

因此,除了最后的打印输出,您的操作都应该以字节为单位。使用
读卡器
写卡器
可能会丢失数据,因为某些字符可能会被遗漏。直接使用流,然后在任何文本阅读器中查看输出

当然,您也可以使用输出介于某些字节值(有效字符编码)之间的事实来测试您的解决方案是否正确



请注意,我们无法为您测试,因为您的输入“字符串”可能已经损坏。如果要在此处打印,请使用base 64或十六进制对其进行编码。

您犯了一个非常基本的错误:将二进制/字节与字符串混淆

没有“256 ASCII”,ASCII是7位,即在[0..127]内编码,前32个值和最后一个值是控制字符

您所说的是字节,应该对这些字节执行操作。如果在Java中对字节执行计算,它将自动在0..255范围内。您必须小心,虽然字节不是“提升”为整数,但偶尔使用
(byte)
回退

因此,除了最后的打印输出,您的操作都应该以字节为单位。使用
读卡器
写卡器
可能会丢失数据,因为某些字符可能会被遗漏。直接使用流,然后在任何文本阅读器中查看输出

当然,您也可以使用输出介于某些字节值(有效字符编码)之间的事实来测试您的解决方案是否正确



请注意,我们无法为您测试,因为您的输入“字符串”可能已经损坏。如果要在此处打印,请使用基数64或十六进制对其进行编码。

239似乎不是正确的移位,因为“d”有ascii代码100,如果加上或减去239,将超出256个字符的ascii表限制。@AlexanderV。它不应该超出ascii限制,正如我所说的“ascii=ascii%256;”因此它将恢复到256个字符的限制239似乎不是正确的移位,因为“d”有ascii码100,如果我们加239或减239,我们将超出256个字符的ascii表限制。@AlexanderV。它不应该超出ascii限制,正如我所说的“ascii=ascii%256;”所以它会恢复到原来的状态,谢谢!我不知道我怎么会犯这样的错误。我完全按照你说的做了,使用“Files.readAllBytes(path_to_file);”要读取字节,请将它们转换为无符号的1,然后再转换为整数。谢谢!我不知道我怎么会犯这样的错误。我完全按照你说的做了,使用“Files.readAllBytes(path_to_file);”要读取字节,请将其转换为无符号的字节,然后再转换为整数。
Timeí Neí Roman;íí\f1\fíoman\fííí2\fchaííeí2 Símbol;íí\f2\fííiíí\fííí2\fchaííeí0 Aíial;íí\f3\fíoman\fííí2\fchaííeí0 Libeíaíion Seíifí\*\falí Timeí Neí Romaní;íí\f4\fííiíí\fííí2\fchaííeí0 Libeíaíion Saníí\*\falí Aíialí;íí\f5\fíoman\fííí0\fchaííeí128 Timeí Neí Roman;íí\f6\fnil\