现代密码学考试总结 本文关键词:密码学,考试
现代密码学考试总结 本文简介:密码主要功能:1.机密性:指保证信息不泄露给非授权的用户或实体,确保存储的信息和传输的信息仅能被授权的各方得到,而非授权用户即使得到信息也无法知晓信息内容,不能使用。2.完整性:是指信息未经授权不能进行改变的特征,维护信息的一致性,即信息在生成、传输、存储和使用过程中不应发生人为或非人为的非授权篡改
现代密码学考试总结 本文内容:
密码主要功能:
1.
机密性:指保证信息不泄露给非授权的用户或实体,确保存储的信息和传输的信息仅能被授权的各方得到,而非授权用户即使得到信息也无法知晓信息内容,不能使用。
2.
完整性:是指信息未经授权不能进行改变的特征,维护信息的一致性,即信息在生成、传输、存储和使用过程中不应发生人为或非人为的非授权篡改(插入、替换、删除、重排序等),如果发生,能够及时发现。
3.
认证性:是指确保一个信息的来源或源本身被正确地标识,同时确保该标识的真实性,分为实体认证和消息认证。
消息认证:向接收方保证消息确实来自于它所宣称的源;
实体认证:参与信息处理的实体是可信的,即每个实体的确是它所宣称的那个实体,使得任何其它实体不能假冒这个实体。
4.
不可否认性:是防止发送方或接收方抵赖所传输的信息,要求无论发送方还是接收方都不能抵赖所进行的行为。因此,当发送一个信息时,接收方能证实该信息的确是由所宣称的发送方发来的;当接收方收到一个信息时,发送方能够证实该信息的确送到了指定的接收方。
信息安全:指信息网络的硬件、软件及其系统中的数据受到保护,不受偶然的或者恶意的原因而遭到破坏、更改、泄露、否认等,系统连续可靠正常地运行,信息服务不中断。
信息安全的理论基础是密码学,根本解决,密码学理论
对称密码技术——分组密码和序列密码——机密性;
消息认证码——完整性,认证性;
数字签名技术——完整性,认证性,不可否认性;
1949年Shannon发表题为《保密系统的通信理论》
1976年后,美国数据加密标准(DES)的公布使密码学的研究公开,密码学得到了迅速发展。
1976年,Diffe和Hellman发表了《密码学的新方向》,提出了一种新的密码设计思想,从而开创了公钥密码学的新纪元。
置换密码
置换密码的特点是保持明文的所有字符不变,只是利用置换打乱了明文字符的位置和次序。
列置换密码和周期置换密码
使用密码设备必备四要素:安全、性能、成本、方便。
密码体制的基本要求:
1.
密码体制既易于实现又便于使用,主要是指加密函数和解密函数都可以高效地计算。
2.
密码体制的安全性是依赖密钥的安全性,密码算法是公开的。
3.
密码算法安全强度高,也就是说,密码分析者除了穷举搜索攻击外再找不到更好的攻击方法。
4.
密钥空间应足够大,使得试图通过穷举密钥空间进行搜索的方式在计算上不可行。
密码算法公开的意义:
?有利于增强密码算法的安全性;
?有利于密码技术的推广应用;
?有利于增加用户使用的信心;
?有利于密码技术的发展。
熵的性质:H(X,Y)=H(Y)+H(X|Y)=H(X)+H(Y|X)
H(K|C)=H(K)+H(P)-H(C)
密码攻击类型
?惟密文攻击(Ciphertext
Only
Attack)
(仅仅搭线窃听)
密码分析者除了拥有截获的密文外(密码算法是公开的,以下同),没有其它可以利用的信息。
?已知明文攻击(Known
Plaintext
Attack)
(有内奸)
密码分析者不仅掌握了相当数量的密文,还有一些已知的明-密文对可供利用。
?选择明文攻击(Chosen
Plaintext
Attack)
(暂时控制加密机)
密码分析者不仅能够获得一定数量的明-密文对,还
可以选择任何明文并在使用同一未知密钥的情况下能得到相应的密文。
?选择密文攻击(Chosen
Ciphertext
Attack)
(暂时控制解密机)
密码分析者能选择不同被加密的密文,并还可得到对应的明文,密码分析者的任务是推出密钥及其它密文对应的明文。
?选择文本攻击(Chosen
Text
Attack)
(暂时控制加密机和解密机)
它是选择明文攻击和选择密文攻击的组合,即密码分析者在掌握密码算法的前提下,不仅能够选择明文并得到对应的密文,而且还能选择密文得到对应的明文。
攻击密码体制的常用方法
?穷举攻击
?统计分析攻击
?数学分析攻击
密码体制安全性:无条件安全性,计算安全性,可证明安全性
分组密码的要求:
?
分组长度要足够大
?
密钥量要足够大
?
密码变换足够复杂
?
加密和解密运算简单
?
无数据扩展或压缩
分组密码的设计思想(扩散和混乱)
扩散:是指要将算法设计成明文每一比特的变化尽可能多地影响到输出密文序列的变化,以便隐蔽明文的统计特性。形象地称为雪崩效应。扩散的另一层意思是密钥每一位的影响尽可能迅速地扩展到较多的密文比特中去。
混乱:指在加解密变换过程中明文、密钥以及密文之间的关系尽可能地复杂化,以防密码破译者采用解析法(即通过建立并求解一些方程)进行破译攻击。分组密码算法应有复杂的非线性因素。
轮函数基本准则:非线性,可逆性,雪崩效应
DES
分组加密算法:明文和密文为64位分组长度。密钥长度:56位
采用混乱和扩散的组合,每个组合先代换后置换,共16轮。
互补性会使DES在选择明文攻击下所需的工作量减半。
如果给定初始密钥k,经子密钥产生器产生的各个子密钥都相同,即有k1=k2=…=k16,则称给定的初始密钥k为弱密钥。
若k为弱密钥,则对任意的64bit信息有:Ek(Ek(m))=m和Dk(Dk(m))=m。
若给定初始密钥k,产生的16个子密钥只有两种,且每种都出现8次,则称k为半弱密钥。
半弱密钥的特点是成对出现,且具有下述性质:若k1和k2为一对半弱密钥,m为明文组,则有:Ek2(Ek1(m))=Ek1(Ek2(m))=m。
差分分析:是分析一对给定明文的异或(对应位不同的个数称为差分)与对应密文对的异或之间的统计相关性。
3DES特点:
优点:1.
密钥长度增加到112位或168位,克服了DES面临的穷举攻击。
2.
相对于DES,增强了抗差分分析和线性分析等的能力。
3.
由于DES已经大规模使用,升级到3DES比更新新算法成本小得多。
4.
DES比其它任何加密算法受到的分析时间都长的多,相应地,3DES抗
分析能力更强。
不足:1.
3DES处理速度较慢。
2.
虽然密钥长度增加了,但明文分组长度没变,与密钥长度的增长不匹
配。
AES分组长度、密钥长度、轮数的关系:
分组长度:128位
密钥长度,轮数:128,10;192,12;256,14
每轮由四个阶段组成:字节代换、行位移、列混淆、轮密钥加。
DES是面向比特的运算,AES是面向字节的运算。
二重DES并不像人们相像那样可提高密钥长度到112比特,而相当57比特。
分组密码的操作模式
ECB:
模式操作简单,主要用于内容较短且随机的报文的加密传递;
相同明文(在相同密钥下)得出相同的密文,即明文中的
重复内容可能将在密文中表现出来,易实现统计分析攻击、分组重放攻击和代换攻击;
链接依赖性:各组的加密都独立于其它分组,可实现并行处理;
错误传播:单个密文分组中有一个或多个比特错误只会影响该分组的解密结果。
CBC(密文分组和明文分组异或得到下一个密文分组)
一种反馈机制在分组密码中的应用,每个密文分组不仅依赖于产生它的明文分组,还依赖于它前面的所有分组;
?
相同的明文,即使相同的密钥下也会得到不同的密文分组,隐藏了明文的统计特性;
?
链接依赖性:对于一个正确密文分组的正确解密要求它之前的那个密文分组也正确,不能实现并行处理;
?
错误传播:密文分组中的一个单比特错误会影响到本组和其后分组的解密,错误传播为两组;
?
初始化向量IV不需要保密,它可以明文形式与密文一起传送。
CTR:
效率高:能够并行处理多块明(密)文,可用来提供像流水线、每个时钟周期的多指令分派等并行特征;
?
预处理:基本加密算法的执行并不依靠明文或密文的输入,可预先处理,当给出明文或密文时,所需的计算仅是进行一系列的异或运算;
?
随机访问:密文的第i个明文组能够用一种随机访问的方式处理;
?
简单性:只要求实现加密算法而不要求实现解密算法,像AES这类加解密算法不同就更能体现CTR的简单性。
CFB:
消息被看作bit流,不需要整个数据分组在接受完后才能进
行加解密;
?
可用于自同步序列密码;
?
具有CBC模式的优点;
?
对信道错误较敏感且会造成错误传播;
?
数据加解密的速率降低,其数据率不会太高。
OFB:
OFB模式是CFB模式的一种改进,克服由错误传播带来的问题,但对密文被篡改难于进行检测;
OFB模式不具有自同步能力,要求系统保持严格的同步,否则难于解密;
?
初始向量IV无需保密,但各条消息必须选用不同的IV。
总结:
ECB是最快、最简单的分组密码模式,但它的安全性最弱,一般不推荐使用ECB加密消息,但如果是加密随机数据,如密钥,ECB则是最好的选择。
?CBC适合文件加密,而且有少量错误时不会造成同步失败,是软件加密的最好选择。
?CTR结合ECB和CBC的优点,最近为人们所重视,在ATM网络和IPSec中起了重要作用。
?CFB通常是加密字符序列所选择的模式,它也能容忍少量错误扩展,且具有同步恢复功能。
?OFB是在极易出错的环境中选用的模式,但需有高速同步机制。
序列密码属于对称密码体制,又称为流密码。
特点:ü
1.
加解密运算只是简单的模二加(异或)运算。
2.
密码安全强度主要依赖密钥序列的安全性。
密钥序列产生器(KG)基本要求:
种子密钥K的长度足够长,一般应在128位以上(抵御穷举攻击);
ü
密钥序列产生器KG生成的密钥序列{ki}具极大周期;
ü
密钥序列{ki}具有均匀的n-元分布,即在一个周期内,某特定形式的n-长bit串与其求反,两者出现的频数大抵相当;
ü
由密钥序列{ki}提取关于种子密钥K的信息在计算上不可行;
ü
雪崩效应。即种子密钥K任一位的改变要引起密钥序列{ki}在全貌上的变化;
ü
密钥序列{ki}不可预测的。密文及相应的明文的部分信息,不能确定整个密钥序列{ki}
。
只要选择合适的反馈函数才可使序列的周期达到最大值2n
-1,周期达到最大值的序列称为m序列。
m-序列特性:0,1平衡性:在一个周期内,0、1出现的次数分别为2n-1-1和2n-1。
游程特性:
在一个周期内,总游程数为2n-1;对1≤i≤n-2,长为i的游程有2n-i-1个,且0、1游程各半;长为n-1的0游程一个,长为n的1游程一个。
非线性序列:为了使密钥流生成器输出的二元序列尽可能随机,应保证其周期尽可能大、线性复杂度和不可预测性尽可能高。
RC4是RSA数据安全公司开发的可变密钥长度的序列密码,是世界上使用最广泛的序列密码之一.
为了保证安全强度,目前的RC4至少使用128位种子密钥。
序列密码特点:
安全强度取决于密钥序列的随机性;
?
线性反馈移位寄存器理论上能够产生周期为2n-1的伪随机序列,有较理想的数学分析;
?
为了使密钥流尽可能复杂,其周期尽可能长,复杂度和不可预测尽可能高,常使用多个LFSR构造非线性组合系统;
?
在某些情况下,譬如缓冲不足或必须对收到字符进行逐一处理时,序列密码就显得更加必要和恰当。
?
在硬件实施上,不需要有很复杂的硬件电路,实时性好,加解密速度快,序列密码比分组密码更有优势。
公钥密码之前:都是基于代换和换位这两个基本方法,建立在字符或位方式的操作上。
公钥密码算法是建立在数学函数基础上的,而不是建立在字符或位方式的操作上的,是以非对称的形式使用加密密钥和解密密钥,这两个密钥的使用对密钥管理、认证等都有着深刻的实际意义。
对称密码缺陷:秘钥分配问题,秘钥管理问题,数字签名问题;
背包算法是第一个公开秘钥算法。
RSA:
RSA虽稍后于MH背包公钥系统,但它是到目前为止应用最广的一种公钥密码。RSA的理论基础是数论的欧拉定理,它的安全性依赖于大整数的素因子分解的困难性。
欧拉定理:若整数a
和n
互素,则aφ(n)
≡
1
(mod
n)
RSA秘钥长度1024位。
ElGamal公钥密码基于有限域上离散对数问题的公钥密码体制。
基于有限域的离散对数公钥密码又称ElGamal
(厄格玛尔)算法。
ElGamal算法的安全性依赖于计算有限域上的离散对数。
ElGamal算法的离散对数问题等同RSA的大数分解问题。
ElGamal算法既可用于数字签名又可用于加密,但更多地应
用在数字签名中。
目前密钥长度1024位是安全的。
ECC安全性能更高(160位等同RSA的1024位)
公钥密码学解决了秘钥分发和不可否认问题。
公钥证书较好地解决了公钥的真实性问题。
IBE(基于身份加密)
基于身份的密码系统中,用户的公钥是一些公开的可以唯一确定用户身份的信息,一般这些信息称为用户的身份(ID)。在实际应用中,用户的身份可以是姓名、电话号码、身份证号码、IP
地址、电子邮件地址等作为公钥。用户的私钥通过一个被称作私钥生成器PKG(Private
Key
Generator)的可信任第三方进行计算得到。
在这个系统中,用户的公钥是一些公开的身份信息,其他用户不需要在数据库中查找用户的公钥,也不需要对公钥的真实性进行检验。
优点:
公钥的真实性容易实现,大大简化了公钥的管理。
不足:
身份确认本来就是一件复杂的事情,尤其用户数量很大时难以保证。也就是说,IBE适合应用于用户群小的场合。
可信第三方如何安全地将用户的私钥送到用户的手中。
?
用户私钥由可信第三方生成和掌握,不具备唯一性,实现不可否认性时易引发争议。
公钥密码的优点(与对称密码相比)
1.
密钥分发简单;
2.
需秘密保存的密钥量减少;
3.
可以实现数字签名和认证的功能。
公钥密码的不足(与对称密码相比)
公钥密码算法比对称密码算法慢;
?
公钥密码算法提供更多的信息对算法进行攻击,如公钥密码算法对选择明文攻击是脆弱的,尤其明文集比较小时;
有数据扩展;
?
公钥密码算法一般是建立在对一个特定的数学难题求解上,往往这种困难性只是一种设想。
哈希函数:
单向性,输出长度固定,:数据指纹,实现数据完整性和数字签名。
性质:ü
输入:消息是任意有限长度。
输出:哈希值是固定长度。
容易计算:对于任意给定的消息,容易计算其哈希值。(正向容易)
单向性:对于给定的哈希值h,要找到M使得H(M)=h在计算上是不可行的。(逆向不可行)
安全性:
抗弱碰撞性:对于给定的消息M1,要发现另一个消息M2,满足H(M1)=H(M2)在计算上是不可行的。
抗强碰撞性:找任意一对不同的消息M1,M2
,使H(M1)=H(M2
)在计算上是不可行的。
随机性:当一个输入位发生变化时,输出位将发生很大变化。(雪崩效应)。
MD:
MD2(1989)、MD4(1990)和MD5(1991)都产生一个128位的信息摘要。
SHA-1接受任何有限长度的输入消息,并产生长度为160比特的Hash值。
消息验证的目的:
验证信息的来源是真实的,而不是冒充的,此为消息源认证。
验证消息的完整性,即验证信息在传送或存储过程中是否被修改。
哈希函数分类:
改动检测码MDC:不带密钥的哈希函数,主要用于消息完整性。
消息认证码MAC:带密钥的哈希函数,主要用于消息源认证和消息完整性。
HMAC:
算法公式
:
HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M))
K—代表认证密码
HMAC主要应用在身份验证中,它的使用方法是这样的:
(1)
客户端发出登录请求(假设是浏览器的GET请求)
(2)
服务器返回一个随机值,并在会话中记录这个随机值
(3)
客户端将该随机值作为密钥,用户密码进行HMAC运算,然后提交给服务器
(4)
服务器读取用户数据库中的用户密码和步骤2中发送的随机值做与客户端一样的HMAC运算,然后与用户发送的结果比较,如果结果一致则验证用户合法
在这个过程中,可能遭到安全攻击的是服务器发送的随机值和用户发送的HMAC结果,而对于截获了这两个值的黑客而言这两个值是没有意义的,绝无获取用户密码的可能性,随机值的引入使HMAC只在当前会话中有效,大大增强了安全性和实用性。
数字签名与消息认证不同:
数字签名也是一种消息认证技术,它属于非对称密码体制,消息认证码属于对称密码体制,所以消息认证码的处理速度比数字签名快得多。但是,消息认证码无法实现不可否认性。
数字签名的安全要求
ü
签名是可以被验证的接受者能够核实签名者对消息的签名。
签名是不可伪造的
除了签名者,任何人(包括接受者)不能伪造消息的签名。
签名是不可重用的
同一消息不同时刻其签名是有区别的。
签名是不可抵赖的
签名者事后不能抵赖对消息的签名,出现争议时,第三方可解决争端。
数字签名的组成:明文空间,密文空间,秘钥空间,签名算法,验证算法
数字签名常见的实现算法
基于RSA的签名算法
基于离散对数的签名算法
?
基于ECC的签名算法
RSA数字签名算法(初始化)
1.
选取两个大(满足安全要求)素数p和q,两个数长度接近且相差很大,强素数。
2.
计算n=p*q,φ(n)=(p-1)(q-1)
3.
随机选取整数e(1 = 1 4. 计算d,满足d*e ≡ 1(mod φ(n)) 注:n公开, p和q保密。 e为公钥,d为私钥。 签名算法 1.利用一个安全的Hash函数h来产生消息摘要h(m)。 2.用签名算法计算签名s=Signk(m)≡h(m)d mod n。 验证算法 1.首先利用一个安全的Hash函数h计算消息摘要h(m)。 2.用检验等式h(m)mod n≡se mod n 是否成立,若相等签名有效,否则,签名无效。 假如直接对消息进行私钥加密,攻击者获得两个签名后可以伪造m1*m2的有效签名s1*s2(同态性) Elgamal签名算法(举例) 初始化: 假设A选取素数p = 19 ,Zp* 的生成元g = 2。选取私钥x = 15,计算y ≡gx mod p ≡ 215mod 19 =12,则A的公钥是(p = 19,g = 2,y = 12)。 签名过程: 设消息m的Hash值h(m) = 16,则A选取随机数k = 11,计算r ≡ gk mod p≡ 211 mod 19 ≡15,k-1 mod (p-1) = 5。最后计算签名s ≡ [h(m)-xr]k-1 mod(p-1) ≡ 5(16-15×15 )mod 18 = 17。得到A对m的签名为(15,17)。 验证过程: 接受者B得到签名(15,17)后计算yrrs mod p ≡ 12151517mod 19 = 5 ,gh(m) mod p ≡ 216 mod 19 = 5 。验证等式yrrs ≡ gh(m) (mod p)相等,因此B接受签名。 Elgamal签名算法(安全性) 不能泄露随机数k。 不能使用相同的k对两个不同消息进行签名。 签名者多次签名时所选取多个k之间无关联。 整个密码系统的安全性并不取决对密码算法的保密,而是由密钥的保密性决定的。解决的核心问题是密钥管理问题,而不是密码算法问题。密钥的管理水平直接决定了密码的应用水平。 密钥管理就是在授权各方之间实现密钥关系的建立和维护的一整套技术和程序。密钥管理括密钥的生成、存储、建立(分配和协商)、使用、备份/恢复、更新、撤销/存档/销毁等。 典型的密钥层次结构 主密钥:对应于层次化密钥结构中的最高层次,它是对密钥加密密钥进行加密的密钥,主密钥应受到严格的保护。 密钥加密密钥:一般是用来对传输的会话密钥进行加密时采用的密钥。密钥加密密钥所保护的对象是实际用来保护通信或文件数据的会话密钥。 会话密钥:在一次通信或数据交换的任务中,用户之间所使用的密钥,是由通信用户之间进行协商得到的。它一般是动态地、仅在需要进行数据加密时产生,并在任务完成后立即进行销毁,也称为数据加密密钥。 密钥的生成一般首先通过密钥生成器借助于某种随机源产生具有较好统计分析特性的序列,以保障生成密钥的随机性和不可预测性. 密钥存储目的是确保密钥的秘密性、真实性以及完整性。 密钥更新情况:密钥有效期结束;密钥的安全受到威胁;通信成员中提出更新密钥。 对称密码其实就一个密钥(即已知一个密钥可推出另一个密钥),因此,密钥的秘密性、真实性、完整性都必须保护。 公钥的秘密性不用确保,但其真实性、完整性都必须严格保护。 公钥密码体制的私钥的秘密性、真实性、完整性都必须保护。 中间人攻击: 1.C将公共目录中B的公钥替换成自己的公钥。 2.A将他认为的B的公钥提取出来,而实际上那是C的公钥。 3.C现在可以读取A送给B的加密信息。 4.C将A的信息解密并阅读,然后他又用真实的B的公钥加密该信息并将加密结果发送给B。 数字证书实现公钥的真实性。 数字证书也称为公钥证书,是将证书持有者的身份信息和其所拥有的公钥进行绑定的文件。 证书用途: 签名证书:签名证书主要用于对用户信息进行签名,以保证信息的不可否认性。(私钥不需备份) 加密证书:加密证书主要用于对用户传送信息的密钥进行加密,以保证信息的保密性。(私钥需要备份) CRL:证书撤销列表 在线证书状态协议OCSP:其目的为了克服基于CRL的撤销方案的局限性,为证书状态查询提供即时的最新响应。OCSP使用证书序列号、CA名称和公开密钥的散列值作为关键字查询目标的证书。 为防止攻击者得到密钥,必须时常更新密钥,密码系统的强度依赖于密钥分配技术。 密钥分配中心模式(KDC生成回话密钥): 前提条件:密钥分配中心与每个用户之间有共享密钥。 1. A向密钥分配中心KDC(Key Distribute Center)发出会话密钥请求。请求内容包括A与B的身份以及一次性随机数N1。 2. KDC为A的请求发出应答。应答内容包括:一次性会话密钥Ks、A的请求、用B与KDC的共享密钥加密一次性会话密钥Ks和A的身份,其中应答信息是用A与KDC的共享密钥加密。 3. A存储会话密钥Ks,并向B转发用B与KDC的共享密钥加密的一次性会话密钥Ks和A的身份。 4. B使用会话密钥Ks 加密另一个一次性随机数N2,并将加密结果发送给A. 5. A使用会话密钥Ks 加密f(N2),并将加密结果发送给B. 基于公钥密钥分配(会话密钥): 前提条件:通信双方在CA中拥有自己的证书。 1. A向B发出会话密钥请求,请求内容包括A的身份、一次性随机数N1 以及利用B的公钥加密一次性会话密钥Ks。 2. B使用会话密钥Ks 加密一次性随机数N1,并将加密结果发送给A。 3. A使用会话密钥Ks加密f(N1),并将加密结果发送给B。 密钥协商是保密通信双方(或更多方)通过公开信道的通信来共同形成秘密密钥的过程。 密钥协商的结果是:参与协商的双方(或更多方)都将得到相同的密钥,同时,所得到的密钥对于其他任何方都是不可知的。 密码算法是密码协议的最基本单元,主要包含四个方面: 公钥密码算法,在分布式环境中实现高效密钥分发和认证; 对称密码算法,使用高效手段实现信息的保密性; 散列函数,实现协议中消息的完整性; 随机数生成器,为每个参加者提供随机数,实现唯一性和不可预测性。 零知识证明实际上一种密码协议,该协议的一方称为证明者(Prover) , 通常用P 表示, 协议的另一方是验证者(Verifier),一般用V表示。零知识证明是指P试图使V相信某个论断是正确的,但却不向V提供任何有用的信息,或者说在P论证的过程中V得不到任何有用的信息。也就是说,零知识证明除了证明证明者论断的正确性外不泄露任何其它信息或知识,或者说零知识证明是那种除了论证论题的有效性外不产生任何知识的证明。 盲签名:签名要求签名者能够在不知道被签名文件内容的情况下对消息进行签名。另外,即使签名者在以后看到了被签名的消息及其签名,签名者也不能判断出这个签名是他何时为谁生成的。(隐私性,不可追踪性) SSL: SSL(Secure Socket Layer,即安全套接层)协议是网景(Netscape)公司于1994年最先提出来的。SSL被设计成使用TCP来提供一种可靠的端到端的安全服务,是一种基于会话的加密和认证的Internet协议,它在两实体---客户和服务器之间提供了一个安全的管道。为了防止客户/服务器应用中的监听、篡改、消息伪造等,SSL提供了服务器认证和可选的客户端认证。通过在两个实体间建立一个共享的秘密,SSL提供保密性。 提供的主要服务:? 加密处理,加密数据以防止数据中途被窃取; 维护数据的完整性,确保数据在传输过程中不被改变。 实体认证服务,认证客户端(可选)和服务器,确保数据发送到正确的客户端(可选)和服务器。 PGP是一个基于RSA公匙加密体系的邮件加密软件,可以用它对邮件保密以防止非授权者阅读,还能对邮件加上数字签名从而使收信人可以确信邮件的发送者。它可以提供一种安全的通讯方式,事先并不需要任何保密的渠道用来传递密匙,并采用了一种RSA和传统加密的混合算法,用于数字签名的邮件利用加密前压缩、哈希算法等技术,功能强大有很快的速度。
篇2:密码学报告
密码学报告 本文关键词:密码学,报告
密码学报告 本文简介:中国地质大学计算机学院192103—01唐乾学号:20101000214班级:192103—01学生姓名:唐乾指导教师:任伟日期:2012年12月25日题号:实验一、二、三、RSA1预期目标在充分理解古典密码加密体制概念和原理的基础上,用MicrosoftVisualC++6.0实现古典密码加密与解
密码学报告 本文内容:
中国地质大学
计算机学院
192103—01
唐乾
学
号:
20101000214
班
级:
192103—01
学生姓名:
唐乾
指导教师:
任伟
日
期:
2012年12月25日
题
号:
实验一、二、三、RSA
1
预期目标
在充分理解古典密码加密体制概念和原理的基础上,用Microsoft
Visual
C++
6.0实现古典密码加密与解密,演示公钥与密钥的生成及加密与解密的过程。
2
系统分析
2.1
仿射密码:
加法密码和乘法密码结合就构成仿射密码,仿射密码的加密和解密算法是:
C=
Ek(m)=(k1m+k2)
mod
n
M=
Dk(c)=k1(c-
k2)
mod
n
仿射密码具有可逆性的条件是gcd(k,n)=1。当k1=1时,仿射密码变为加法密码,当k2=0时,仿射密码变为乘法密码。
仿射密码中的密钥空间的大小为nφ(n),当n为26字母,φ(n)=12,因此仿射密码的密钥空间为12×26
=
312。
2.2
Playfair密码:
它依据一个5*5的正方形组成的密码表来编写,密码表里排列有25个字母。如果一种语言字母超过25个,可以去掉使用频率最少的一个。如,法语一般去掉w或k,德语则是把i和j合起来当成一个字母看待。英语中z使用最少,可以去掉它。第一步是编制密码表。在这个5*5的密码表中,共有5行5列字母。第一列(或第一行)是密钥,其余按照字母顺序。密钥是一个单词或词组,若有重复字母,可将后面重复的字母去掉。当然也要把使用频率最少的字母去掉。如:密钥是Live
and
learn,去掉后则为liveandr。如果密钥过长可占用第二列或行。
如密钥crazy
dog,可编制成
第二步整理明文。将明文每两个字母组成一对。如果成对后有两个相同字母紧挨或最后一个字母是单个的,就插入一个字母X。如,communist,应成为co,mx,mu,ni,st。最后编写密文。对明文加密规则如下:1
若p1
p2在同一行,对应密文c1
c2分别是紧靠p1
p2
右端的字母。其中第一列被看做是最后一列的右方。如,按照前表,ct对应oc
2
若p1
p2在同一列,对应密文c1
c2分别是紧靠p1
p2
下方的字母。其中第一行被看做是最后一行的下方。3
若p1
p2不在同一行,不在同一列,则c1
c2是由p1
p2确定的矩形的其他两角的字母(至于横向替换还是纵向替换要事先约好,或自行尝试)。如,按照前表,wh对应tk或kt。如,依照上表,明文where
there
is
life,there
is
hope。可先整理为wh
er
et
he
re
is
li
fe
th
er
ei
sh
op
ex
然后密文为:kt
yg
wo
ok
gy
nl
hj
of
cm
yg
kg
lm
mb
wf
将密文变成大写,然后几个字母一组排列。
Playfair解密算法首先将密钥填写在一个5*5的矩阵中(去出重复字母和字母z),矩阵中其它未用到的字母按顺序填在矩阵剩余位置中,根据替换矩阵由密文得到明文。对密文解密规则如下:1
若c1
c2在同一行,对应明文p1
p2分别是紧靠c1
c2
左端的字母。其中最后一列被看做是第一列的左方。2
若c1
c2在同一列,对应明文p1
p2分别是紧靠c1
c2
上方的字母。其中最后一行被看做是第一行的上方。3
若c1
c2不在同一行,不在同一列,则p1
p2是由c1
c2确定的矩形的其他两角的字母。
2.3
Vigenere密码:
给定一个任意密钥k,其中k=(k1,k2,k3
…Kn)并且ki∈Z26(1≦i≦n);任意明文P=(P1,P2,P3…Pm),并且Pj∈Z26(1≦j≦m);将加密后得到的密文表示为c=(c1,c2……cm)并且cj∈(1≦j≦m)。
这样,我们中以定义如下所示的加密操作Eki:
Cj=Eki(Pj)(其中Eki(p)j→Pj+Ki(mod
26))
还可以定义如下所示的解密操作:
Pj=Dki(cj)(其中Dki(c):cj→cj-Ki(mod
26))
2.4
希尔密码:
每个字母当作26进制数字:A=0,B=1,C=2.
一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果模26。注意用作加密的矩阵(即密匙)在/mathbb_^n必须是可逆的,否则就不可能译码。只有矩阵的行列式和26互质,才是可逆的。
设d是一正整数,定义。Hill
cipher的主要思想是利用线性变换方法,不同的是这种变换是在上运算。例如:设d=2,每个明文单元使用
来表示,同样密文单元用
表示,具体的加密中,将被表示为
的线性组合。如:利用线性代数的知识,可得这个运算在
上进行,即mod26,密钥K一般取一个m*m的矩阵。
希尔密码是基于矩阵的线性变换,希尔密码相对于前面介绍的移位密码以及放射密码而言,其最大的好处就是隐藏了字符的频率信息,使得传统的通过字频来破译密文的方法失效。
线性代数中的逆矩阵:在线性代数中,大家都知道,对于一个n阶矩阵
M,如果存在一个n阶矩阵N,使得
M
N
=
E(其中:E为n阶单位矩阵),则称矩阵
N
为矩阵
M
的逆矩阵,并记为
M^-1.比如
2阶矩阵
M
=
[3,6],则很容易得知其逆矩阵:[2,7]M^-1
=
[7/9,-2/3]
[-2/9,1/3]
。关于这个逆矩阵是如何计算出的,通常的有两种方法:一是使用伴随矩阵,通过计算行列式得到。所用公式为:
M^-1
=
M^*
/
D
。(其中M^*为M的伴随矩阵,D为M的行列式的值)二是通过增广矩阵,在M右侧附加一个n阶单位矩阵,再通过初等变换将增广矩阵的左侧变换为一个n阶单位矩阵,这时右侧便是所求的逆矩阵。
3
源代码
#include
“Encryption.h“HGLOBAL
Temp;
int
WINAPI
WinMain(
HINSTANCE
hInstance,HINSTANCE
hPrevInstance,LPSTR
lpCmdLine,int
nShowCmd
)
{
DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DLGPROC
(DlgP),LPARAM(hInstance));
return
0;
}
BOOL
CALLBACK
DlgP(HWND
hWnd,UINT
wMessage,WPARAM
wParam,LPARAM
lParam)
{
HICON
hIcon;
HWND
hEdit;
switch
(wMessage)
{
case
WM_COMMAND:
switch
(LOWORD(wParam)
)
{
case
IDC_OPEN:
OpenDlg(hWnd);
return
TRUE;
case
ID_M_AFF_EN:
//get
parament
if
(Temp
==
NULL)
{
return
TRUE;
}
else
{
if(Encryption(hWnd,(TCHAR*)Temp))
{
hEdit
=
GetDlgItem(hWnd,IDC_EDIT);
SetWindowText(hEdit,(TCHAR*)Temp);
}
GlobalFree(Temp);
return
TRUE;
}
case
ID_M_AFF_DE:
if
(Temp
==
NULL)
{
return
TRUE;
}
else
{
Decryption(hWnd,(TCHAR*)Temp);
hEdit
=
GetDlgItem(hWnd,IDC_EDIT);
SetWindowText(hEdit,(TCHAR*)Temp);
GlobalFree(Temp);
return
TRUE;
}
case
ID_M_HILL_EN:
if
(Temp
==
NULL)
{
return
TRUE;
}
else
{
if(Hi_Encryption((TCHAR*)Temp,hWnd))
{
hEdit
=
GetDlgItem(hWnd,IDC_EDIT);
SetWindowText(hEdit,(TCHAR*)Temp);
}
GlobalFree(Temp);
return
TRUE;
}
case
ID_M_HILL_DE:
if
(Temp
==
NULL)
{
return
TRUE;
}
else
{
Hi_Decryption((TCHAR*)Temp,hWnd);
GlobalFree(Temp);
return
TRUE;
}
return
TRUE;
case
ID_M_PLAY_EN:
if
(Temp
==
NULL)
{
return
TRUE;
}
else
{
Play_Encryption((TCHAR*)Temp,hWnd);
GlobalFree(Temp);
}
return
TRUE;
case
ID_M_PLAY_DE:
if
(Temp
==
NULL)
{
return
TRUE;
}
else
{
Play_Decryption((TCHAR*)Temp,hWnd);
GlobalFree(Temp);
}
return
TRUE;
case
ID_M_VI_EN:
if
(Temp
==
NULL)
{
return
TRUE;
}
else
{
if(Vi_Encryption((TCHAR*)Temp,hWnd))
{
hEdit
=
GetDlgItem(hWnd,IDC_EDIT);
SetWindowText(hEdit,(TCHAR*)Temp);
}
GlobalFree(Temp);
return
TRUE;
}
return
TRUE;
case
ID_M_VI_DE:
if
(Temp
==
NULL)
{
return
TRUE;
}
else
{
Vi_Decryption((TCHAR*)Temp,hWnd);
hEdit
=
GetDlgItem(hWnd,IDC_EDIT);
SetWindowText(hEdit,(TCHAR*)Temp);
GlobalFree(Temp);
return
TRUE;
}
return
TRUE;
default:
return
FALSE;
}
case
WM_INITDIALOG:
hIcon
=
LoadIcon(HINSTANCE(lParam),MAKEINTRESOURCE(IDI_ICON1));
SendMessage(hWnd,WM_SETICON,ICON_BIG,LPARAM(hIcon));
return
TRUE;
case
WM_CLOSE:
EndDialog(hWnd,NULL);
return
TRUE;
default:
return
FALSE;
}
}
void
OpenDlg(HWND
hWnd)
{
OPENFILENAME
openfile;
HANDLE
hFile;
DWORD
FileSize;
DWORD
ByteRead;
static
TCHAR
fileBuf[MAX_PATH];
static
TCHAR
FileTitle[MAX_PATH];
static
TCHAR
FileFilter[]=
TEXT(“Text
Files(*.txt)/0*.txt/0/0“);
RtlZeroMemory(
openfile.lStructSize
=
sizeof(OPENFILENAME);
openfile.hwndOwner
=
hWnd;
openfile.Flags
=
OFN_EXPLORER;
openfile.lpstrFile
=
fileBuf;
openfile.lpstrFilter
=FileFilter;
openfile.nMaxFile
=
MAX_PATH;
openfile.nMaxFileTitle
=
MAX_PATH;
openfile.nMaxFileTitle
=MAX_PATH;
if(GetOpenFileName(
FileSize
=
GetFileSize(hFile,NULL);
Temp
=
GlobalAlloc(GMEM_FIXED
|
GMEM_ZEROINIT,FileSize+1);
if
(Temp
==
NULL)
{
MessageBox(NULL,TEXT(“Memory
allocate
error!“),TEXT(“oh,no“),MB_OK
|MB_ICONERROR);
return
;
}
if(!ReadFile(hFile,Temp,FileSize,return;
}
SetWindowText(GetDlgItem(hWnd,IDC_PATH),openfile.lpstrFile);
CloseHandle(hFile);
}
else
return;
}
4
测试数据及结果
运行效果如下图:
图1
1
预期目标
在充分理解ELGamal加密、签名体制概念和原理的基础上,用Microsoft
Visual
C++
6.0实现ELGamal加密与签名,演示ELGamal加密与签名过程。
2
系统分析
2.1.1
计算体系参数
随机素数p,用户的私有密钥x,g和x计算得到的整数y,消息m,随机数k。
2.1.2
计算密钥
公开密钥(p,g,y),私有密钥x
2.1.3
对文件签名
任何一个给定的消息都可以产生多个有效的ELGamal签名。
2.1.4
验证签名文件
验证算法能够将上述多个ELGamal签名中的任何一个当作可信的签名接受。
2.1.5
密钥对产生办法
首先选择一个素数p,两个随机数,g
和x,g,x
#include
#include
int
a,b;
int
prime_number_p();
int
random(int);
int
m_develop(int
);
/*---------------------------------*/
int
prime(int
p)
{int
i,j;
for(i=2;i=n;p--)
{if(prime(p)==1)
return
p;
}
}//求出n,m之间的最大素数
/*--------------------------------*/
int
prime_number_p()
{
int
p,m,n;
cout>n;
cout>m;
p=prime_number_max(n,m);
if(p==0)
{
coutb)
{
s[0]=a;
s[1]=b;
}
else
{
s[0]=a;
s[1]=b;
}
for(int
i=1;i>m;
if
(m>p)
{
cout>name;
x=p+1;
while(x>=p)
{cout>x;
if(x>=p)
cout>i;
if(i==0)
exit(0);
else
goto
jj;
}
4
测试数据及结果
大素数p的产生和g的产生
用户名以及密钥x,和公钥y的生成
签名(a,b)的产生和验证
5
调试过程中的问题
此程序仅仅局限于int型,int对于文件还有安全性较差。超过int就会出现错误
这就出现错误了。
我们可以进行扩充。把int的数用一个数组来表示。大家都扩到128位。密码也按照一定方法扩到128位。对于m则可以使用hash值。这样可以可以对几乎所有的文件进行签名了。
对于g,此处我使用的随机数g,这会使得签名容易破译。g应该为p的生成元在,然后再生成元中随机取一个。
若一个群G的每一个元都是G的某一个固定元a的乘方,我们就把G叫做循环群;我们也说,G是由元a生成的,并且用符号G=(a)来表示。a叫做G的一个生成元。
关于生成元g产生的方法
int
getGenerator(int
p)
{
int
gTable[LEN];
int
len=0;
int
q=p;
for(int
i=2;i=40)
break;
}
cout
#include
using
namespace
std;
typedef
long
llong;
llong
b[1000],w[1000];
int
mod_exp(int
a,int
b,int
n)
{
int
tmp=a%n,ans=1;
for(;b>0;b>>=1)
{
if(bans%=n;}
tmp*=tmp;tmp%=n;
}
return
ans;
}
int
extended_euclid(int
a,int
b,int
if(b
==
0)
{x
=
1;
y
=
0;
return
a;}
d
=
extended_euclid(b,a
%
b,y,x);
y
-=
a
/
b
x;
return
d;
}
int
chinese_remainder(int
len)
{
int
i,d,x,y,m,n,ret;
ret
=
0;
n
=
1;
for(i=0;
i
>p>>q>>M;
N
=
p*q;
int
C
=
(M*M)%N;
cout1)是素数,如果p的因子只有±1,±p。
称c是两个整数a、b的最大公因子,如果
①
c是a的因子也是b
的因子,即c是a、b的公因子。
②
a和b的任一公因子,也是c的因子。
表示为c=gcd(a,b)。
由于要求最大公因子为正,所以gcd(a,b)=gcd(a,-b)=gcd(-a,b)=gcd(-a,-b)。一般gcd(a,b)=gcd(|a|,|b|)。由任一非0整数能整除0,可得gcd(a,0)=|a|。如果将a,b都表示为素数的乘积,则gcd(a,b)极易确定。
一般由c=gcd(a,b)可得:
对每一素数p,cp=min(ap,bp)。
由于确定大数的素因子不很容易,所以这种方法不能直接用于求两个大数的最大公因子,如何求两个大数的最大公因子在下面介绍。
如果gcd(a,b)=1,则称a和b互素。
2.1.2
模运算
设n是一正整数,a是整数,如果用n除a,得商为q,余数为r,则
a=qn+r,0≤r
n的开方
)
返回n为宿舍;
}
求最大公因子的算法:Euclid算法就是用这种方法,因gcd(a,b)=gcd(|a|,|b|),因此可假定算法的输入是两个正整数,设为d,f,并设f
>d。
Euclid(f,d)
①X←f;
Y←d;
②
if
Y=0
then
return
X=gcd(f,d);
③
R=X
mod
Y;
④
X=Y;
⑤
Y=R;
⑥
goto
②。
求乘法逆元:推广的Euclid算法先求出gcd(a,b),当gcd(a,b)=1时,则返回b的逆元。
Extended
Euclid(f,d)
(设
f
>d)
①
(X1,X2,X3)←(1,0,f);(Y1,Y2,Y3)←(0,1,d);
②
if
Y3=0
then
return
X3=gcd(f,d);no
inverse;
③
if
Y3=1
then
return
Y3=gcd(f,d);Y2=d-1
mod
f;
④
Q=X3Y3
;
⑤
(T1,T2,T3)←(X1-QY1,X2-QY2,X3-QY3);
⑥
(X1,X2,X3)←(Y1,Y2,Y3);
⑦
(Y1,Y2,Y3)←(T1,T2,T3);
⑧
goto
②。
处理明文:将明文的每个字符提取出来将其装换为数字。进行加密处理,将处理后的数字字符用“+”号相连。其中加密的算法为:求am可如下进行,其中a,m是正整数:
将m表示为二进制形式bk
bk-1…b0,即
m=bk2k+bk-12k-1+…+b12+b0
因此:
例如:19=1×24+0×23+0×22+1×21+1×20,所以
a19=((((a1)2a0)2a0)2a1)2a1
从而可得以下快速指数算法:
c=0;
d=1;
For
i=k
downto
0
d0
{
c=2×c;
d=(d×d)
mod
n;
if
bi=1
then
{
c=c+1;
d=(d×a)
mod
n}
}
return
d.
其中d是中间结果,d的终值即为所求结果。c在这里的作用是表示指数的部分结果,其终值即为指数m,c对计算结果无任何贡献,算法中完全可将之去掉。
解密过程:将“+”连接的数字字符转换为数字并相加,用密钥做与
篇3:20XX秋数学实验实验报告4密码学初步
2011秋数学实验实验报告4密码学初步 本文关键词:实验,密码学,数学,报告
2011秋数学实验实验报告4密码学初步 本文简介:年级、专业姓名学号名单序号实验时间MATLAB版本:PC注:实验报告的最后一部分是实验小结与收获实验报告(4):密码学初步1.编一个函数统计一段英文文章中各字母出现的频率。返回值是一个元胞数组,第二个值是文章中按A到Z的顺序各个字母出现的频率。functiony=myStat(filename)ch
2011秋数学实验实验报告4密码学初步 本文内容:
年级、专业
姓名
学号名单序号
实验时间
MATLAB版本:
PC
注:实验报告的最后一部分是实验小结与收获
实验报告(4):密码学初步
1.
编一个函数统计一段英文文章中各字母出现的频率。
返回值是一个元胞数组,第二个值是文章中按A到Z的顺序各个字母出现的频率。
function
y
=
myStat(filename)
ch
=
textread(filename,%c
);
y={};
total
=
0;
y{1}
=
char(65:90);
freq
=
zeros(1,26);
n
=
numel(ch);
for
i
=
1:n
for
j
=
0:25
if
(ch(i)
==
j
+
65
||
ch(i)
==
j
+
97)
freq(j+1)
=
freq(j+1)
+
1;
total
=
total
+
1;
end
end
end
y{2}=
freq/total;
2.
编一个函数,在已知密钥的情况下,用加法密码进行加密和解密。
加密算法:
function
y
=
encrypt(origin,key)
n
=
numel(origin);
for
i
=
1:n
if
(origin(i)
>=
A
else
error(
输入的密钥有误!
)
end
2011秋
数学实验
实验报告(4)密码学初步
3
/
3