龙空技术网

数据是如何加密的

爱打篮球的程序员 12

前言:

此刻你们对“网络传输加密算法”大概比较关心,兄弟们都需要分析一些“网络传输加密算法”的相关知识。那么小编同时在网摘上搜集了一些有关“网络传输加密算法””的相关资讯,希望看官们能喜欢,姐妹们一起来了解一下吧!

安全隐患内部

大意疏忽,意外泄露;刻意谋取利益故意出卖泄露等

外部

竞对破坏,职业黑客勒索,业余窃密爱好等

针对内外部数据安全问题都可以通过加密来防范,这就离不开我们下面要聊的密码学

密码学

密码学在加密算法上大体可分为单向加密算法、对称加密算法、非对称加密算法三大类。 MD5、SHA算法是单向加密算法的代表,单向加密算法是数据完整性验证的常用算法。DES算法是对称加密算法的典型代表,对称加密算法是数据存储加密的常用算法。RSA算法是非对称加密算法的典型代表,非对称加密算法是数据传输加密的常用算法。对称加密算法也可以用做数据传输加密,但非对称加密算法在密钥管理方面更有优势。相对对称加密算法而言,非对称加密算法在安全级别上等级更高,但非对称加密算法在时间效率上远不如对称加密算法。

安全技术目标保密性(权限控制/加密转码)口令验证,角色权限/DES,AES完整性(信息摘要/数字签名)单向加密MD5,SHA/RSA,DSA抗否认性(数字签名/数字证书)RSA,DSA/数字证书CA最早的加解密案例

在中国周朝时期,姜太公与周武王在军事作战时,使用“隐符”进行保密通信。这种“隐符”是一种双方事先约定的密码系统,不同长度的木板、竹节代表不同的含义,即使丢失也不必担心泄密,因为“隐符”上并未刻有文字。到了东周,这种技术被“隐书”所代替,将文字刻在一块板上,然后一破为三,每人各持一块,只有合三为一才能显示出完整内容,这样即使丢失其中一块,也不至于泄密,还有其他案例大多采用比如移位加密法(每个数字或者排序的字母往后移三位),替代法(每个字母或者数字用下一个替代),单表替代密码(映射表)等

下面展示一下代码,各个运行一下

如果把这些直接做成工具类,大家直接使用,可能就不会太留意具体实现,如果环境发生变化或者参数有些错误可能不清楚出错原因,所以为了让本次分享有点价值,我就从Base64这种伪加密的工具类开始慢慢介绍各种类型的加密算法

Base64由来

电子邮件只允许使用ASCI码,而对于非ASCI码(如中文)就显得无能为力了。因此,为了能在电子邮件中使用非ASCI码,就有了Base64算法。另外,例如图片二进制流的每个字节不可能全部都是可见字符,所以就传送不了。最好的方法就是在不改变传统协议的情况下,做一种扩展方案来支持二进制文件的传送,把不可能打印的字符用可打印的字符标识,问题就解决了。Base64编码就应运而生,Base64就是一种基于64个可打印字符来表示二进制数据的表示方法。一个Base64字符是8个bit,但有效部分只有右边6个bit,左边两个永远是0。

那么怎么用6个有效bit来表示传统字符的8个bit呢?8和6的最小公倍数是24,也就是说3个传统字节可以由4个Base64字符来表示,保证有效位数是一样的,这样就多了1/3的字节数来弥补Base64只有6个有效bit的不足。

编码过程将给定的字符串以字符为单位转换为对应的字符编码(如ASCI码)。将获得的字符编码转换为二进制码。3)对获得的二进制码做分组转换操作,每3个8位二进制码为一组,转换为每4个6位二进制码为一组(不足6位时低位补0)。这是一个分组变化的过程,3个8位二进制码和4个6位二进制码的长度都是24位(3x8=4x6=24)。对获得的4个6位二进制码补位,向6位二进制码添加2位高位0,组成4个8位二进制码。将获得的4个8位二进制码转换为十进制码。将获得的十进制码转换为Base64字符表中对应的字符。

