Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 破解散列算法_Java_Algorithm_Cryptography - Fatal编程技术网

Java 破解散列算法

Java 破解散列算法,java,algorithm,cryptography,Java,Algorithm,Cryptography,我正在尝试破解Java中的哈希算法: public static int encode(String file) { int hash = 0; file = file.toUpperCase(); for(int i = 0; i < file.length(); i++) { hash = (hash * 61 + file.charAt(i)) - 32;

我正在尝试破解Java中的哈希算法:

    public static int encode(String file) {
            int hash = 0;
            file = file.toUpperCase();

            for(int i = 0; i < file.length(); i++) {
                    hash = (hash * 61 + file.charAt(i)) - 32;
            }
            return hash;
    }
公共静态整数编码(字符串文件){
int hash=0;
file=file.toUpperCase();
对于(int i=0;i
这是我的尝试:

public static String decode(int hash) {
            long realHash = (hash < 0 ? Integer.MAX_VALUE + Math.abs(hash) : hash);
            ByteBuffer buffer = ByteBuffer.allocate(50);

            while (realHash > 0) {
                    buffer.put((byte) ((realHash % 61) + 32));
                    realHash = (realHash - 32) / 61;
            }
            buffer.flip();
            return new String(buffer.array()).trim();
    }
公共静态字符串解码(int散列){
long realHash=(hash<0?Integer.MAX_VALUE+Math.abs(hash):hash);
ByteBuffer缓冲区=ByteBuffer.allocate(50);
while(realHash>0){
put((字节)((realHash%61)+32));
realHash=(realHash-32)/61;
}
flip();
返回新字符串(buffer.array()).trim();
}

我的解决方案似乎有严重的数据丢失,我认为由于整数溢出,我无法完全解除较长文本数据的哈希。有什么建议吗?

问题不在于整数溢出。这就像开车经过熔岩,让你的汽车爆炸,然后得出结论说你没有买对汽油

真正的问题是你不能“破解”散列算法。原因有一个:

信息论 信息论中有一个术语叫做。(警告:这篇文章不容易理解。)快速版本是,对任何给定的信息块进行编码都需要最少的位数

有一个计算器,声称可以确定对给定文本进行无损编码所需的熵量(即最小位数)。我为它提供了以下内容:

梅金格斯饲料苦味豆腐,韦斯·安德森食品卡车工艺啤酒 苹果手机。单一产地咖啡香精独角鲸,mumblecore mlkshk牛仔裤 简嘉信托基金艺术派对上爆满的短裤你可能还没听说过 其中有很多是苦味的。宝丽来工艺啤酒智能,乙烯基玛法 布鲁克林鲜味

假设系统上的
int
为32位,则只有32位空间可对任何给定文件进行编码。但是,如果你想重建文本的话,上面的代码段——与我可能使用的代码(如战争与和平或美国代码)相比不算太长——至少需要1472位进行编码

(Commentor指向(),这是表示字符串的信息内容和破解散列的无效性的更好方法。)

因此,从理论上讲(撇开欺骗不谈,比如有一个预填充的压缩字典),不可能从32位整数重建那些(简单手工制作的本地源代码)句子。不幸的是,这是宇宙的基本法则。不会发生的

实例,来自代码 提到-,一个简单的想法,如果你有N个插槽(在本例中为2^32),如果不在同一个插槽中放置两个或更多的东西,你不能在其中放置超过N个东西

让我们看看你的散列函数:

public static int encode(String file) {
        int hash = 0;
        file = file.toUpperCase();

        for(int i = 0; i < file.length(); i++) {
                hash = (hash * 61 + file.charAt(i)) - 32;
        }
        return hash;
}
我想散列两个文件:

mary had a little lamb

Mary Had A Little Lamb
它们的散列值是什么?想想看


(旁注:尽管如此,你还是溢出了int.:)如果你想做这样的事情,你是你的朋友。)

你不能从获取原始数据的意义上“破解”散列函数。但是,您可以在哈希冲突的意义上“破解”它。想象一下,您可以“破解”哈希,并从一个整数中计算出原始文本,而不管原始文本已经存在多长时间。难道你不认为你会让这些ZIP存档人员破产吗?。Kolmogorov complexity在这里可能更合适,因为它谈到用计算机程序压缩字符串。你说得对!添加了一个链接并向您致谢。我认为重要的是要补充一点,虽然您可以使用32位来表示1472位,但还有许多其他1472位的信息块将被压缩到相同的32位。区分它们是不可能的,因此,在“破解”散列之后,你所能期望的最好结果就是找出给定密钥所属的病理数据集。我可能刚刚提到了-这是一个简单易懂的原则,它提供了充分的证据,证明不可能确定比散列长一些的原始字符串,只给了散列。很棒的信息。感谢您的详细和快速回复。非常感谢。
mary had a little lamb

Mary Had A Little Lamb