加密服务学习笔记
公共网络(如 Internet)不提供实体间安全通信的方法。这种网络上的通信容易被未经授权的第三方读取甚至修改。加密有助于防止他人查看数据,它提供了检测数据是否已被修改的方式,同时有助于在非安全信道上提供安全的通信方式。例如,可以使用加密算法对数据进行加密,在加密状态下传输数据,然后由预定的接收方对数据进行解密。如果第三方截获了加密的数据,解密数据是很困难的。
一、加密基元
在使用加密的典型场合中,双方(Alice 和 Bob)在不安全的信道上通信。Alice 和 Bob 想要确保任何可能正在侦听的人无法理解他们之间的通信。而且,由于 Alice 和 Bob 相距遥远,因此 Alice 必须确保她从 Bob 处收到的信息没有在传输期间被任何人修改。此外,她必须确保信息确实是来自 Bob,而不是来自模仿 Bob 的人。
加密用于达到以下目的:
为了达到这些目的,您可以使用算法和惯例的组合(称作加密基元)来创建加密方案。下表列出了加密基元及它们的用法。
二、私钥加密
私钥加密算法使用单个私钥来加密和解密数据。由于具有密钥的任意一方都可以使用该密钥解密您的数据,或加密他们自己的数据并声称该数据源自您,因此必须保护密钥不被未经授权的代理得到。
私钥加密又称为对称加密,因为同一密钥既用于加密又用于解密。私钥加密算法的速度非常快(与公钥算法相比),它特别适用于对较大的数据流执行加密转换。从数学角度而言,非对称加密算法(例如 RSA)在可加密的数据量方面存在限制。对称加密算法一般则没有这些问题。
有一种私钥算法称为分组加密,它用于一次加密一个数据组。分组加密(例如数据加密标准 (DES)、TripleDES 和高级加密标准 (AES))可将 n 字节的输入组通过加密转换为由加密字节构成的输出组。如果要加密或解密字节序列,必须逐组进行。由于 n 很小(DES 和 TripleDES 为 8 字节;AES 为 16 字节 [默认值]、24 字节或 32 字节),因此如果数据值大于 n,则必须一次加密一组。如果数据值小于 n,则必须将其扩展为 n 才能进行处理。
有一种简单的分组加密称为电子密码本 (ECB) 模式。一般认为,ECB 模式并不安全,因为它并不使用初始化向量初始化第一个纯文本组。对于给定的私钥 k,一个不使用初始化向量的简单组密码会将相同的纯文本输入分组加密为相同的密码文本输出组。因此,如果输入纯文本流中存在重复的组,则输出密码文本流中也将存在重复的组。这些重复的输出组会使未经授权的用户察觉数据可能采用了不可靠的加密算法,进而想出可能的攻击模式。因此,ECB 密码模式十分易于分析,因此最终会被他人发现密钥。
基类库中提供的分组加密类使用一种称为密码组链 (CBC) 的默认链模式,但您可以根据需要更改此默认设置。
通过使用初始化向量 (IV) 加密第一个纯文本组,CBC 密码克服了与 ECB 密码关联的问题。每个后续纯文本组都会在加密前与前一个密码文本组进行按位“异或”(XOR) 运算。因此,每个密码文本组都依赖于它前面的所有组。采用这种系统时,即使未经授权的用户可能已知道公共消息头,也无法将其用于对密钥进行反向工程。
使用 CBC 密码加密数据时,危及数据安全的一种做法是对每个可能的密钥执行穷举搜索。根据执行加密时使用的密钥大小,即便使用最快的计算机,这种搜索也可能极为耗时,因而此做法并不可行。使用较大的密钥大小将使解密更加困难。从理论上说,加密并不能防止对手检索到加密的数据,但它确实增加了这样做的成本。如果执行穷举搜索需要三个月才能检索到只在几天内有意义的数据,那么穷举搜索方法就并不实用。
私钥加密的缺点是它假定双方已就密钥和 IV 达成协议,并且互相传达了密钥和 IV 的值。一般认为,IV 并不安全,且可以在消息的纯文本中传输。但是,密钥必须对未经授权的用户保密。由于存在这些问题,因此通常将私钥加密与公钥加密配合使用,以秘密地传达密钥和 IV 的值。
假定 Alice 和 Bob 是希望在非安全信道上通信的双方,他们可以按如下方式使用私钥加密:Alice 和 Bob 同意对特定的密钥和 IV 应用一种特定的算法(例如 AES)。Alice 撰写一条消息并创建要在其上发送该消息的网络流(可能是一个命名管道或网络电子邮件)。接下来,她使用该密钥和 IV 加密文本,并通过 Intranet 向 Bob 发送该加密消息和 IV。Bob 在收到该加密文本后,可使用 IV 和预先商定的密钥对它进行解密。即使传输的内容被人截获,截获者也无法恢复原始消息,因为他并不知道密钥。在此方案中,只有密钥必须保密。在一个实际方案中,将由 Alice 或 Bob 生成私钥并使用公钥(不对称)加密将私钥(对称)传递给对方。有关公钥加密的更多信息,请参见下一节。
三、公钥加密
公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。公钥和私钥在数学上是关联在一起的;用公钥加密的数据只能用私钥解密,而用私钥签名的数据只能用公钥验证。公钥可以提供给任何人;公钥用于对要发送到私钥持有者的数据进行加密。公钥加密算法又称为非对称算法,原因是需要用一个密钥加密数据,而用另一个密钥来解密数据。基本的加密规则禁止密钥重用,并且对于每一个通信会话公钥和私钥都应该是唯一的。但实际上,非对称密钥通常可持续使用。
双方(Alice 和 Bob)可以按照下列方式使用公钥加密:首先,Alice 生成一个公钥/私钥对。如果 Bob 想要给 Alice 发送一条加密的消息,他将向她索要她的公钥。Alice 通过非安全网络将她的公钥发送给 Bob,Bob 接着使用该密钥加密消息。Bob 将加密的消息发送给 Alice,而 Alice 使用她的私钥解密该消息。如果 Bob 通过非安全信道(例如公共网络)接收 Alice 的密钥,则 Bob 可能会受到“中间人”攻击。因此,Bob 必须与 Alice 验证他收到的公钥副本是否正确。
在传输 Alice 的公钥期间,未经授权的代理可能会截获该密钥。而且,同一代理可能截获来自 Bob 的加密消息。但是,该代理无法用公钥解密该消息。该消息只能用 Alice 的私钥解密,而该私钥并没有被传输。Alice 不使用她的私钥加密给 Bob 的答复消息,原因是任何具有公钥的人都可以解密该消息。如果 Alice 想要将消息发送回 Bob,她将向 Bob 索要他的公钥并使用该公钥加密她的消息。然后,Bob 使用与他相关联的私钥来解密该消息。
在此方案中,Alice 和 Bob 使用公钥(非对称)加密来传输私钥(对称),并对其会话的其余部分使用私钥加密。
下表对公钥加密算法和私钥加密算法进行了比较:
四、数字签名
公钥算法还可用于构成数字签名。数字签名验证发送方的身份(如果您信任发送方的公钥)并帮助保护数据的完整性。使用由 Alice 生成的公钥,Alice 的数据的接收者可以通过将数字签名与 Alice 的数据和 Alice 的公钥进行比较来验证是否是 Alice 发送了该数据。
为了使用公钥加密对消息进行数字签名,Alice 首先将哈希算法应用于该消息以创建消息摘要。该消息摘要是数据的紧凑且唯一的表示形式。然后,Alice 用她的私钥加密该消息摘要以创建她的个人签名。在收到消息和签名时,Bob 使用 Alice 的公钥解密签名以恢复消息摘要,并使用与 Alice 所使用的相同的哈希算法来散列消息。如果 Bob 计算的消息摘要与从 Alice 那里收到的消息摘要完全一致,Bob 就可以确定该消息来自私钥的持有人,并且数据未被修改过。如果 Bob 相信 Alice 是私钥的持有人,则他将知道该消息来自 Alice。
注意:由于发送方的公钥为大家所共知,并且它通常包含在数字签名格式中,因此任何人都可以验证签名。此方法不保守消息的机密;若要使消息保密,还必须对消息进行加密。
五、哈希值
哈希算法可将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值就称为哈希值。哈希值是一段数据的数值表示形式。散列一段纯文本时,即使只更改段落中的一个字母,随后的散列计算都会产生不同的值。如果哈希已进行强加密,其值将发生显著更改。例如,如果更改了消息的一个位,强哈希函数就可能生成相差 50% 的输出。很多输入值可能会散列为相同的输出值。但是,要找到散列为同一个值的两个不同的输入,在计算上是不可行的。
双方(Alice 和 Bob)可以使用一个哈希函数来确保消息的完整性。他们将选择一个哈希算法来签署其消息。Alice 将写一条消息,然后使用选定的算法创建该消息的哈希。然后他们将采用以下方法之一:
为了使此系统发挥作用,Alice 必须对除 Bob 外的所有人保密其原始的哈希值。
由于 Alice 的消息是以纯文本形式传输的,因此前面的任何方法都无法防止他人读取 Alice 的消息。完整安全性通常需要数字签名(消息签名)和加密。
注意:1996 年,人们发现了 MD5 的设计缺陷,并建议改用 SHA-1。2004 年,人们又发现了 MD5 的其他缺陷,因此认为这种算法已不再安全。另外,SHA-1 算法也暴露出不安全的方面,现在已建议改用 SHA-2。
六、随机数生成
随机数生成是许多加密操作不可分割的组成部分。例如,加密密钥需要尽可能地随机,以便使生成的密钥很难再现。加密随机数生成器所生成的输出必须满足以下条件:用优于二分之一的概率来预测从计算上而言是不可行的。因此,任何预测下一输出位的方法都不得优于随机猜测法。
参考网址:http://msdn.microsoft.com/zh-cn/library/92f9ye3s.aspx
建议继续学习:
- 网址加密(URL加密)(RC4、PHP、密钥长度可变) (阅读:6884)
- 在浏览器中加密Cookie (阅读:4532)
- 代理的加密部分 (阅读:4492)
- 使用bcompiler对PHP文件进行加密 (阅读:4316)
- 使用系统命令实现文件的压缩与加密 (阅读:4002)
- 公钥私钥加密解密数字证书数字签名详解 (阅读:3978)
- 可逆的加密方法(Mcrypt Encryption Functions) (阅读:3675)
- 加密你的shell (阅读:3583)
- 如何“加密”你的email地址 (阅读:3134)
- 具有时效性的PHP字符串加密解密函数 (阅读:3088)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:标点符 来源: 标点符
- 标签: 加密
- 发布时间:2012-05-08 00:07:39
- [68] Go Reflect 性能
- [68] 如何拿下简短的域名
- [67] Oracle MTS模式下 进程地址与会话信
- [62] IOS安全–浅谈关于IOS加固的几种方法
- [61] 图书馆的世界纪录
- [60] 【社会化设计】自我(self)部分――欢迎区
- [58] android 开发入门
- [56] 视觉调整-设计师 vs. 逻辑
- [49] 给自己的字体课(一)——英文字体基础
- [48] 读书笔记-壹百度:百度十年千倍的29条法则