了解完上述的知识,我们以编码 Man 字符串为例,来直观的感受一下编码过程。Man 由 M、a 和 n 3 个字符组成,它们对应的 ASCII 码为 77、97 和 110。

接着我们以每 6 个比特为一个单元,进行 base64 编码操作,具体如下图所示:

由图可知,Man (3字节)编码的结果为 TWFu(4字节),所以经过 base64 编码后长度会增加 1/3。Man 这个字符串的长度刚好是 3,我们可以用 4 个 base64 单元来表示。

如果要编码的字节数不能被 3 整除,最后会多出 1 个或 2 个字节,那么可以使用下面的方法进行处理:先使用 0 字节值在末尾补足,使其能够被 3 整除,然后再进行 base64 的编码。以编码字符 A 为例,其所占的字节数为 1,不能被 3 整除,需要补 2 个字节,具体如下图所示:

字符 A 经过 base64 编码后的结果是 QQ==,该结果后面的两个 = 代表补足的字节数。而最后个 1 个 base64 字节块有 4 位是 0 值。如果mod3余1则只需要补1个=

解码过程

就是逆操作了。

Y = f(x)

Base64算法算不上真正的加密算法,尽管Base64算法的编码和解码操作可充当加密和解密操作,还有一张字符映射表充当了密钥。它与早期加密算法中的单表置换算法极为相似。但是,Base64算法公开密钥的方式却违反了柯克霍夫原则,而且它的加密强度并不高。因此,Base64算法算不上真正的加密算法。尽管如此,经过改良的Base64算法常常作为加密算法使用。

Y = f(x)

散列函数

散列函数用于信息完整性验证,这种技术就是由散列函数提供的消息认证技术。散列函数,又称哈希函数、消息摘要函数、单向函数或杂凑函数。与密码体制不同的是,散列函数的主要作用不是完成数据加密与解密的工作,它是用来验证数据完整性的重要技术。通过散列函数,可以为数据创建“数字指纹”(散列值)。散列值通常是一个短的随机字母和数字组成的字符串。

散列函数具有以下一些特性消息的长度不受限制。对于给定的消息,其散列值的计算是很容易的。如果两个散列值不相同,则这两个散列值的原始输入消息也不相同,这个特性使得散列函数具有确定性的结果散列函数的运算过程是不可逆的,这个特性称为函数的单向性。这也是单向函数命名的由来。对于一个已知的消息及其散列值,要找到另一个消息使其获得相同的散列值是不可能的这个特性称为抗弱碰撞性。这被用来防止伪造。任意两个不同的消息的散列值一定不同,这个特性称为抗强碰撞性。

散列函数广泛用于信息完整性的验证,是数据签名的核心技术。由此,消息摘要算法成了校验数据完整性的主要手段。各大软件厂商提供软件下载的同时总要附带数字签名,这一做法也就不足为奇了。为了能够更加方便、有效地验证数据的完整性有的软件厂商还提供了不同的消息摘要算法的数字指纹,如MD5和SHA算法,甚至是HMAC算法的数字指纹。此外,用于校验数据完整性的算法还有CRC32算法等。为了方便人们识别和阅读,数字指纹常以十六进制字符串的形式出现。消息摘要算法最初是用来构建数字签名的。数字签名操作中,签名操作其实是变相地使用消息摘要算法获得的数字指纹,而验证操作则是验证其数字指纹是否相符。消息摘要算法一直是非对称加密算法中一项举足轻重的关键性算法。

散列细分MD系列

拥有MD2、MD4和MD5三种常用算法。虽然MD5算法的破解使其安全性大为降低,但在用户注册/登录模块中仍然是常见的首选的方案,我们系统中搜搜MD5也随处可见。各大软件厂商在其软件下载页面上仍然使用MD5算法作为数据完整性验证的方法。MD5算法常作为安全性要求不高的环境中的常用算法。MD4和MD5算法为后续消息摘要算法(如SHA)的设计提供了参考。

