本文简要地介绍了现代密码学的一些基础理论,供参考。html
1 加密技术概述算法
一个密码系统的安全性只在于密钥的保密性,而不在算法的保密性。安全
对纯数据的加密的确是这样。对于你不肯意让他看到这些数据(数据的明文)的人,用可靠的加密算法,只要破解者不知道被加密数据的密码,他就不可解读这些数据。ide
可是,软件的加密不一样于数据的加密,它只能是“隐藏。无论你愿意不肯意让他(合法用户,或 Cracker)看见这些数据(软件的明文),软件最终总要在机器上运行,对机器,它就必须是明文。既然机器能够“看见这些明文,那么 Cracker,经过一些技术,也能够看到这些明文。函数
因而,从理论上,任何软件加密技术均可以破解。只是破解的难度不一样而已。有的要让最高明的 Cracker 忙上几个月,有的可能不费吹灰之力,就被破解了。学习
因此,反盗版的任务(技术上的反盗版,而非行政上的反盗版)就是增长 Cracker 的破解难度。让他们花费在破解软件上的成本,比他破解这个软件的获利还要高。这样 Cracker 的破解变得毫无心义——谁会花比正版软件更多的钱去买盗版软件 ?大数据
2 密码学简介加密
2.1 概念spa
(1) 发送者和接收者设计
假设发送者想发送消息给接收者,且想安全地发送信息:她想确信偷听者不能阅读发送的消息。
(2) 消息和加密
消息被称为明文。用某种方法假装消息以隐藏它的内容的过程称为加密,加了密的消息称为密文,而把密文转变为明文的过程称为解密。
明文用M(消息)或P(明文)表示,它多是比特流(文本文件、位图、数字化的语音流或数字化的视频图像)。至于涉及到计算机,P是简单的二进制数据。明文可被传送或存储,不管在哪一种状况,M指待加密的消息。
密文用C表示,它也是二进制数据,有时和M同样大,有时稍大(经过压缩和加密的结合,C有可能比P小些。然而,单单加密一般达不到这一点)。加密函数E做用于M获得密文C,用数学表示为:
E(M)=C.
相反地,解密函数D做用于C产生M
D(C)=M.
先加密后再解密消息,原始的明文将恢复出来,下面的等式必须成立:
D(E(M))=M
(3) 鉴别、完整性和抗抵赖
除了提供机密性外,密码学一般有其它的做用:.
(a) 鉴别
消息的接收者应该可以确认消息的来源;***者不可能假装成他人。
(b) 完整性检验
消息的接收者应该可以验证在传送过程当中消息没有被修改;***者不可能用假消息代替合法消息。
(c) 抗抵赖
发送者过后不可能虚假地否定他发送的消息。
(4) 算法和密钥
密码算法也叫密码,是用于加密和解密的数学函数。(一般状况下,有两个相关的函数:一个用做加密,另外一个用做解密)
若是算法的保密性是基于保持算法的秘密,这种算法称为受限制的算法。受限制的算法具备历史意义,但按如今的标准,它们的保密性已远远不够。大的或常常变换的用户组织不能使用它们,由于每有一个用户离开这个组织,其它的用户就必须改换另外不一样的算法。若是有人无心暴露了这个秘密,全部人都必须改变他们的算法。
更糟的是,受限制的密码算法不可能进行质量控制或标准化。每一个用户组织必须有他们本身的惟一算法。这样的组织不可能采用流行的硬件或软件产品。但窃听者却能够买到这些流行产品并学习算法,因而用户不得不本身编写算法并予以实现,若是这个组织中没有好的密码学家,那么他们就没法知道他们是否拥有安全的算法。
尽管有这些主要缺陷,受限制的算法对低密级的应用来讲仍是很流行的,用户或者没有认识到或者不在意他们系统中内在的问题。
现代密码学用密钥解决了这个问题,密钥用K表示。K能够是不少数值里的任意值。密钥K的可能值的范围叫作密钥空间。加密和解密运算都使用这个密钥(即运算都依赖于密钥,并用K做为下标表示),这样,加/解密函数如今变成:
EK(M)=C
DK(C)=M.
这些函数具备下面的特性:
DK(EK(M))=M.
有些算法使用不一样的加密密钥和解密密钥,也就是说加密密钥K1与相应的解密密钥K2不一样,在这种状况下:
EK1(M)=C
DK2(C)=M
DK2 (EK1(M))=M
全部这些算法的安全性都基于密钥的安全性;而不是基于算法的细节的安全性。这就意味着算法能够公开,也能够被分析,能够大量生产使用算法的产品,即便偷听者知道你的算法也没有关系;若是他不知道你使用的具体密钥,他就不可能阅读你的消息。
密码系统由算法、以及全部可能的明文、密文和密钥组成的。
基于密钥的算法一般有两类:对称算法和公开密钥算法。下面将分别介绍:
2.2 对称密码算法
对称算法有时又叫传统密码算法,就是加密密钥可以从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加/解密密钥是相同的。这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通讯以前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加/解密。只要通讯须要保密,密钥就必须保密。
对称算法的加密和解密表示为:
EK(M)=C
DK(C)=M
对称算法可分为两类。一次只对明文中的单个比特(有时对字节)运算的算法称为序列算法或序列密码。另外一类算法是对明文的一组比特亚行运算,这些比特组称为分组,相应的算法称为分组算法或分组密码。现代计算机密码算法的典型分组长度为64比特——这个长度大到足以防止分析破译,但又小到足以方便使用(在计算机出现前,算法广泛地每次只对明文的一个字符运算,可认为是序列密码对字符序列的运算)。
2.3 公开密码算法
公开密钥算法(也叫非对称算法)是这样设计的:用做加密的密钥不一样于用做解密的密钥,并且解密密钥不能根据加密密钥计算出来(至少在合理假定的长时间内)。之因此叫作公开密钥算法,是由于加密密钥可以公开,即陌生者能用加密密钥加密信息,但只有用相应的解密密钥才能解密信息。在这些系统中,加密密钥叫作公开密钥(简称公钥),解密密钥叫作私人密钥(简称私钥)。私人密钥有时也叫秘密密钥。为了不与对称算法混淆,此处不用秘密密钥这个名字。
用公开密钥K加密表示为
EK(M)=C.
虽然公开密钥和私人密钥是不一样的,但用相应的私人密钥解密可表示为:
DK(C)=M
有时消息用私人密钥加密而用公开密钥解密,这用于数字签名(后面将详细介绍),尽管可能产生混淆,但这些运算可分别表示为:
EK(M)=C
DK(C)=M
当前的公开密码算法的速度,比起对称密码算法,要慢的多,这使得公开密码算法在大数据量的加密中应用有限。
2.4 单向散列函数
单向散列函数 H(M) 做用于一个任意长度的消息 M,它返回一个固定长度的散列值 h,其中 h 的长度为 m 。
输入为任意长度且输出为固定长度的函数有不少种,但单向散列函数还有使其单向的其它特性:
(1) 给定 M ,很容易计算 h ;
(2) 给定 h ,根据 H(M) = h 计算 M 很难 ;
(3) 给定 M ,要找到另外一个消息 M‘ 并知足 H(M) = H(M’) 很难。
在许多应用中,仅有单向性是不够的,还须要称之为“抗碰撞的条件:
要找出两个随机的消息 M 和 M‘,使 H(M) = H(M’) 知足很难。
因为散列函数的这些特性,因为公开密码算法的计算速度每每很慢,因此,在一些密码协议中,它能够做为一个消息 M 的摘要,代替原始消息 M,让发送者为 H(M) 签名而不是对 M 签名 。
如 SHA 散列算法用于数字签名协议 DSA中。
2.5 数字签名
提到数字签名就离不开公开密码系统和散列技术。
有几种公钥算法能用做数字签名。在一些算法中,例如RSA,公钥或者私钥均可用做加密。用你的私钥加密文件,你就拥有安全的数字签名。在其它状况下,如DSA,算法便区分开来了??数字签名算法不能用于加密。这种思想首先由Diffie和Hellman提出 。
基本协议是简单的 :
(1) A 用她的私钥对文件加密,从而对文件签名。
(2) A 将签名的文件传给B。
(3) B用A的公钥解密文件,从而验证签名。
这个协议中,只须要证实A的公钥的确是她的。若是B不能完成第(3)步,那么他知道签名是无效的。
这个协议也知足如下特征:
(1) 签名是可信的。当B用A的公钥验证信息时,他知道是由A签名的。
(2) 签名是不可伪造的。只有A知道她的私钥。
(3) 签名是不可重用的。签名是文件的函数,而且不可能转换成另外的文件。
(4) 被签名的文件是不可改变的。若是文件有任何改变,文件就不可能用A的公钥验证。
(5) 签名是不可抵赖的。B不用A的帮助就能验证A的签名。
在实际应用中,由于公共密码算法的速度太慢,签名者每每是对消息的散列签名而不是对消息自己签名。这样作并不会下降签名的可信性。
wz.juzhuanmeng.com
<h3><a href="http://wz.juzhuanmeng.com" target="_blank" style="line-height: 18.2px;">wz.juzhuanmeng.com</a></h3></p>