能否创建一个包含自身校验和(MD5、SHA1等)的文件?我是指在文件中明文存储校验和,而不是调用函数计算校验和。
能否创建一个包含自身校验和(MD5、SHA1等)的文件?我是指在文件中明文存储校验和,而不是调用函数计算校验和。
我写了一段C代码,然后进行暴力破解不到2分钟就得到了这个奇迹:
The CRC32 of this string is 4A1C449B
注意:句子后面不能有任何字符(换行等)。
你可以在这里检查:http://www.crc-online.com.ar/index.php?d=The+CRC32+of+this+string+is+4A1C449B&en=Calcular+CRC32
这个也很有趣:
I killed 56e9dee4 cows and all I got was...
这里是源代码(抱歉有点乱):http://www.latinsud.com/pub/crc32/
(n1 + n2 ... + CRC) % 256 == 0
看这个:
echo -e '#!/bin/bash\necho My cksum is 918329835' > magic
“我希望我的CRC32值是802892ef...”
嗯,我觉得这很有趣,所以今天我编写了一个小的Java程序来查找冲突。如果有人觉得有用,我把它留在这里:
import java.util.zip.CRC32;
public class Crc32_recurse2 {
public static void main(String[] args) throws InterruptedException {
long endval = Long.parseLong("ffffffff", 16);
long startval = 0L;
// startval = Long.parseLong("802892ef",16); //uncomment to save yourself some time
float percent = 0;
long time = System.currentTimeMillis();
long updates = 10000000L; // how often to print some status info
for (long i=startval;i<endval;i++) {
String testval = Long.toHexString(i);
String cmpval = getCRC("I wish my crc32 was " + testval + "...");
if (testval.equals(cmpval)) {
System.out.println("Match found!!! Message is:");
System.out.println("I wish my crc32 was " + testval + "...");
System.out.println("crc32 of message is " + testval);
System.exit(0);
}
if (i%updates==0) {
if (i==0) {
continue; // kludge to avoid divide by zero at the start
}
long timetaken = System.currentTimeMillis() - time;
long speed = updates/timetaken*1000;
percent = (i*100.0f)/endval;
long timeleft = (endval-i)/speed; // in seconds
System.out.println(percent+"% through - "+ "done "+i/1000000+"M so far"
+ " - " + speed+" tested per second - "+timeleft+
"s till the last value.");
time = System.currentTimeMillis();
}
}
}
public static String getCRC(String input) {
CRC32 crc = new CRC32();
crc.update(input.getBytes());
return Long.toHexString(crc.getValue());
}
}
49.825756% through - done 2140M so far - 1731000 tested per second - 1244s till the last value.
50.05859% through - done 2150M so far - 1770000 tested per second - 1211s till the last value.
Match found!!! Message is:
I wish my crc32 was 802892ef...
crc32 of message is 802892ef
在python-stdnum库中有一个Luhn Mod N
算法的实现(请参见luhn.py)。calc_check_digit
函数将计算一个数字或字符,当附加到文件(表示为字符串)时,将创建一个有效的Luhn Mod N
字符串。正如上面许多答案所指出的那样,这可以对文件的有效性进行一次检查,但不能防止被篡改。接收者需要知道用于定义Luhn mod N有效性的字母表。
如果问题是询问一个文件是否可以包含自己的校验和(除其他内容之外),对于固定大小的校验和来说,答案显然是肯定的,因为一个文件可以包含所有可能的校验和值。
如果问题是一个文件是否可以由自己的校验和(而没有其他内容)组成,那么很容易构造一个使这样的文件不可能存在的校验和算法:对于一个n字节的校验和,取文件的前n个字节的二进制表示并加1。由于也很容易构造一个总是编码自身的校验和(即执行上述操作但不加1),显然有些校验和可以编码自身,而有些则不能。很难确定标准校验和属于哪一类。
我不确定我是否正确理解了你的问题,但是您可以将文件的前16个字节作为文件其余部分的校验和。
因此,在编写文件之前,您需要计算哈希值,先写入哈希值,然后再写入文件内容。
有许多方法可以嵌入信息以检测传输错误等。 CRC 校验和对检测连续位翻转的情况很好,并且可以以使校验和始终为 0 的方式添加。这些种类的校验和(包括纠错码)很容易被重新生成,不能阻止恶意篡改。
如果接收方除了来自发送方之外不知道其他信息,就不可能将某些东西嵌入到消息中以便接收方验证其真实性。接收方可以与发送方共享一个秘密密钥。发送方随后可以附加一个加密的校验和(需要是加密安全的,如 md5/sha1)。还可以使用非对称加密,在此情况下,发送方可以发布他的公钥并使用他的私钥签名 md5 校验和/哈希。然后可以将哈希和签名作为一种新类型的校验和附加到数据上。这在现今的互联网上经常发生。
剩下的问题是:1. 接收者如何确保他得到了正确的公钥,2. 所有这些东西在现实中有多安全?对于第一个问题的答案可能会有所不同。在互联网上,通常会有每个人都信任的某个人签署公钥。另一个简单的解决方案是接收者从个人会议中获取公钥... 对于第二个问题的答案可能会随时改变,但是今天强制执行的成本很可能在未来某个时候被轻易破解。到那时,新算法和/或扩大的密钥尺寸已经出现了。