SHA系列

相对枝繁叶茂,拥有SHA-1、SHA-224、SHA-256、SHA-384和SHA-512五种常用算法。其中,后四种算法在原有SHA-1基础上扩展了消息摘要长度,通常统称为SHA-2算法。在JDK中,通过MessageDigest类可提供SHA-1、SHA-256、SHA-384和SHA-512四种算法支持;通过第三方扩展,可提供SHA-3系列算法支持;SHA算法较之MD算法更为安全,常常出现在一些安全系数要求较高的环境中。一般的用户注册/登录模块,各大软件厂商用于校验数据完整性的页面中都常常用到SHA算法。这些领域既是MD5算法出没的地方,也是SHA算法盘踞之处。除此之外,MD5和SHA算法还常常作为数字证书的签名算法,而SHA算法则更为常见一些。

MAC系列

是一种基于密钥的散列函数算法,它吸收了MD算法和SHA算法的精髓,并将其发扬光大,包含HmacMD2、HmacMD4和HmacMD5等MD系列算法,以及HmacSHA1、HmacSHA224HmacSHA256、HmacSHA384和HmacSHA512等SHA系列算法。虽然已经有了主流的消息摘要算法实现,但仍可能不能满足我们的需要。非主流消息摘要算法RipeMD系列(括含RipeMD128、RipeMD160、RipeMD256和RipeMD320)、Tiger、Whirlpoo1和GOST3411算法,以及HmacRipeMD系列(包括HmacRipeMD128和HmacRipeMD160)算法。

MD、SHA和MAC都是加密算法领域的消息摘要算法,与之功能相近的CRC-32算法则是最为古老的数据完整性验证算法。目前,CRC-32算法仍广泛用于通信领域,实现差错控制,其变种Adler-32算法则广泛适用于zlib压缩算法中。

详细的冗余论述参见代码对称加密

对称加密(Symmetric Cryptography)是密码学中的一类加密算法,这类算法在加密和解密时,使用相同的密钥,对称加密又称为共享密钥加密,其最大的缺点是,对称加密的安全性依赖于密钥,一旦泄露,就意味着任何人都能解密消息。对称加密的优点是加密速度快,所以在很多场合被使用。

常见算法包括DES、3DES和AES。

DES算法

DES(Data Encryption Standard,中文:数据加密标准),是一种对称加密算法。该算法在1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并于1977年被发布,随后在国际上广泛流传开来。然而,随着计算机的进步,DES 已经能够被暴力破解,所以该算法已经不安全了。DES是一种分组密码(Block Cipher,或者叫块加密),即将明文按64比特进行分组加密,每组生成64位比特的密文。它的密钥长度为56比特(从规格上来说,密钥长度是64比特,但由于每隔7比特会设置一个用于错误检查的比特,因此实际长度为56比特)。

3DES算法

三重数据加密算法(Triple Data Encryption Algorithm,缩写为TDEA),简称3DES(Triple-DES),是DES的增强版,相当于对每组数据应用了三次DES算法。由于DES算法的密钥长度过短,容易被暴力破解,为了解决这一问题,设计出了该算法。它使用简单的方法,通过增加DES密钥长度的方式来避免类似攻击,而不是一种全新的密码算法。该算法在每次应用DES时,使用不同的密钥,所以有三把独立密钥。这三把密钥组成一起,是一个长度为168(56 + 56 + 56)比特的密钥,所以3DES算法的密钥总长度为168比特。

3DES的加密过程

3DES的加密过程,并不是进行三次DES加密(加密→加密→加密),而是以密钥1、密钥2、密钥3的顺序,进行加密→解密→加密的过程。

3DES的解密过程

3DES的解密过程和加密正好相反,是以密钥3、密钥2、密钥1的顺序,进行解密→加密→解密的操作。

AES算法

