EOJ 3502 密码碰撞

题目已经给出了提示,用哈希求解。

解题思路就是枚举每个字符串的的子串,计算其哈希值,存在set中(去重),然后再将各个哈希值的出现次数存储在map中。

最后,遍历map,并累计。最后的结果应减去cas数,即减去自己对自己的密码。

#include <bits/stdc++.h>

typedef long long int ll;

#define PI 3.14159265358979323846
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3fll
#define maxn 1000+10
#define mod 2000120420010122

using namespace std;


inline ll getHash(string s){//网上学习的哈希函数,听说这个函数的分布比较均匀,get
    ll hash=0;
    for(int i=0;i<s.length();i++){
        hash=s[i] + (hash<<6) + (hash<<16) - hash;
    }
    return hash;
}

void solve(){
    int cas;
    cin>>cas;
    string password[cas];
    for(int i=0;i<cas;i++){
        cin>>password[i];
    }
    map<ll,ll> ma;
    for(int i=0;i<cas;i++){
        set<ll> se;
        int len=(int)password[i].length();
        string affect=password[i];
        for(int l=1;l<=len;l++){
            for(int j=0;j<len-l+1;j++){
                string tmp="";
                for(int k=0;k<l;k++){
                    tmp+=affect[j+k];
                }
                ll hash=getHash(tmp);
                se.insert(hash);
            }
        }
        for(ll hash : se){
            ma[hash]++;
        }
    }
    ll cnt=0;
    for(int i=0;i<cas;i++){
        cnt += ma[getHash(password[i])];
    }
    cout<<cnt - cas<<endl;
}

int main(int argc, char const *argv[]){
    solve();
    return 0;
}

面对Hash函数领域取得的重大研究进展,Crypto 2004 会议总主席StorageTek高级研究员Jim Hughes 17 日早晨表示,此消息太重要了,因此他已筹办该会成立24年来的首次网络广播(Webcast )。Hughes在会议上宣布:“会中将提出三份探讨杂凑碰撞(hash collisions )重要的研究报告。”其中一份是王小云等几位中国研究人员的研究发现。17日晚,王小云教授在会上把他们的研究成果做了宣读。这篇由王小云、冯登国、来学嘉、于红波四人共同完成的文章,囊括了对MD5、HAVAL-128、 MD4和RIPEMD四个著名HASH算法的破译结果。在王小云教授仅公布到他们的第三个惊人成果的时候,会场上已经是掌声四起,报告不得不一度中断。报告结束后,所有与会专家对他们的突出工作报以长时的热烈掌声,有些学者甚至起立鼓掌以示他们的祝贺和敬佩。当人们掌声渐息,来学嘉教授又对文章进行了一点颇有趣味的补充说明。由于版本问题,作者在提交会议论文时使用的一组常数和先行标准不同;在会议发现这一问题之后,王小云教授立即改变了那个常数,在很短的时间内就完成了新的数据分析,这段有惊无险的小插曲倒更加证明了他们论文的信服力,攻击方法的有效性,反而凸显了研究工作的成功。   会议结束时,很多专家围拢到王小云教授身边,既有简短的探讨,又有由衷的祝贺,褒誉之词不绝。包含公钥密码的主要创始人R. L. Rivest和A. Shamir在内的世界顶级的密码学专家也上前表示他们的欣喜和祝贺。   国际密码学专家对王小云教授等人的论文给予高度评价。   MD5的设计者,同时也是国际著名的公钥加密算法标准RSA的第一设计者R.Rivest在邮件中写道:“这些结果无疑给人非常深刻的印象,她应当得到我最热烈的祝贺,当然,我并不希望看到MD5就这样倒下,但人必须尊崇真理。”   Francois Grieu这样说:“王小云、冯登国、来学嘉和于红波的最新成果表明他们已经成功破译了MD4、MD5、HAVAL-128、RIPEMD-128。并且有望以更低的复杂度完成对SHA-0的攻击。一些初步的问题已经解决。他们赢得了非常热烈的掌声。”   另一位专家Greg Rose如此评价:“我刚刚听了Joux和王小云的报告,王所使用的技术能在任何初始值下用2^40次hash运算找出SHA-0的碰撞。她在报告中对四种HASH函数都给出了碰撞,她赢得了长时间的起立喝彩,(这在我印象中还是第一次)。…… 她是当今密码学界的巾帼英雄。……(王小云教授的工作)技术虽然没有公开,但结果是无庸质疑的,这种技术确实存在。…… 我坐在Ron Rivest前面,我听到他评论道:‘我们不得不做很多的重新思考了。’”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JiangNanMax

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值