密码学概述

当代社会是一个信息社会。信息的存储和传输是通过载体进行的,如信差就是信件信息的载体。信息保密可以分成载体保密和通信保密两种。对于信件的保密而言,我们不仅要保证信差是称职的,还要保证他人就算获得了信件也不能读懂信件的内容。计算机密码学的研究主要针对于通信保密,而且仅限于数据通信保密。数据在传输的过程中容易受到两种攻击。一种是被动攻击,即从传输信道截取信息;另一种是主动攻击,即直接攻击存放数据的计算机系统。密码技术能很好的应对这两种攻击。

传统的保密通信机制:

传统密码加密和解密的密钥k都是相同的,所以又称对称密码。密钥k一般由发送方通过秘密信道告知接收方。密钥k是一定要保护好的。一旦k被泄露,那攻击者获取密文c后很容易翻译出明文m,获取信息内容。

一般来说,好的加密算法对于算法本身是可以公开的,只要保护好密钥即可保护好信息。当然,将加密算法隐蔽起来会保护该算法设计者的“产权”,也会攻击者带来额外困难。实际上,所有的加密算法都是可以破译的,不存在不可破译的密码,但如果现阶段破译所需的计算能力和破译时间不能满足现实需要,我们也认为这样的密码是安全的。(补充:理论上一次一密是不可破译的,但一次一密很多情况下不实用。)

分组密码

分组密码是一种对固定长度的一组明文进行加密的一种加密算法,它要求明文是固定长度。

Shannon(香农,就是那个大牛,想进一步了解就去百度一下)曾建议过交替使用搅乱和扩散的方法来设计密码。搅乱就是打乱明文,使明文和密文的统计关系尽可能复杂。扩散就是使密文和密钥关系变得毫无统计规律。Feistel加密算法就是使用这个思想的典例。所谓Feistel加密算法是一种乘积型的加密算法。它将2b位的明文均为两部分,低b位记为L0,高b位记为R0,经过n轮迭代操作,最后将得到的低b位Ln和高b位Rn合并即得到2b比特的密文。算法示意图如下:

其中,ki表示低i轮操作时用到的密钥,f叫做轮函数。密钥k1~kn可由加密密钥k产生。可以证明

每一轮的操作示意图如下:


可以证明该算法的正确性。

DES

DES(Data Inbryption Standard)是一种数据加密标准,它是Feistel加密算法的典例。DES要求明文长度为64bit,密钥长度为64位(实际只有56位),其缺点在于密钥太短。

公钥密码

保密通信进入互联网时代,传统密码显示出弊端。传统密码要求通信双方使用的密钥都通过秘密信道私下约定。假设互联网上有n个用户互相之间都要进行保密通信,那么一共需要n*(n-1)/2个密钥。每个用户要保存其他n-1个用户的密码,这是十分不安全的。后来,公钥密码的思想诞生了。

公钥密码的思想是:每个用户有一个加密用的密钥ke和一个解密用的密钥kd,ke公开,kd保密,且ke的公开不会妨碍到kd的安全。这样,互联网上存在的密钥只有2n个,其中n个公开加密密钥,n个用户保密的解密密钥。由于ke≠kd,公钥密码又称为非对称密码。

RSA公钥密码