AES(Advanced Encryption Standard),即高级加密标准,是取代DES算法的一种新的对称加密算法。AES算法是从全世界的企业和密码学家,提交的对称密码算法中竞选出来的,最终 Rijndael 加密算法胜出,所以AES又称为 Rijndael 加密算法。AES也是一种分组密码,它的分组长度为128比特,密钥长度可以为128比特、192比特或256比特。

工作模式

无论是DES,3DES还是AES,都属于分组密码,它们只能加密固定长度的明文。如果需要加密更长的明文,就需要对分组密码进行迭代,而分组密码的迭代方法称为分组密码的模式。简而一句话:分组密码的模式,就是分组密码的迭代方式。

分组密码有很多种模式,这里主要介绍以下几种:ECB、CBC、CFB、OFB、CTR。

ECB模式

ECB(Electronic CodeBook)模式,即电子密码本模式。该模式是将明文分组,加密后直接成为密文分组,分组之间没有关系。可以认为有一张巨大的密码表(密码本),对于任意一组铭文,密码本中都有一个密文分组与之对应,所以叫电子密码本模式。

优点:易于理解且简单易行;便于实现并行操作;没有误差传递的问题。

缺点:不能隐藏明文的模式,如果明文重复,则对应的密文也会重复,密文内容很容易被替换、重排、删除、重放;对明文进行主动攻击的可能性较高。

用途:适合加密密钥、随机数等短数据(减少分组)。例如,安全地传递DES密钥,ECB是最合适的模式。

CBC模式

CBC(Cipher Block Chaining)模式,即密码分组链接模式。该模式首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。只有第一个明文分组特殊,需要提前为其生成一个与分组长度相同的比特序列,进行XOR运算,这个比特序列称为初始化向量(Initialization Vector),简称IV。

优点:加密后的密文上下文关联,即使在明文中出现重复的信息也不会产生相同的密文;密文内容如果被替换、重排、删除、重放或网络传输过程中发生错误,后续密文即被破坏,无法完成解密还原;对明文的主动攻击的可能性较低。

缺点:不利于并行计算,目前没有已知的并行运算算法;误差传递,如果在加密过程中发生错误,则错误将被无限放大,导致加密失败;需要初始化向量。

用途:可加密任意长度的数据;适用于计算产生检测数据完整性的消息认证码Mac。

CFB模式

CFB(Cipher FeedBack)模式,即密文反馈模式。该模式首先将前一个密文分组进行加密,再与当前明文分组进行XOR运算,来生成密文分组。同样CFB模式也需要一个IV。

优点:隐藏了明文的模式,每一个分组的加密结果必受其前面所有分组内容的影响,即使出现多次相同的明文,也均产生不同的密文;分组密码转化为流模式,可产生密钥流;可以及时加密传送小于分组的数据。

缺点:与CBC相类似。不利于并行计算,目前没有已知的并行运算算法;存在误差传送一个单元损坏影响多个单元;需要初始化向量。

用途:因错误传播无界,可用于检查发现明文密文的篡改。

OFB模式

OFB(Output FeedBack)模式,即输出反馈模式。该模式会产生一个密钥流,即将密码算法的前一个输出值,做为当前密码算法的输入值。该输入值再与明文分组进行XOR运行,计算得出密文分组。该模式需要一个IV,进行加密后做为第一个分组的输入。

优点:隐藏了明文的模式;分组密码转化为流模式;无误差传送问题;可以及时加密传送小于分组的数据。

缺点:不利于并行计算;对明文的主动攻击是可能的,安全性较CFB差。

用途:适用于加密冗余性较大的数据,比如语音和图像数据。

CTR模式

CTR(CounTeR)模式,即计数器模式。该模式也会产生一个密钥流,它通过递增一个计数器来产生连续的密钥流。对该计数器进行加密,再与明文分组进行XOR运算,计算得出密文分组。

优点:可并行计算;安全性至少与CBC模式一样好;加密与解密仅涉及密码算法的加密

