2

注意:请不要判断这个问题。对于那些认为我这样做是为了“欺骗”的人;你错了,反正我已经不在学校了。此外,如果我自己真的想作弊,我会简单地使用已经为此创建的服务,而不是重新创建程序。我接受了这个项目,因为我认为它可能很有趣,仅此而已。在您投反对票之前,请考虑问题本身的价值,而不是它的投机用途,因为 SO 的目的不是判断,而只是提供公共信息。


我正在用 java 开发一个程序,该程序应该故意损坏文件(特别是 .doc、txt 或 pdf,但其他程序也可以)

我最初尝试过这个:

public void corruptFile (String pathInName, String pathOutName) {
    curroptMethod method  = new curroptMethod();
    ArrayList<Integer> corruptHash = corrupt(getBytes(pathInName));
    writeBytes(corruptHash, pathOutName);
    new MimetypesFileTypeMap().getContentType(new File(pathInName));
    //  "/home/ephraim/Desktop/testfile"
}

public ArrayList<Integer> getBytes(String filePath) {
    ArrayList<Integer> fileBytes = new ArrayList<Integer>();
    try {
        FileInputStream myInputStream = new FileInputStream(new File(filePath));
        do {
            int currentByte = myInputStream.read();
            if(currentByte == -1) {
                System.out.println("broke loop");
                break;
            }
            fileBytes.add(currentByte);
        } while (true);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(fileBytes);
    return fileBytes;
}

public void writeBytes(ArrayList<Integer> hash, String pathName) {
    try {
        OutputStream myOutputStream = new FileOutputStream(new File(pathName));
        for (int currentHash : hash) {
            myOutputStream.write(currentHash);
        }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    //System.out.println(hash);
}

public ArrayList<Integer> corrupt(ArrayList<Integer> hash) {
    ArrayList<Integer> corruptHash = new ArrayList<Integer>();
    ArrayList<Integer> keywordCodeArray = new ArrayList<Integer>();
    Integer keywordIndex = 0;
            String keyword = "corruptthisfile";

    for (int i = 0; i < keyword.length(); i++) {
        keywordCodeArray.add(keyword.codePointAt(i));
    }

    for (Integer currentByte : hash) {


        //Integer currentByteProduct = (keywordCodeArray.get(keywordIndex) + currentByte) / 2;
        Integer currentByteProduct =  currentByte - keywordCodeArray.get(keywordIndex);
        if (currentByteProduct < 0) currentByteProduct += 255;
        corruptHash.add(currentByteProduct);

        if (keywordIndex == (keyword.length() - 1)) {
            keywordIndex = 0;
        } else keywordIndex++;
    }

    //System.out.println(corruptHash);
    return corruptHash;
}

但问题是该文件仍然可以打开。当你打开文件时,所有的单词都被改变了(它们可能没有任何意义,甚至可能不是字母,但仍然可以打开)

所以这是我的实际问题:

有没有办法让一个文件如此损坏以至于计算机根本不知道如何打开它(即当你打开它时,计算机会说“这个文件无法识别,并且不能打开”)?

4

3 回答 3

3

我想你想看看RandomAccessFile。此外,程序几乎总是从一开始就识别它的文件。所以打开文件并打乱前 5 个字节。

于 2012-04-15T21:00:35.363 回答
1

完全破坏任意文件的唯一方法是用随机垃圾替换其所有内容。即便如此,随机垃圾实际上是有意义的东西的可能性也很小。

根据文件类型,有可能从有限的——甚至不是那么有限的——损坏中恢复。例如:

  • 流媒体编解码器的设计考虑了网络丢包。有限的损坏可能会显示为图像伪影,甚至是一些丢失的帧,但内容通常仍然可见。

  • 基于块的压缩算法,例如bzip2,允许恢复未损坏的块。

  • 基于文件的压缩系统,例如rar并且zip可能能够恢复那些压缩数据未被损坏的文件,而不管存档的其余部分是否损坏。

  • 人类可读的文本,例如文本文件和源代码文件,仍然可以在文本编辑器中查看,即使部分内容已损坏 - 更不用说其大小不会改变。除非你破坏了整个事情,否则任何普通的读者都可以判断一个任务是否完成,以及重新传输的文件是否与被破坏的文件相同。

除了道德问题,你有没有想过这只是一次性的事情?确实会发生数据损坏,但它并不那么频繁,也从来没有那么方便......

如果您如此渴望更多时间,最好还是摔断腿并让自己住院。

于 2012-04-15T21:22:29.557 回答
0

有更好的方法:

  1. 您的教授接受 Word 文档。发送前用宏病毒感染它。
  2. “忘记”将文件附加到电子邮件中。
  3. 在您的电子邮件上伪造发送日期。如果您的教授是接受 Word 文档的那种,这可能会起作用。
于 2012-04-15T21:53:45.380 回答