密码学原理与Java实现
上QQ阅读APP看书,第一时间看更新

第1章 加解密和Java概述

1.1 密码学基础知识

1.1.1 密码学概述

密码学(cryptography)是一种将信息表述为不可读的方式,并使用一种秘密的方法将信息恢复出来的科学。密码学提供的最基本的服务是数据机密性服务,就是使通信双方可以互相发送消息,并且避免他人窃取消息的内容。加密算法是密码学的核心。

无论加密系统实现的算法如何不同、形式如何复杂,其基本组成部分是相同的,通常都包括四个部分:

(1)需要加密的初始消息,即明文M。

(2)用于加密或解密的钥匙,即密钥K。

(3)加密算法E或者解密算法D。

(4)加密后形成的消息,即密文C。

C=Ek(M)表示对明文M使用密钥K加密后得到密文C;同样,M=Dk(C)表示对密文C解密后得到明文M,加解密过程如图1-1所示。

图1-1

1.1.2 对称密钥加密技术

对称密钥加密技术又称为传统密钥加密技术,它是指在一个加密系统中通信双方使用同一密钥,或者能够通过一方的密钥推导出另一方的密钥的加密体制。对称密钥加密技术的模型如图1-2所示。

图1-2

在使用对称密钥加密时,信息交互的双方必须使用同一个密钥,并且这个密钥还要防止被他人窃取。另外,还要经常对所使用的密钥进行更新,以减少攻击者获取密钥的概率。因此,对称密钥加密技术的安全性依赖于密钥分配技术。

对称密钥加密技术的特点在于效率高、算法简单、易于实现、计算开销小,适合于对大量数据进行加密。它的最大缺点是密钥的安全性得不到保证,易被攻击。所以,密钥分发、密钥保存、密钥管理都是对称密钥加密的缺点。在实际应用中,常用的对称密钥加密技术有DES算法、AES算法等。

DES算法:数据加密标准(Data Encryption Standard),是由IBM公司研制的一种加密算法。DES是一个分组加密算法,以64位为分组对数据加密。加密和解密使用的是同一个密钥。它的密钥长度是56位。64位的明文从算法的一端输入,经过左右部分的迭代和密钥的异或、置换等一系列操作,从另一端输出。

AES算法:高级加密标准(Advanced Encryption Standard),是由美国国家标准技术协会(NIST)在2001年发布的。AES也是一种分组密码,用以取代DES。AES作为新一代的安全加密标准,集合了强安全性、高性能、高效率、易用和灵活等优点,其分组长度为128位,密钥长度为128位、192位或256位。

1.1.3 公开密钥加密技术

公开密钥加密技术又称为非对称密钥加密技术,与对称密钥加密技术不同,它使用一对密钥分别进行加密和解密操作,其中一个是公开密钥(Public-Key),另一个是由用户自己保存(不能公开)的私有密钥(Private-Key),发送方用公钥或私钥进行加密,接收方使用私钥或公钥进行解密。公钥加密的模型如图1-3所示。

图1-3

使用公钥加密技术,通信双方事先不需要通过通信信道进行密钥交换,并且公钥是公开的,因此密钥的持有量得到了减少,密钥保存量少,密钥分配简单,便于密钥的分发与管理。常用的公开密钥加密算法有RSA算法、DH算法等。

当前应用最为广泛的公钥系统RSA(Rivest、Shamir、Adleman三人名字的缩写)是基于大数因子分解的复杂性来构造的,它是公钥系统最典型的加密算法,大多数使用公钥加密技术进行加密和数字签名的实际应用都是使用的RSA算法。RSA算法如下:

(1)用户选择两个足够大的保密素数p、q。

(2)计算n=pq,n的欧拉函数为F(n)=(p-1)(q-1)。

(3)选择一个相对比较大的整数e作为加密指数,使e与F(n)互素。

(4)解方程:ed=1modF(n),求出解密指数d。

(5)设M、C分别为要加密的明文和已被加密的密文;加密运算为C=Me mod n,解密运算为M=Cd mod n。