缺点:没有错误传播,因此不易确保数据完整性。

用途:适用于各种加密应用。

分组密码的填充

在分组密码中,当数据长度不符合分组长度时,需要按一定的方式,将尾部明文分组进行填充,这种将尾部分组数据填满的方法称为填充(Padding)。

No Padding

即不填充,要求明文的长度,必须是加密算法分组长度的整数倍。

... | DD DD DD DD DD DD DD DD | DD DD DD DD DD DD DD DD |

ANSI X9.23

在填充字节序列中,最后一个字节填充为需要填充的字节长度,其余字节填充0。

... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |

ISO 10126

在填充字节序列中,最后一个字节填充为需要填充的字节长度,其余字节填充随机数。

... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |

PKCS#5和PKCS#7

在填充字节序列中,每个字节填充为需要填充的字节长度。

... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |

ISO/IEC 7816-4

在填充字节序列中,第一个字节填充固定值80,其余字节填充0。若只需填充一个字节,则直接填充80。

... | DD DD DD DD DD DD DD DD | DD DD DD DD 80 00 00 00 |

... | DD DD DD DD DD DD DD DD | DD DD DD DD DD DD DD 80 |

Zero Padding

在填充字节序列中,每个字节填充为0。

... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |

详细的冗余论述参见代码

对称加密算法提高数据安全性的同时带来了密钥管理的复杂性。消息收发双方若想发送加密消息,必须事先约定好加密算法并发放密钥。加密消息在传递过程中,难免会被窃听。如果窃听者破译了密钥,就可以破译、甚至篡改消息,而消息的收发双方却浑然不知。当然,我们可以通过消息摘要算法验证消息的完整性,但却不能避免消息被破译的可能。消息收发双方若要避免这种密钥被破解的风险,就必须频繁更换密钥,而密钥的发放又是一个敏感问题,操作起来具有一定的难度。下面将对这个问题进行改善

非对称加密

非对称密码体制与对称密码体制相比,它们的主要区别在于:非对称密码体制的加密密钥和解密密钥不相同,分为两个密钥,一个公开,一个保密。公开的密钥称为公钥,保密的密钥称为私钥。因此,非对称密码体制又称公钥密码体制。非对称密码体制使得发送者和接收者之间以无密钥传输的方法进行保密通信成为了可能,弥补了对称密码体制的缺陷。在非对称密码体制中,公钥和私钥均可用于加密与解密操作,但它与对称密码体制有极大的不同。公钥与私钥分属通信双方,一份消息的加密与解密需要公钥与私钥共同参与。公钥加密需要私钥解密,反之,私钥加密需要公钥解密。

非对称密码体制的主要优点是可以适应开放性的使用环境,密钥管理问题相对简单,可以方便、安全地实现数字签名和验证。RSA是非对称密码体制的典范,它不仅可以完成一般的数据保密操作,同时它也支持数字签名与验证。非对称密码算法的安全性完全依赖于基于计算复杂度上的难题,通常来自于数论。例如,RSA源于整数因子分解题;DSA数字签名算法,源于离散对数问题;ECC椭圆曲线加密算法,基于椭圆曲线数学理论。由于这些数学难题的实现多涉及底层模数乘法或指数运算,相对于分组密码需要更多的计算资源。为了弥补这一缺陷,非对称密码系统通常是复合式的:用高效率的对称密码算法对信息进行加密解密处理;用非对称密钥加密对称密码系统所使用的密钥。通过这种复合方式增进效率。

密钥交换算法DH

该算法的目的在于让消息的收发双方可以在安全的条件下交换密钥,以备后续加密/解密使用,DH密钥交换算法的安全性基于有限域上的离散对数难题。基于这种安全性,通过DH算法进行密钥分配,使得消息的收发双方可以安全地交换一个秘密密钥,再通过这个密钥对数据进行加密和解密处理。

流程模型

