大家好,互联网的初期是以传输数据为主,而随着应用程序的不断扩大。我们需要加传输的数据进行加密,比如对在线支付的信息进行加密,或者银行系统、公安系统的登陆账号信息,用数字证书来明确登陆人是谁。今天我们讲一下数字证书。
1.生日碰撞问题有小伙伴发朋友圈说:“两个人同一间宿舍,而且同年同月同日生,这个缘分真的是醉了”。那同一班级中出现生日相同的概率有多大?有的同学,一年有365天,每个有有365种选择,是真的吗?今天我就来分析一下。
至少有2个学生的生日在同一天的对立事件是没有任何学生的生日在同一天。我们把这个问题设想成,每个人排队依次进入一个房间。而房间数量是365间。
若班级有1人,他可以进365中的任何一个房间,则不相同生日概率是365/365;
若班级有2人,则第1人进365中的任何一个房间,而第2人为了不一样可进364中的任何一间,故不相同生日概率365/365* 364/365;
若班级有3人,则不相同生日概率365/365 * 364/365 * 364/365;
如此这般,现在我们有k个人,生日不在同一天的概率是。
P生日概率
我们代入数据计算一下,若一个班有10人,有P=88%,则1-P=12%;
若一个班有23人,而P=50%,则1-P=50%;
若一个班有50人,而P=3%,则1-P=97%。
可见只要班级有23人,有相同生日的概率就很大了,然后一个班有50人时,基本上必有生日相同的同学。
2.哈希函数哈希函数有这样的功能,比如如下的功能:
hash 运算
哈希函数有几个特点:
一是单向(one-way)的,只能从左向右算结果,而你从结果推不出运算原先的输入,比如只能从name推出123,但是问123原先的输入是谁,就不知道了。
二是输入可以任意长度,输出是固定长度(fixed length)
不管原先输入是多少项,经hash运算后,输出的长度是固定的。比如非常有名的SHA256哈希函数,输入一本《三国演义》或者仅仅输入一个字母a,出来的都是256位比特长度的数据。
由于特点二这样有个缺点:几个不同的输入可能产生相同的输出,即哈希函数会出现生日碰撞,我们不是希望出现生日碰撞,因为就会引起混淆,不法区分输入。
所以说要尽量不出现生日碰撞,经过分析。如果有k个哈希值,出现生日碰撞大于50%的概率是1.2倍速根号k。比如,现在有100个哈希值,12个输入出现相同输出的概率大于50%;而如果有10000个哈希值,要检验120次才能确定是否有相同的输出。
3.数字签名数字签名是目的是确定信息来自谁?分为单向加密与双向加密。
用户向银行发数据
当用户向银行发送查账户余额的数据时,用户没确定接收的数据是银行的真实数据还是来自黑客的窃听数据。
怎么办呢?
用户向银行发送数据,约定如下:
用户向银行的加密盒子:任何人都可以加密数据;
而银行向用户发送的加密盒子,是相反的,只能用户解密,但只有银行能加密,而且银行发送的数据是经hash计算的。
例如,用户把name会给银行后,而银行name做hash计算后,将123传给用户,用户解密后得出123值与原先传入的name进行比较,若二值一样,则证明数据来源无误。
其中,经hash计算的123值,是公开的,别人获取到也无法推出其输入。就像你知道一个人的生日,而要根据生日来推某个人就很难了。
而由于hash函数的个数是一样的,如同生日一样,所以有可能产生生日碰撞,所有数字签名不是百分之百的安全。在理论是黑客只要一直尝试,会有可能产生一样的哈希输出的,所在在实际应用中,一般会限制登陆次数或出错次数,而降低尝试操作的可能。
4.参考文献Zhao W , Shi R , Shi J , et al. Multibit quantum digital signature with continuous variables using basis encoding over insecure channels[J]. 2021.