理论基础:欧拉定理(若整数a和m互素,则a^φ(m) ≡ 1 (mod m),其中φ(m)是比m小但与m互素的正整数的个数

影响密码安全因素:大数的因数分解的困难性   

算法步骤:

注意:发送方选取两素数,公开它们之积,选取e来加密,并计算d,把d秘密告诉接收方。

RSA公钥密码的另一个应用—数字签名

在现实生活中,重要的文件都需要通过签名来生效,互联网上的文件也不例外。数字签名技术是非对称密码的典型应用之一。就拿RSA用于数字签名为例讲述。

先考虑一种简单情形,即文件内容是可公开的。假设文件m要从A发到B,A有公钥eA、私钥dA,B有公钥eB、私钥dB签名可以由发送方通过s=dA(m)生成,即s=m^dA(mod n)。

ElGamal公钥密码

理论基础:求离散对数的困难性

算法步骤:

假设A要向B发送信息,A的公钥为yA,B的公钥为yB私玥为xB

A的加密过程(A选择的数据p、g、xA,A还有B的公钥yB):

①选择一大素数p和GF(p)上的一本原元素g(GF(p)为0~p-1的整数集合,本原元素g即要满足g^k(mod p)覆盖所有1~p-1的数,其中k从0~p-1)。选择A的私玥为xA(xA∈[0,1,2,...,p-1]),计算A的公钥为yA = g^xA mod p,公开yA。设明文 m∈[0,1,2,...,p-1]。

②选取0~p-1上的任一整数x,计算c1=g^x mod p

③计算K=yB^x mod p

④计算c2=K*m mod p

⑤将(c1,c2)作为密文发送给B

B的解密过程(B有数据c1、c2、xB):

①计算K=c1^xB mod p

②计算K^(-1) mod p

③计算(②的结果*c2) mod p

大数的模幂运算

无论RSA还是ElGamal都需要作大数的模幂运算,这个操作的效率对于整个算法是至关重要的。

大数的是以进制的格式表示的。加减法和乘法类似于小学笔算的过程。除法运算时很耗时的,处理具体问题时我们常先尝试看能否把除法化成加减乘来运算。

平方运算可以由乘法运算进行优化:


由于两个相同的数相乘,总有些位的乘法是重复的,所以上例我们可以做三轮运算(①②③),①只需做三次乘法cc、bc、ac,②只需做两次乘法bb、ab,③需做乘法aa。

模幂算法直接影响着RSA算法的性能。在做x^r mod p时,我们常依照降次的思想这样做:

①当r为偶数时,原式 = [x^(r/2) * x^(r/2)] mod p = [x^(r/2)mod p]^2 mod p(模运算有性质:(a * b) % p = (a % p * b % p) % p),难点转移到求x^(r/2) mod p),继续判定r/2的奇偶性;

②当r为奇数时,原式 = [x^(r-1) * x] mod p = [x^(r-1) mod p * x mod p] mod p,难点转移到x^(r-1) mod p),r-1为偶数。

结果若干步①②,问题就转移到求若干次mod p的问题上,这是计算机很快就能计算出来的。

求模运算

上面我们提到求x^r mod p可以化成若干次求x mod p,当x和p很小时,我们很通过X =  W mod M = W -  M *  (W / M)求得,但当x和p很大时,除法消耗太高,我们就需要更快的求模算法了。这里我们介绍一种快速求模算法—Barrett模缩减算法。算法流程如下:


因为数据都是以b进制的形式表示的,对于算法过程中出现的除法要理解成保留高位,模运算要理解成取低位,而不是真的去做除法和模运算。

算法的核心思想是逼近思想。具体可参考文献[IMPLEMENTING THERIVEST SHAMIR  AND ADLEMAN PUBLIC KEYENCRYPTION ALGORITHM ON  A STANDARDDIGITAL SIGNAL  PROCESSOR Paul Barrett, MSc (Oxon) COMPUTERSECURITY LTD August  1986]。

大素数的判定

要判定一个数是素数比较难,但判定一个数不是素数比较容易,所以对于一个大数,我们通过多轮使用概率测试法来判定一个数是不是素数。如果某一轮判定不是素数,则一定不是素数;如果经过若干轮都判定是素数,那么是素数的概率就非常大(比如一轮的把非素数判定为素数的误判率为0.1%,那么3轮的误判率仅为0.001%)。

Miller-Rabin概率测试法

算法核心-费马小定理: 
即如果一个数n 它的 a^(n-1)%n !=1 (0<a<n) 则它一定是合数。如果 a^(n-1)%n ==1 (0<a<n) 则它可能是合数可能是素数。
算法步骤:
1 随机取一个 a 
2 如果 它不满足 a^(n-1)%n ==1 
3 则它一定是 合数 
4 退出 
5 如果它满足 a^(n-1)%n ==1 
6 则它是一个素数的概率是1/2 
7 回到 1 
结果:如果对这个过程重复50次,每次都没说它是合数,那这个数是素数的概率是多少?它只有(1/2)^50可能不是素数!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值