以消息传递模型为例,甲方作为发送者,乙方作为接收者。下面分析甲乙双方如何构建密钥、交互密钥和加密数据。

第一步先构建各种密钥对甲乙两方构建密钥需要经过以下几个步骤:

由消息发送的一方构建密钥,这里由甲方构建密钥由构建密钥的一方向对方公布其公钥,这里由甲方向乙方发布公钥由消息接收的一方通过对方公钥构建自身密钥,这里由乙方使用甲方公钥构建乙方密钥。由消息接收的一方向对方公布其公钥,这里由乙方向甲方公布公钥

第二步构建各自对称密钥

第三步甲乙双方都构建了本地密钥后,可按基于对称加密算法的消息传递模型完成消息传递

作为对称加密体制向非对称加密体制的一种过渡,DH算法仅仅比一般的对称加密算法多了密钥对的构建和本地密钥的构建这两项操作,而真正的数据加密/解密操作仍由对称加密算法完成,但是保证了私钥的安全

经典的非对称算法RSA

DH算法的诞生为后续非对称加密算法奠定了基础,较为典型的对称加密算法(如EIGamal、RSA和ECC算法等)都是在DH算法提出后相继出现的,并且其算法核心都源于数学问题。RSA算法基于大数因子分解难题,而ElGamal算法和ECC算法则是基于离散对数难题。

1978年,美国麻省理工学院(MIT)的Ron Rivest、 Adi Shamir和LeonardAdleman三位学者提出了一种新的非对称加密算法,这种算法以这三位学者的姓氏开头字母命名,被称为RSA算法。RSA算法被广泛接受并实现的通用公开加密算法,目前已经成为非对称加密算法国际标准。不仅如此,RSA算法既可用于数据加密也可用于数字签名。

流程模型

RSA算法代表了真正的非对称加密算法,其操作较之DH算法较为简单,在构建密钥对方面,RSA算法就相当简单。仍然以消息传递模型为例,甲方作为发送者,乙方作为接收者。下面分析甲乙双方如何构建密钥、交互密钥和加密数据。我们假设甲乙双方在消息传递之前已将RSA算法作为消息传递的加密算法。区别在于,不需要构建私钥,可以公钥加密私钥解密也可以私钥加密公钥解密,下面仅展示公钥加密私钥解密。

第一步构建密钥对

第二步加解密信息传输底层原理

其他算法模型基本上和RSA类似,不再讲述,至于其中涉及到的数学难题,我也不懂,也没深入研究的冲动,大家感兴趣自行探索。

对于非对称加解密的应用不仅仅用于加解密,因为私钥的保密性,使得非对称加解密算法具有不可抵赖性,这一点使得非对称可以完美的用于数字签名。

数字签名

通过散列函数可以确保数据内容的完整性,但这还远远不够。此外,还需要确保数据来源的可认证(鉴别)性和数据发送行为的不可否认性。完整性、可认证性和不可否认性,正是数字签名的主要特征。数字签名针对以数字形式存储的消息进行处理,产生一种带有操作者身份信息的编码。执行数字签名的实体称为签名者,签名过程中所使用的算法称为签名算法(Signature Algorithm),签名操作中生成的编码称为签名者对该消息的数字签名。发送者通过网络将消息连同其数字签名一起发送给接收者。接收者在得到该消息及其数字签名后,可以通过一个算法来验证签名的真伪以及识别相应的签名者。这一过程称为验证过程,其过程中使用的算法称为验证算法(Verification Algorithm),执行验证的实体称为验证者。数字签名离不开非对称密码体制,签名算法受私钥控制,且由签名者保密;验证算法受公钥控制,且对外公开。RSA算法则既是最为常用的非对称加密算法,又是最为常用的签名算法。DSA算法是典型的数字签名算法,虽然其本身属于非对称加密算法但是不具备数据加密与解密的功能。数字签名满足以下3个基本要求:

