在公元前,秘密书信已用于战争之中。西洋“史学之父”希罗多德(Herodotus)的《历史》(The Histories)当中记载了一些最早的秘密书信故事。公元前5世纪,希腊城邦为对抗奴役和侵略,与波斯发生多次冲突和战争。
于公元前480年,波斯秘密集结了强大的军队,准备对雅典(Athens)和斯巴达(Sparta)发动一次突袭。希腊人狄马拉图斯在波斯的苏萨城里看到了这次集结,便利用了一层蜡把木板上的字遮盖住,送往并告知了希腊人波斯的图谋。最后,波斯海军覆没于雅典附近的沙拉米斯湾(Salamis Bay)。
由于古时多数人并不识字,最早的秘密书写的形式只用到纸笔或等同物品,随着识字率提高,就开始需要真正的密码学了。最古典的两个加密技巧是:
1、置换(Transposition cipher):将字母顺序重新排列,例如‘help me’变成‘ehpl em’。
2、替代(substitution cipher):有系统地将一组字母换成其他字母或符号,例如‘fly at once’变成‘gmz bu podf’(每个字母用下一个字母取代)。
扩展资料:
进行明密变换的法则,称为密码的体制。指示这种变换的参数,称为密钥。它们是密码编制的重要组成部分。密码体制的基本类型可以分为四种:
1、错乱——按照规定的图形和线路,改变明文字母或数码等的位置成为密文;
2、代替——用一个或多个代替表将明文字母或数码等代替为密文;
3、密本——用预先编定的字母或数字密码组,代替一定的词组单词等变明文为密文;
4、加乱——用有限元素组成的一串序列作为乱数,按规定的算法,同明文序列相结合变成密文。
以上四种密码体制,既可单独使用,也可混合使用 ,以编制出各种复杂度很高的实用密码。
参考资料来源:百度百科—密码学
培根密码
弗朗西斯·培根,英国人,他是第一个意识到科学技术能够改变世界面貌的哲学家。他不仅意识到这一点,而且积极投入到科学技术的探索中。他对密码学的兴趣很浓,设计出的密码也丰富了密码学的内容。
他设计的密码非常独特,它可以不加过多的“雕饰”,几乎以本来的“素面”在你眼前晃过,而不会引起你的注意。
培根所用的密码是一种本质上用二进制数设计的。不过,他没有用通常的0和1来表示,而是采用a和b。下面是他设计的26个英文字母二进制表示法。
A aaaaa
B aaaab
C aaaba
D aaabb
E aabaa
F aabab
G aabba
H aabbb
I abaaa
J abaab
K ababa
L ababb
M abbaa
N abbab
O abbba
P abbbb
Q baaaa
R baaab
S baaba
T baabb
U babaa
V babab
W babba
X babbb
Y bbaaa
Z bbaab
编写密码时,把密文每五个字母为一组,凡是其中的正体字母代表a,斜体字母代表b。随意选取句子或文章,就可以通过改变字母的写法来加密了。
此外,还有
字母表顺序-数字
进制转换密码
Mod算法
倒序
间隔
字母频率
凯撒密码(Caesar Shifts, Simple Shift)
凯撒移位(中文版)
栅栏密码(The Rail-Fence Cipher)
维吉尼亚密码(Vigenère Cipher)
Polybius密码(Polybius Cipher)
ADFGX/ADFGVX密码(ADFGX/ADFGVX Cipher)
ADFGX
ADFGVX
乘法密码(Multiplication Cipher)
仿射密码(Affine Shift)
希尔密码(Hill Cipher)
加密
解密
Playfair密码(Playfair Cipher)
摩斯电码
置换密码(Transposition Cipher)
替代密码(Monoalphabetic Substitution)
字母表数字
字母表代码
反字母表
随机乱序字母
棋盘密码
键盘密码
键盘移位
软键盘密码
数字小键盘密码
手机键盘密码
数字谐音密码
数字记忆编码
百度/Google/网页字符
百度字符(GB2312)
Google字符(URI)
网页编码(Unicode)
Alt+数字小键盘
MD5
超字数不一一解释了。可以百度。
公钥密码又称为双钥密码和非对称密码,是1976年由Daffy和Hellman在其“密码学新方向”一文中提出的,见划时代的文献:
W.Diffie and M.E.Hellman, New Directrions in Cryptography, IEEE Transaction on Information Theory, V.IT-22.No.6, Nov 1976, PP.644-654
单向陷门函数是满足下列条件的函数f:
(1)给定x,计算y=f(x)是容易的;
(2)给定y, 计算x使y=f(x)是困难的。
(所谓计算x=f-1(Y)困难是指计算上相当复杂,已无实际意义。)
(3)存在δ,已知δ 时,对给定的任何y,若相应的x存在,则计算x使y=f(x)是容易的。
注:1*. 仅满足(1)、(2)两条的称为单向函数;第(3)条称为陷门性,δ 称为陷门信息。
2*. 当用陷门函数f作为加密函数时,可将f公开,这相当于公开加密密钥。此时加密密钥便称为公开钥,记为Pk。 f函数的设计者将δ 保密,用作解密密钥,此时δ 称为秘密钥匙,记为Sk。由于加密函数时公开的,任何人都可以将信息x加密成y=f(x),然后送给函数的设计者(当然可以通过不安全信道传送);由于设计者拥有Sk,他自然可以解出x=f-1(y)。
3*.单向陷门函数的第(2)条性质表明窃听者由截获的密文y=f(x)推测x是不可行的。
Diffie和Hellman在其里程碑意义的文章中,虽然给出了密码的思想,但是没有给出真正意义上的公钥密码实例,也既没能找出一个真正带陷门的单向函数。然而,他们给出单向函数的实例,并且基于此提出Diffie-Hellman密钥交换算法。这个算法是基于有限域中计算离散对数的困难性问题之上的:设F为有限域,g∈ F是F的乘法群F*=F\{0}=g。并且对任意正整数x,计算gx是容易的;但是已知g和y求x使y= gx,是计算上几乎不可能的。这已问题称为有限域F上的离散对数问题。公钥密码学种使用最广泛的有限域为素域FP.
对Diffie-Hellman密钥交换协议描述:Alice和Bob协商好一个大素数p,和大的整数g,1gp,g最好是FP中的本原元,即FP*=g。p和g无须保密,可为网络上的所有用户共享。
当Alice和Bob要进行保密通信时,他们可以按如下步骤来做:
(1)Alice送取大的随机数x,并计算
X=gx(mod P)
(2)Bob选取大的随机数x,并计算X = gx (mod P)
(3)Alice将X传送给Bob;Bob将X 传送给Alice。
(4)Alice计算K=(X )X(mod P);Bob计算K =(X) X (mod P),易见,K=K =g xx (mod P)。
由(4)知,Alice和Bob已获得了相同的秘密值K。双方以K作为加解密钥以传统对称密钥算法进行保密通信。
注:Diffie-Hellman密钥交换算法拥有美国和加拿大的专利。
3 RSA公钥算法
RSA公钥算法是由Rivest,Shamir和Adleman在1978年提出来的(见Communitions of the ACM. Vol.21.No.2. Feb. 1978, PP.120-126)该算法的数学基础是初等数论中的Euler(欧拉)定理,并建立在大整数因子的困难性之上。
将Z/(n)表示为 Zn,其中n=pq; p,q为素数且相异。若
Z*n{g∈ Zn|(g,n)=1},易见Z*n为 (n)阶的乘法群,且有 g (n)1(mod n),而 (n)=(p-1)(q-1).
RSA密码体制描述如下:
首先,明文空间P=密文空间C=Zn.(见P175).
A.密钥的生成
选择p,q,p,q为互异素数,计算n=p*q, (n)=(p-1)(q-1), 选择整数e使( (n),e)=1,1e (n)),计算d,使d=e-1(mod (n))),公钥Pk={e,n};私钥Sk={d,p,q}。
注意,当0Mn时,M (n) =1(mod n)自然有:
MK (n)+1M(mod n), 而ed 1 (mod (n)),易见(Me)d M(mod n)
B.加密 (用e,n)明文:Mn 密文:C=Me(mod n).
C.解密 (用d,p,q)
密文:C 明文:M=Cd(mod n)
注:1*, 加密和解密时一对逆运算。
2*, 对于0Mn时,若(M,n) ≠ 1,则M为p或q的整数倍,假设M=cp,由(cp,q)=1 有 M (q) 1(mod q) M (q) (p) 1(mod q)
有M (q) = 1+kq 对其两边同乘M=cp有
有M (q)+1=M+kcpq=M+kcn于是
有M (q)+1 M(mod n)
例子:若Bob选择了p=101和q=113,那么,n=11413, (n)=100×112=11200;然而11200=26×52×7,一个正整数e能用作加密指数,当且仅当e不能被2,5,7所整除(事实上,Bob不会分解φ(n),而且用辗转相除法(欧式算法)来求得e,使(e, φ(n)=1)。假设Bob选择了e=3533,那么用辗转相除法将求得:
d=e -1 6597(mod 11200), 于是Bob的解密密钥d=6597.
Bob在一个目录中公开n=11413和e=3533, 现假设Alice想发送明文9726给Bob,她计算:
97263533(mod 11413)=5761
且在一个信道上发送密文5761。当Bob接收到密文5761时,他用他的秘密解密指数(私钥)d=6597进行解密:57616597(mod 11413)=9726
注:RSA的安全性是基于加密函数ek(x)=xe(mod n)是一个单向函数,所以对的人来说求逆计算不可行。而Bob能解密的陷门是分解n=pq,知 (n)=(p-1)(q-1)。从而用欧氏算法解出解密私钥d.
4 RSA密码体制的实现
实现的步骤如下:Bob为实现者
(1)Bob寻找出两个大素数p和q
(2)Bob计算出n=pq和 (n)=(p-1)(q-1).
(3)Bob选择一个随机数e(0e (n)),满足(e, (n))=1
(4)Bob使用辗转相除法计算d=e-1(mod (n))
(5)Bob在目录中公开n和e作为她的公开钥。
密码分析者攻击RSA体制的关键点在于如何分解n。若分
解成功使n=pq,则可以算出φ(n)=(p-1)(q-1),然后由公
开的e,解出秘密的d。(猜想:攻破RSA与分解n是多项式
等价的。然而,这个猜想至今没有给出可信的证明!!!)
于是要求:若使RSA安全,p与q必为足够大的素数,使
分析者没有办法在多项式时间内将n分解出来。建议选择
p和q大约是100位的十进制素数。 模n的长度要求至少是
512比特。EDI攻击标准使用的RSA算法中规定n的长度为
512至1024比特位之间,但必须是128的倍数。国际数字
签名标准ISO/IEC 9796中规定n的长度位512比特位。
为了抵抗现有的整数分解算法,对RSA模n的素因子
p和q还有如下要求:
(1)|p-q|很大,通常 p和q的长度相同;
(2)p-1 和q-1分别含有大素因子p1和q1
(3)P1-1和q1-1分别含有大素因子p2和q2
(4)p+1和q+1分别含有大素因子p3和q3
为了提高加密速度,通常取e为特定的小整数,如EDI国际标准中规定 e=216+1,ISO/IEC9796中甚至允许取e=3。这时加密速度一般比解密速度快10倍以上。 下面研究加解密算术运算,这个运算主要是模n的求幂运算。著名的“平方-和-乘法”方法将计算xc(mod n)的模乘法的数目缩小到至多为2l,这里的l是指数c的二进制表示比特数。若设n以二进制形式表示有k比特,即k=[log2n]+1。 由l≤ k,这样xc(mod n)能在o(k3)时间内完成。(注意,不难看到,乘法能在o(k2)时间内完成。)
平方-和-乘法算法:
指数c以二进制形式表示为:
c=
Xc=xc0×(x2)c1×…×(x2t-1)ct-1
预计算: x2=xx
x4=x22=x2x2
.
.
.
x2t-1 =x2t-2*x2t-2
Xc计算:把那些ci=1对应的x2i全部乘在一起,便得xc。至
多用了t-1次乘法。请参考书上的177页,给出计算
xc(mod n)算法程序:
A=xc c=c0+c12+..+ct-12t-1= [ct-1,....,c1,c0]2
5 RSA签名方案
签名的基本概念
传统签名(手写签名)的特征:
(1)一个签名是被签文件的物理部分;
(2)验证物理部分进行比较而达到确认的目的。(易伪造)
(3)不容易忠实地“copy”!!!
定义: (数字签名方案)一个签名方案是有签署算法与验
证算法两部分构成。可由五元关系组(P,A,K,S,V)来刻化:
(1)P是由一切可能消息(messages)所构成的有限集合;
(2)A是一切可能的签名的有限集合;
(3)k为有限密钥空间,是一些可能密钥的有限集合;
(4)任意k ∈K,有签署算法Sigk ∈ S且有对应的验证算法Verk∈V,对每一个
Sigk:p A 和Verk:P×A {真,假} 满足条件:任意x∈ P,y∈ A.有签名方案的一个签名:Ver(x,y)= {
注:1*.任意k∈K, 函数Sigk和Verk都为多项式时间函数。
2*.Verk为公开的函数,而Sigk为秘密函数。
3*.如果坏人(如Oscar)要伪造Bob的对X的签名,在计算上是不可能的。也即,给定x,仅有Bob能计算出签名y使得Verk(x,y)=真。
4*.一个签名方案不能是无条件安全的,有足够的时间,Oscar总能伪造Bob的签名。
RSA签名:n=pq,P=A=Zn,定义密钥集合K={(n,e,p,q,d)}|n=pq,d*e1(mod (n))}
注意:n和e为公钥;p,q,d为保密的(私钥)。对x∈P, Bob要对x签名,取k∈K。Sigk(x) xd(mod n)y(mod n)
于是
Verk(x,y)=真 xye(mod n)
(注意:e,n公开;可公开验证签名(x,y)对错!!也即是否为Bob的签署)
注:1*.任何一个人都可对某一个签署y计算x=ek(y),来伪造Bob对随机消息x的签名。
2*.签名消息的加密传递问题:假设Alice想把签了名的消息加密送给Bob,她按下述方式进行:对明文x,Alice计算对x的签名,y=SigAlice(x),然后用Bob的公开加密函数eBob,算出
Z=eBob(x,y) ,Alice 将Z传给Bob,Bob收到Z后,第一步解密,
dBob(Z)=dBobeBob(x,y)=(x,y)
然后检验
VerAlice(x,y)= 真
问题:若Alice首先对消息x进行加密,然后再签名,结果
如何呢?Y=SigAlice(eBob(x))
Alice 将(z,y)传给Bob,Bob先将z解密,获取x;然后用
VerAlice检验关于x的加密签名y。这个方法的一个潜在问
题是,如果Oscar获得了这对(z,y),他能用自己的签名来
替代Alice的签名
y=SigOscar(eBob(x))
(注意:Oscar能签名密文eBob(x),甚至他不知明文x也能做。Oscar传送(z,y )给Bob,Bob可能推断明文x来自Oscar。所以,至今人么还是推荐先签名后加密。)
6.EIGamal方案
EIGamal公钥密码体制是基于离散对数问题的。设P
至少是150位的十进制素数,p-1有大素因子。Zp为有限域,
若α为Zp中的本原元,有Zp* =α。若取β∈Zp*=Zp\{0},
如何算得一个唯一得整数a,(要求,0≤a≤ p-2),满足
αa=β(mod p)
将a记为a=logαβ
一般来说,求解a在计算上是难处理的。
Zp*中的Egamal公钥体制的描述:设明文空间为P=Zp*,密文空
间为C=Zp*×Zp*,定义密钥空间K={(p, α,a, β )|β=αa(mod p)}
公开钥为:p, α ,β
秘密钥(私钥):a
Alice 取一个秘密随机数k∈ Zp-1,对明文x加密
ek(x,k)=(y1,y2)
其中, y1=αk(mod p),y2=xβk(mod p)
Bob解密,
dk(y1,y2)=y2(y1α)-1(mod p)
注:1*.容易验证y2(y1α)-1=x(αa)k(αka)-1=x !!
2*.利用EIGamal加密算法可给出基于此的签名方案:
Alice 要对明文x进行签名,她首先取一个秘密随机数k作
为签名
Sigk(x,k)=( , )
其中 =αk(mod p), =(x-a )k-1(mod p-1)
对x, ∈Zp*和 ∈ Zp-1,定义Verk(x, ,)=真等价于
βα=αx(mod p)
要说明的是,如果正确地构造了这个签名,那么验证将
是成功的,因为
βα= αa αk (mod p)= αa+k (mod p)
由上面知道, =(x- a)k-1(mod p-1)可以推出
k=x- a(mod p-1)有a+kx(mod p)
所以 β = αx (mod p)
该签名方案已经被美国NIST(国家标准技术研究所)确定为签名标准(1985)。
有关RSA方面的内容,请访问网址: