公钥password学中的素数以及对称加密
声明和悲叹
近期,一次联调SSLVPN协议的机会,让我终于有时间能够弄点关于password学的东西,仅仅是简单的沾个边儿。因此本文既不是技术文档亦非学术论文。你不可能通过阅读本文学到Howto。这仅仅是一篇随笔或者说科普。而已。
声明之后是我的一些悲叹!
有太多人精通加密算法,却不了解群环域的实质,反对者声称仅仅要会用仅仅要懂操作步骤就能够了,然而这个理由对于理性而言总是不那么perfect,是啊,太多的人知道RSA密钥产生的步骤,知道p,q和n。还知道p,q都是素数,背得滚瓜烂熟,可是却对为什么这么产生一无所知,然而非常多人已经沾到了欧拉函数的边儿。......
......
从规则和规则应用的范围说起
不论什么机制都要有个作用范围,机制必须在该作用范围内运转,其效果也必须体如今该作用范围。比方法律之于国民。TCP状态机之于TCP连接...
现代password学建立在代价收益不均衡的基础上。什么是好的算法?当你破解该算法使用的密钥的代价远远超过破解之后所得到的收益时,该算法就是好的!现代password学的还有一个基础是现代计算机技术,能够说计算机是现代password学的载体!在此我们能够对照一下还有一种password学。那就是心理学。同样,攻心术也是建立在代价收益不均衡之基础上,然而和计算机password学不同。心理学的还有一个基础是人脑!假设说现代非对称password学建立在数学难题之上,那么心理学则是建立在“人心隔肚皮”之上。
计算机上的现代password学,显然要受到计算机的限制,什么限制呢?那就是计算机无法处理抽象的集合,它仅仅能处理详细的数字。比方计算机不能处理整个实数集合,但它却能处理你能给出的无论多大的数字!因此在计算机里面提到数字。你必须指定一个有限的范围,即便这个范围囊括的数字范围巨大。该范围一定是详细的。
据科学预计,宇宙中的原子数量在2的千级次幂范围内,而这个数在计算机内并不算什么大不了的!计算机能够高速处理这么大的数字,这样的数字被叫做大数(BIG NUMBER),其实,在计量上。这类数字确实不小。可是在数学上。这类数字却也不大。计算机就是处理这些计量上的大数的。由于现代数学建立在抽象的基础上,然而计算机又无法直接处理抽象的概念,比方无穷远,比方无穷大等,所以就须要一定的规则。将运算框在一个有限的框框内,在这个有限的框框内,一切数学上的运算法则依旧适用。
规则的抽象
我们小学的时候学习过四则混合运算,后来又将运算的作用范围扩大到了整个实数集合。再后来又引入了虚数...实际上,这些都不重要。关键点在于运算法则本身。给定一个集合,假设集合内的随意元素在进行四则混合运算(要满足交换率,结合率...)后的结果仍然在该集合内,假设该集合又是一个有限的集合。那么该集合就能够作为计算机上password学使用的那个有限的框框。
怎样来生成一个有限的集合,方法非常多,最显而易见的就是“取模”,即对一个数字做除法然后取余数,比方假设我们将全部的正整数集合内的随意数字对数字5取模,那么结果无非也就0,1。2,3,4这5个数,无论怎么样结果也跑不出这5个数,就算你用1000和1234相加,结果2234除以5所得的余数4,也在这个范围内,这就是一个有限的集合,即我们说的那个有限的框框,计算机在这个集合里面做运算刚刚好,对于上一节所举的这个大数而言,随意正整数对它取模便能够形成一个非常大的集合。而计算机password学的非常多运算就是在这类集合内运转的。
到此为止,我们已经知道怎样生成一个有限的集合来方便计算机进行随意的运算,可是光这还不够。由于我们仅仅定义了一些运算法则以及一个有限的集合,单位元我们还没有,对于单位元而言,它能够作为集合内随意元素之间的媒介,其实它是一个衡量的尺度,比方对于整数加法,单位元就是0,不论什么一个数字和0相加结果都是它本身,通过单位元0还能够找到随意一个整数的相反数,与其相加的结果就是单位元,对于乘法而言也相似,乘法的单位元是1,而相应加法相反数的概念则是倒数,无论是加法的相反数,还是乘法的倒数,都能够被称作逆元。
那么对于取模的结果生成的集合内,有没有单位元呢?在回答这个问题之前,必须要声明的一点就是:对于集合内的随意一个元素,都必须拥有逆元,这样整个集合才可能是闭合的,否则一旦让一个没有逆元的元素參与运算,结果将是不可预知的(跑飞了...)。
理解了这一点之后,我们就能够瞬间理解“为什么在password学中素数这么重要”,“为什么循环群一定要有生成元”等问题。
为什么一定要是素数
在password学中,特别是公钥密钥学中,我们常常要面对生成一个大素数的问题,可是为什么一定要是素数呢?难道就是由于它数量比較少吗?No!难道由于它的分布不确定吗?No!
那究竟是为什么?
我们再来看上面那个模5的运算,集合为{0,1,2,3,4},对于乘法,我们看看每个元素的逆元各自是什么,显然0的逆元不存在,而1*1%5=1,2*3%5=1,3*2%5=1,4*4%5=1。这样除了0之外,其他的元素都有逆元,而我们注意到,模数5是一个素数...那么我们把特殊的元素0抛弃,留下{1,2,3,4}作为我们须要的有限集合,是不是能够呢?当然能够!
然而,我上面的论述有点以偏概全了,毕竟这仅仅是一个特例。
那么接下来就要证明一下这是一个普遍的结论:假设模数p为一个素数,那么对整个正整数集合取模的结果去掉0就能生成一个乘法运算闭合的集合。该集合是个素域。集合中的元素数量是p-1(由于去掉了0。
Oh yeah,这不就是朴素的欧拉函数吗?)。证明方法非常easy。
假设一个集合N={1,2,3,4....p-1}。p为素数。对于当中随意一个元素a。用a去乘整个集合,得到一个新的集合N'={1*a%p,2*a%p,3*a%p,4*a%p...(p-1)*a%p},我们仅仅须要证明这个新的集合中的某一个元素为1就可以。对于集合N而言。有一个条件我们还没实用过。那就是p为素数!这是关键之关键!
p为素数意味着集合N中全部的元素和p都是互素的,即它们没有公约数,同一时候这也意味着,N'中的元素和p也是互素的(这非常容易用反证法证明!
),再看,N集合和N'集合的元素数量是一致的。而N集合包括了到p为止的正整数全集。我没仅仅须要证明N'集合中的元素两两不相等,就能够说明N'集合也是到p为止的正整数全集,从而证明N==N'!
还是反证法,假设N'即集合中有m*a%p==n*a%p。当中m>n,设m=r*p+x1。n=s*p+x2,则x1%p==x2%p,x1和x2均是小于p的数,能够证明m和n模p同余。由于m和n都小于p。因此m==n。和假设不符。
因此N==N'。
这能说明什么呢?这说明集合N'中包括数字1,也就是说对于不论什么一个N中的元素a,在集合N中均拥有一个元素和其乘积模p等于1,这就说明集合N中的每个元素的逆元都是存在的。这就是模数为素数的重要性质!
那么,相反地,假设模数不为素数又怎样呢?举一个反例就可以,假设模数p=a*b。即它的因数是a。b,而且a和b均小于p,那么集合N={1,2,3,4...p-1}中的a和b将不存在逆元。由于它们除模数p的余数始终为0,而不是单位元1!
显然,模数为素数的重要性质就是能够将集合框在一个范围内。在此范围内。四则混合运算照常如旧,乘法单位元1存在!这是模运算的恩惠,或许是上帝的恩惠。数学如此之美。想想看。在实数范围内的四则混合运算与单位元。在素数模运算中。居然如此一致。这就是抽象代数,实际上,抽象代数不是被发明的。而是被发现的!
乘法逆元-大数分解
在理解了基本理论后。我们来看一下逆元为何如此重要。简单的说,求逆元在算法上是一个规范性的操作,比方使用辗转相除法等,然而对于模数p未知的情况下,却是一个在计算上不可能的问题。至于为什么不可能,请不要依照学子们的理论来考究。而要用收益/代价均衡的理论来考虑。比方你破解一个算法花了30年,有意义吗?在学术环境下是有意义的。那好吧,假设你能把算法强度提高到破解它须要付出300年的时间。你就能够拿到大奖了。
求逆元是一个甚是简便的做法,能够说是一个协议,试想,加密解密两方在没有不论什么交互的前提下。怎么知道怎样操作。
那么运算集中的操作就是协议了,比方就是求逆元。那么安全性在哪体现?给你两堆沙子,你将它们混合在了一起。然后你能再将它们区分出来吗?这就是大数分解问题的隐喻,这就是有限集合模运算算法安全性的保障!
素数模数界定了一个有限的集合。提供了可计算性,大数分解提供了计算的单向性。
如今我们步入RSA算法,这是一种常规的非对称密钥算法。
首先选择两个比較大的素数p和q,然后计算n=p*q,接下来须要界定一个集合。该集合内全部都是和n互素的数。显然n不是素数,这就意味着必须在集合N={1,2,3,4...n-1}中抛弃和n不互素的数字。那么剩下的集合N'中还剩下多少元素呢?在进一步讨论之前。我先讲一下前提。
上一节我论述了,假设模数p是一个素数,那么集合{1,2,3,...p-1}构成一个有限集合N,能够用作非对称密钥学计算,那么推广一下,假设p不是素数,那么这个集合该怎样界定呢?结论是。在集合N中抛弃全部和数字p不互素的数。
我们假设p=m*n,当中m,n均为素数,那么集合{1,2,3,4...m*n-1}中有多少和p互素的数呢?非常显然。这些不和p互素的数字分为两类,一类是m的倍数,还有一类是n的倍数。m的倍数在集合中是{m,2m,3m...(n-1)m},而n的倍数则是{n,2n,3n...(m-1)n},因此集合{1,2,3,4...p-1}中和p互素的集合N中数字的数量一共同拥有(p-1)-(n-1)-(m-1)=m*n-m-n+1=(m-1)*(n-1)。
上述集合N中元素都有逆元吗?答案是肯定的。证明方法和素域p中的元素都有逆元的证明是一样的。首先将待求逆元的元素乘以集合N中的每个元素并对m*n取模。得到新集合N',证明这个集N'合和集合N是相等的,因此里面必定有元素1。证明这个仅仅须要两点,首先证明N‘中的元素都是和m*n互素的(实际上代表了全部的和m*n互素的数字组成的集合),其次证明它们两两不相等,这就能够说明两个集合是一样的。
上面的这个结论是极其重要的。毕竟RSA算法的最開始就是要选择两个大素数p,q,然后计算n=p*q,而且计算m=(p-1)*(q-1),看看m是什么,m就是集合{1,2,3...n-1}中和n互素的集合N中数字的数量!
RSA的计算将全部在集合N中进行!
实际上,前几步的选取大素数p。q以及计算(p-1)*(q-1)仅仅是界定了一个计算的集合而已。
RSA算法在界定了集合N之后,就会在N中选取一个数字e,显然e的逆元肯定是存在的。那么计算e的逆元,结果就是私钥d!公钥就是e以及n。
n是明白的。可是你非常难得到p和q。这就是算法的根本。
技术实现上的关键点是。这样的算法之所以可行,全然是这些算法过程是建立在一个有限的集合的基础上。在该集合中存在单位元,满足交换率。计算闭合性。到这里为止。我并没有提到群,环,域的概念,也没有给出不论什么的定义。定理。可是殊途同归,一个简单的规则抽象的设想便能够推出基本上全部的定理。定义,仅仅是我没有说哪些是定义,哪些是定理罢了。想了解这些。随便找一本数论。抽象代数的书你就能够学到。
读了这些书的结果怎样呢?结果就是你能够拿起笔写下试题的答案,然而即便这样,假设不自己从头到尾的思考,你可能仍然不知所以然。仅仅知道某某学科有一个XX定理,它的证法是这样的...
这个简单的设想就是在一个集合中,其全部元素乘法逆元的存在性。要存在乘法逆元,素数便登上了舞台,由于我们发现,假设一个集合中的元素和模数均是互素的,那么乘法逆元就一定存在,最简单的这样的集合就是所谓的素域,当然对于模数是随意值的集合而言。欧拉函数给出了集合中元素的个数。请注意,欧拉函数“仅仅是一种找到元素个数的方法”,而和集合的本质没有太多的关系。
依旧本着乘法逆元。我们来看一下它是怎么导出在有限集合中的离散对数问题的。
乘法逆元-离散对数问题
我们依旧看最初的那个集合N={1,2,3,4...p-1},当中p为素数。如今我们知道这个集合中均存在乘法逆元,计算也都是闭合的。我们随便拿出该集合的一个元素a,用它来乘以集合N中的每个元素并模p,得到新的集合N'={1*a%p,2*a%p,3*a%p,4*a%p...(p-1)*a%p},我们知道当中肯定有一个元素为1。相应的该元素去掉*a后就是a的逆元。好的。一切正常,如今没有完,继续用a乘以集合N'中的元素并模p得到N'',我们知道N‘’和N是相等的。再进一步,用a去乘N‘’的每个元素并模p得到N‘’‘。...N’‘’‘’我们能够得出,全部这些N。N',N''。N''',N'''''...等都是同样的集合,因此我们就知道。a的无论多少次方模p的结果都在集合N内。
这个结论非常重要,这显然又构成了一个闭合的运算集合。在该集合内,随意一个元素的随意次方模p的结果依旧属于该集合,给定一个集合内的元素a以及还有一个元素b,你能算出a的多少次方模p等于b吗?这就是离散对数问题。显然。仅仅有在模运算的情况下才绘出现如此多的有趣特性。显然,钟表上绕圈还是非常好玩的。
或许你想知道离散对数问题和乘法逆元有什么关系,关系并非那么明白,然而,一个集合中每个元素逆元的存在则是必须的要求。如此好玩的在钟表上绕圈的规则总结成一门学科就是数论。而password学则是利用了数论的诸多定理和定义的学科。
公钥password学与对称password
password学。特别是公钥password学,并不旨在数论领域发现新的天地,它仅仅是利用了结论。对于password学而言,群环域仅仅是为了定义一个框框,将全部的计算限制在这个框框内,而详细限制的方法则是取模,于是这个框框就成了钟表。这是password学,特别是公钥password学的基础。在扩展意义上,二项式域仅仅是纯粹的数域的还有一种抽象。旨在定义新的运算规则,其本质和上面论述的并无差别。
对于公钥password学的安全性保证,是在计算意义上的,而非理论意义上的。
就是利用一些计算上的单向性导致的逆向运算难题,而针对这些单向运算的分析。也是在数论范畴的。
前面提到的数论在公钥password领域非常实用武之地。然而在对称password学领域,起关键作用的不是数论之类的数学,而是操作技巧。在对称password学领域,最关键的是三个基本原则:
1.混淆替换。
切断明文和密文之间的线性相应关系,替换在扩散的作用下会添加非线性特征。
2.作用扩散。将非线性特征扩散到整个密文,明文片断之间的不论什么差异均会影响整个密文,使密文无章可循。
3.操作可逆。由于加密/解密使用同一个密钥,操作必须是可逆的。
落实到终于对明文的操作上。就是异或操作。
异或操作是一种最为均衡的位操作,由于两个操作数同样结果就是0。两个操作数不同。结果就是1,这样要想通过结果得到明文,你就必须知道密钥,否则你猜对的可能性就仅仅有50%,假设密钥长度达到一定长度,加上上述的替换和扩散作用。密文被破解的可能性就微乎其微了。
对称password学实际上是非常有趣的。不像公钥password学你必须有一定的数学基础才干玩得转。
其实,在我们日常生活中,整天都在面对对称password学。
平时用的暗号,一些肢体语言,一个眼神,这些都是对一些信息的编码,在指望对方能明白之前,你们之间必须有一个约定。最简单的比方自然语言,两个中国人之间的书信在德国人看来就是密文。而这个德国人解密的唯一途径就是搞到密钥。当然这比較简单。相应的password本就是汉德词典。因此。对称password中的对称含义就是两方掌握同样的加密/解密信息。假设我们考虑详细的操作,你怎样能隐掉写在纸上的一个电话号码呢?
最常见的方式就是烧掉它,可是烧掉是不可逆的,假设你忘记了这个号码,你自己也无法恢复它了...还有一种选择就是用同颜色涂掉它,可是当你拿起这张纸。然后将它对着光,你会看到原始电话号码的字痕。于是你又想了一个办法,那就是乱涂,而不是朝着一个方向去涂,可是即便这样。你也能在混乱的字痕中找到一个规则的东西,终于将其拼成数字...那怎么办?此时须要用替换和扩散了。办法非常easy。不要再乱涂,而是在那个电话号码周围写入其他起到混淆视听作用可是却无关紧要的电话号码。接下来将全部的3改成8。办法就是在3的左边加个耳朵,同理将1改成7,诸如此类...最后再乱涂一气...可是。你要记住一些信息,那就是这个电话号码在纸上的位置,另外还有数字改写的规则。当你拿到一张被圆珠笔涂得乱七八糟的纸时。对这光找到那个位置的字痕。然后再将数字改写规则逆作用于它。就恢复了原始电话号码,这就是对称加密。我真的就这么干过,当时我和老婆还没有结婚。老婆第一次去我家时留下了如今丈母娘的电话给我爸,我是不希望两方家长取得联系的,于是我就用上述的办法将电话号码改成了一个别的号码(并没实用padding和涂抹的方式。由于加密强度没有必要那么大...),后来我爸真的打电话了,还抱怨,怎么给他留了一个空号...
公钥password学中的素数以及对称加密的更多相关文章
- https原理及其中所包含的对称加密、非对称加密、数字证书、数字签名
声明:本文章已授权公众号Hollis转载,如需转载请标明转载自https://www.cnblogs.com/wutianqi/p/10654245.html(安静的boy) 一.为什么要使用http ...
- java中的数据加密2 对称加密
对称加密 也叫私钥加密. 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密. 需要对加密和解密使用相同密钥的加密算法.由于其速度快,对 ...
- 理解SSL、HTTPS原理中的对称加密与非对称加密
1.对称性加密 双方使用的同一个密钥,既可以加密又可以解密,这种加密方法称为对称加密,也称为单密钥加密. 简单来说就是:加密与解密都是同一个秘钥. 优点:通常在消息发送方需要加密大量数据时使用,算 ...
- 对称加密,非对称加密,数字签名,https
对称加密和非对称加密 对称加密 概念:加密秘钥和解密秘钥使用相同的秘钥(即加密和解密都必须使用同一个秘钥) 特点:一对一的双向保密通信(每一方既可用该秘钥加密,也可用该秘钥解密,非对称加密是多对一的单 ...
- 对称加密、非对称加密、数字签名、数字证书、SSL是什么
非对称密钥加解密 对于一份数据,通过一种算法,基于传入的密钥(一串由数字或字符组成的字符串,也称key),将明文数据转换成了不可阅读的密文,这就是“加密”,同样的,密文到达目的地后,需要再以相应的算法 ...
- 数字签名中公钥和私钥是什么?对称加密与非对称加密,以及RSA的原理
http://baijiahao.baidu.com/s?id=1581684919791448393&wfr=spider&for=pc https://blog.csdn.net/ ...
- RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...
- 大话https演化过程(对称加密、非对称加密、公钥、私钥、数字签名、数字证书)
大话https演化过程(包括概念:对称加密.非对称加密.公钥.私钥.数字签名.数字证书.https访问全过程) 在网络上发送数据是非常不安全的,非常容易被劫持或是被篡改,所以每次定向发送数据你都可 ...
- 几个例子理解对称加密与非对称加密、公钥与私钥、签名与验签、数字证书、HTTPS加密方式
# 原创,转载请留言联系 为什么会出现这么多加密啊,公钥私钥啊,签名啊这些东西呢?说到底还是保证双方通信的安全性与完整性.例如小明发一封表白邮件给小红,他总不希望给别人看见吧.而各种各样的技术就是为了 ...
随机推荐
- Javascript 学习 笔记一
1.操作 HTML 元素 如需从 JavaScript 訪问某个 HTML 元素,您能够使用 document.getElementById(id) 方法. 请使用 &qu ...
- Python之路Day9
摘要: 协程 Select\Poll\Epoll异步IO与事件驱动 Python连接MySQL数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko Twsited网络 ...
- android 根据域名得到IP
public static String GetInetAddress(String host) { String IPAddress = ""; InetAddress Retu ...
- Python 内置函数 range的使用
内置range函数可以用来方便的产生等差的数值序列.如: >>> range(5) [0, 1, 2, 3, 4] >>> range(1,5) [1, 2, 3, ...
- Android学习笔记:ListView简单应用--显示文字列表
在activity中的编写如下代码: final List<String> items = new ArrayList<String>(); //设置要显示的数据,这里因为是例 ...
- Tri_integral Summer Training 8 总结
比赛链接 题目 B C E F G I 这是孟加拉国的区域赛. 开场ss读懂了c发现是个水题,于是去敲,结果手贱wa了一炮,不过很快就修正了错误.B题过了不少,我去读,发现是个水题,意识让Moor敲. ...
- 网络爬虫 kamike.collect
Another Simple Crawler 又一个网络爬虫,可以支持代理服务器的FQ爬取. 1.数据存在mysql当中. 2.使用时,先修改web-inf/config.ini的数据链接相关信息,主 ...
- Vi/VIM键盘图, Vi/vim学习图
Vi/vim学习图 引用: Vi键盘图片可视化教程 http://www.cnblogs.com/me115/archive/2010/11/16/1878295.html 网上的文章易流失.感谢分享 ...
- C++自增和自减运算符(--和++)
在C和C++中,常在表达式中使用自增(++)和自减(--)运算符,他们的作用是使变量的值增1或减1,如:++i(在使用i之前,先使i的值加1,如果i的原值为3,则执行j=++i后,j的值为4)--i ...
- Java I/O流-PipedInputStream、PipedOutputStream
一.整体代码图 PipedStreamDemo.java import java.io.*; class PipedStreamDemo { public static void main(Strin ...