签名者任何时候都无法否认自己曾经签发的数字签名。信息接收者能够验证和确认收到的数字签名,但任何人无法伪造信息发送者的数字签名。当收发双方对数字签名的真伪产生争议时,通过仲裁机构(可信赖的第三方)进行仲裁

私钥用于签名,公钥用于验证。签名操作只能由私钥完成,验证操作只能由公钥完成。

因此,我们可以把数字签名算法近似看成是一种附加了公钥和私钥的消息摘要算法。数字签名算法主要包括RSA、DSA和ECDSA等算法。其中,RSA算法源于整数因子分解问题,DSA和ECDSA算法源于离散对数问题。

RSA算法是数字签名算法中的经典,主要可以分为MD系列和SHA系列两大类。RSA算法是目前应用最为广泛的非对称加密算法和数字签名算法,在电子商务和产品验证方面均有使用。DSA算法是继RSA算法后出现的基于DSS的数字签名算法,旨在形成数字签名标准。并且,DSA算法本身不包含任何消息摘要算法。DSA算法主要为后续数字签名算法的形成奠定基础。ECDSA算法相对传统签名算法具有速度快、强度高、签名短等优点,其用途也越来越广泛。微软操作系统的25位的产品密钥中就使用了椭圆曲线签名算法,产品密钥就是签名的十六进制串表示形式。

流程模型

无论是RSA,DSA,ECDSA都是基于非对称加解密体系,其流程模型基本上一致,所以我们只展示其中一种,其实模型和加解密大同小异,在此过程中省略密钥创建过程。

A向B发送消息,过程如下:

A公布自己的公钥,B获取A的公钥A使用自己的私钥对信息进行加签,得到签名S,然后将签名S以及信息M同时发送给BB使用A的公钥对接收道德签名S进行验签

在此过程中,如果C向B发送伪造的消息,B使用A的公钥对伪造消息的签名进行验签,一定是不通过的。

单向

可逆base

对称 des 效率

非对称 效率低

源码分析框架

正如我们看到的JavaAPI支持多种加密算法。如MessageDigest类,可以构建MD5、 SHA两种加密算法;Mac类可以构建HMAC加密算法;Cipher类可以构建多种加密算法,如DES、AES、Blowfish对称加密算法,以及RSA、DSA、DH等多种非对称加密算法; Signature类可以用于数字签名和签名验证;Certificate类可用于操作证书;等等。下面我们提供一个从宏观层面了解Java所提供支持的源码分析.

Java所提供的支持总共分为4个部分:

JCA(Java Cryptography Architecture,Java加密体系结构)

提供基本的加密框架,如证书、数字签名、消息摘要和密钥对产生器

JCE(Java Cryptography Extension,Java加密扩展包)

在JCA的基础上作了扩展,提供了各种加密算法、消息摘要算法和密钥管理等功能。我们已经有所了解的DES算法、AES算法、RSA算法、DSA算法等就是通过JCE来提供的。有关JCE的实现主要在javax.crypto包(及其子包)中。

JSSE (Java Secure Sockets Extension,Java安全套接字扩展包)

提供了基于SSL(Secure Sockets Layer,安全套接字层)的加密功能。在网络的传输过程中,信息会经过多个主机(很有可能其中一台就被窃听),最终传送给接收者,这是不安全的。这种确保网络通信安全的服务就是由JSSE来提供的。

JAAS(Java Authentication and Authentication Service,Java鉴别与安全服务)

提供了在Java平台上进行用户身份鉴别的功能。如何提供一个符合标准安全机制的登录模块,比如由JAAS通过可配置的方式集成至各个系统中。

JCA和JCE是Java平台提供的用于安全和加密服务的两组API。它们并不执行任何算法,它们只是连接应用和实际算法实现程序的一组接口。软件开发商可以根据JCE接口(又称安全提供者接口)将各种算法实现后,打包成Provider(安全提供者),动态地加载到Java运行环境中。根据美国出口限制规定,JCA可出口(JCA和Sun的一些默认实现包含在Java发行版中)但JCE对部分国家是限制出口的。因此,要实现一个完整的安全结构,就需要一个或多个第三方厂商提供的JCE产品,称为安全提供者。BouncyCastle JCE就是其中的一个安全提供者。JDK默认提供者如下:

java.security包为安全框架提供类和接口。通过该包中的Java实现,仅能完成消息摘要算法的实现(消息摘要处理的MessageDigest、DigestInputStream和DigestOutputStream类),并且其源代码是可见的。

而要实现真正的加密与解密,需要参考javax.crypto包中的内容。当然,这个包中的源代码内容是不可见的,可以反编译。

Provider类

Provider类实现了 Java 安全性的一部分或全部,我们称之为提供者,Provider类可能实现的服务包括:

算法(如DSA、RSA、MD5或SHA-1)。密钥的生成、转换和管理设施(如用于特定于算法的密钥)。 每个提供者都有一个名称和一个版本号,并且在它每次装入运行时中进行配置。用的最多的也就是Security.addProvider(new BouncyCastleProvider());用于增加提供者。

Security类

Security类的任务就是管理Java 程序中所用到的提供者类就是个容器。

MessageDigest类

MessageDigest类实现了消息摘要算法,它继承于MessageDigestSpi类,是Java安全提供者体系结构中最为简单的一个引擎类。

DigestInputStream类

通过MessageDigest类,我们实现了消息摘要算法,但是通过字节或字节数组的方式完成摘要操作,使用起来并不是很方便。DigestInputStream类继承了FilterInputStream类,可以通过读取输入流的方式完成摘要更新,在指定的读操作方法内部完成MessageDigest类的update()方法。

DigestOutputStream类

与DigestInputStream类相对应,DigestOutputStream类继承了FilterOutputStream类,可以通过写入输出流的方式完成摘要更新,在指定的写操作方法内部完成MessageDigest类的update()方法。

Key接□

Key接口是所有密钥接口的顶层接口,一切与加密解密有关的操作都离不开Key接口所有的密钥都具有三个特征:

算法。这里指的是密钥的算法,如DES和DSA等,通过getAlgorithm(0)方法可获得算法名。

编码形式。这里指的是密钥的外部编码形式,密钥根据标准格式(如X.509SubjectPublicKeyInfo或 PKCS#8)编码,使用getEncoded()方法可获得编码格式。

格式。这里指的是已编码密钥的格式的名称,使用getFormat()方法可获得格式。

Secretkey、PublicKey、PrivateKey三大接口继承于Key接口,定义了对称密钥和非对称密钥接口。

SecretKey接口是对称密钥顶层接口。DES、AES等多种对称密码算法密钥均可通过该接口提供,通常使用的是SecretKey接口的实现类SecretKeySpec(javax.crypto.spec.SecretKeySpec)。

PublicKey、PrivateKey接口是非对称密钥顶层接口。

后面还有很多比如我们可以通过相应的生成器和工厂类完成密钥的生成,如KeyGenerator和SecretKeyFactory用于秘密密钥的生成;KeyPairGenertor和KeyFactory用于公钥/私钥的生成。

通过Cipher及其扩展类CipherInputStream和CipherOutputStream,可以完成加密与解密算法的实现。通过Sinature类则可以完成签名与验证操作。

除此之外,还有消息摘要算法的两种实现方式:Mac类,用于实现安全消息摘要算法;MessageDigest类及其扩展类DigestInputStream和DigestOutputStream,用于实现一般消息摘要算法。

java.security.spec包和javax.crypto.spec包中主要定义通过密钥规范还原密钥对象。密钥通常以二进制的方式存储在文件中,通过这两个包中的实现我们将可以将二进制数据还原为秘密密钥、公钥和私钥对象。

对于KeyStore类以及java.security.cert包中的CertificateFactory类。在密钥管理和证书管理的操作中,会用到下次分享。

标签: #网络传输加密算法