每个用户都有一个密钥(e,d,n),(e,n)是可以公开的密钥PK,(d,n)是用户保密的密钥PR,e是加密指数,d是解密指数。RSA算法的两个密钥中的任何一个都可用来加密,另一个用来解密。

RSA算法的安全性基于数论中大数分解为质因子的困难性,从一个公开密钥加密的密文和公钥中推导出明文的难度,等价于分解两个大素数的乘积。可见分解越困难,算法的安全性就越高。

DH(Diffie-Hellman)算法是最早的公钥算法,实质上是一个通信双方进行密钥协定的协议,它的用途仅限于密钥交换。DH算法的安全性依赖于计算离散对数的难度,离散对数的研究现状表明所使用的DH密钥至少需要1024位才能保证算法的安全性。

1.1.4 单向散列函数算法

单向散列函数算法也称为报文摘要函数算法,使用单向的散列函数,其实现过程是从明文到密文不可逆的过程。其实就是只能加密而不能将其还原,即理论上无法通过反向运算得到原始数据内容。因此,单向散列函数算法通常只用来进行数据完整性验证。

单向散列函数表达式为h=H(M),其中M是一个变长消息,H(M)是定长的散列值。消息正确时,将散列值附于发送方的消息后,接收方通过重新计算散列值认证该消息。散列函数必须具有下列性质:

(1)M可应用于任意大小的数据块。

(2)H产生定长的输出。

(3)对任意给定的M,计算H(M)比较容易,用硬件和软件均可实现。

(4)对任意给定的散列码h,找到满足H(M)=h的M在计算上是不可行的,称之为单向性。

(5)对任何给定的分组M,找到满足N不等于M且H(M)=H(N)的N在计算上是不可行的,称之为抗弱碰撞性。

(6)找到任何满足H(M)=H(N)的(M,N)在计算上是不可行的,称之为抗强碰撞性。

由于单向函数在速度上比对称加密算法还快,因此它被广泛应用,是数字签名和消息验证码(MAC)的基础,常用的单向散列函数算法有MD5和SHA-1等。

1.1.5 数字签名基础知识

数字签名是指通过某种密码运算生成一系列符号及代码组成电子密码进行签名的过程。数字签名是一种认证机制,以公钥技术和单向散列函数为基础,使得消息的产生都可以添加一个起签名作用的标识。数字签名是目前电子商务中应用最普遍、可操作性最强、技术最成熟的一种电子签名方法,采用规范化的程序和科学的方法,用于鉴定签名人的身份以及对一项电子签名内容的认证。签名保证了消息的来源和完整性,即数字签名能验证出数据在传输过程中有无改变,确保传输电子文件的完整性、真实性和不可替代性。数字签名的过程如图1-4所示。

图1-4

数字签名的实现有下列几个步骤:

(1)发送方使用摘要函数(如MD5)对信息M生成消息摘要MD5(M)。

(2)发送方使用自己的私钥,用某种数字签名算法来签名消息摘要(用私钥对摘要进行加密),得到数字签名。

(3)发送方把消息M和数字签名一起发送给接收方。

(4)接收方通过使用与发送方同一个摘要函数对接收的消息生成新的摘要。与第一步中生成的摘要进行对比,如果一致,就说明收到的消息没有被修改过;再使用发送方的公钥对数字签名解密来验证发送方的签名。

由数字签名的过程可以看出,数字签名很好地保证了如下几个方面的安全性:

(1)完整性:摘要函数算法实现的是不可逆的过程,如果消息在传输过程中遭到破坏或被窃取,接收方根据接收到的报文还原出来的消息摘要不同于用公钥解密得出来的摘要,这样保证了数据在传输过程中的安全性。

(2)不可否认性:由于公钥与私钥是一一对应的关系,发送方的私钥只有自己知道,因此它不能否认已发送的消息。

(3)认证:由于公钥和私钥是一一对应的关系,因此接收方用发送方的公钥计算出来的摘要跟发送方生成的摘要是一致的,这样就能证明消息一定是该发送方发送出来的。