(转)关于私钥加密、公钥加密、签名在生活中的场景

背景:对公钥和私钥的相关总结。

不要去硬记。
你只要想:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证。

 

1. 私钥加密

也就是对称加密。这种算法采用同一个密钥(Key)对数据进行加密和解密,虽然可以通过设置初始化向量(IV),但因为在加密方和解密方中需要共享这两部分信息,相对而言,它不够安全。

但一般来说,它也已经足够安全,而且足够简单,尤其是对于加密数据而言。很多硬件设备(例如ATM提款机)都是内置了私钥加密方法的,据说是DES算法

私钥加密算法使用单个私钥来加密和解密数据。由于具有密钥的任意一方都可以使用该密钥解密您的数据,或加密他们自己的数据并声称该数据源自您,因此必须保护密钥不被未经授权的代理得到。

私钥加密又称为对称加密,因为同一密钥既用于加密又用于解密。私钥加密算法的速度非常快(与公钥算法相比),它特别适用于对较大的数据流执行加密转换。从数学角度而言,非对称加密算法(例如 RSA)在可加密的数据量方面存在限制。对称加密算法一般则没有这些问题。

私钥加密的方式速度比较快,但它的密钥通常需要非对称的方式来进行保护。

假定小红和小明是希望在非安全信道上通信的双方,他们可以按如下方式使用私钥加密:小红和小明都同意对特定的密钥和 IV 应用一种特定的算法(例如 AES)。
小红撰写一条消息并创建要在其上发送该消息的网络流。接下来,她使用该密钥和 IV 加密文本,并通过 Internet 发送该文本。她不能向小明发送密钥,但可以发送 IV。
小明在收到该加密文本后,可使用预先商定的密钥和 IV 对它进行解密。即使传输的内容被人截获,截获者也无法恢复原始消息,因为他并不知道密钥。
在这个方案中,密钥必须保密,但 IV 不需要保密。在一个实际方案中,将由小红或小明生成私钥并使用公钥(不对称)加密将私钥(对称)传递给对方

 

.NET Framework 提供了以下类来实现私钥加密算法:

  • AesManaged(在 .NET Framework 3.5 版中引入)。

  • DESCryptoServiceProvider。

  • HMACSHA1(从技术上讲,这是一种私钥算法,因为它表示结合使用加密哈希函数和私钥计算的消息身份验证代码。请参见本主题后面的哈希值。)

  • RC2CryptoServiceProvider。

  • RijndaelManaged。

  • TripleDESCryptoServiceProvider

 

2. 公钥加密

也就是非对称加密。这种算法采用公钥和私钥两个密钥,如果利用公钥进行加密,而用私钥解密,这种场景属于数据保护。而如果利用私钥加密,利用公钥解密,虽然是行得通的 ,但其实不可能会这样用,因为任何拥有公钥的接收方都可以解开数据,而公钥本来就是公开的,这样实现不了数据保护的目的。

公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。
公钥和私钥在数学上是关联在一起的;用公钥加密的数据只能用私钥解密,而用私钥签名的数据只能用公钥验证。公钥可以提供给任何人;公钥用于对要发送到私钥持有者的数据进行加密。
公钥加密算法又称为非对称算法,原因是需要用一个密钥加密数据,而用另一个密钥来解密数据。对于每个通信会话,这两个密钥应该都是唯一的。
不过,尽管非对称算法具有此项要求,但在实践中,非对称密钥通常却有较长的生存期。

 

再来看一个例子

双方(小红和小明)可以按照下列方式使用公钥加密: 首先,小红生成一个公钥/私钥对。如果小明想要给小红发送一条加密的消息,他将向她索要她的公钥。
小红通过非安全网络将她的公钥发送给小明,小明接着使用该密钥加密消息。小明将加密的消息发送给小红,而小红使用她的私钥解密该消息。
如果小明通过非安全信道(例如公共网络)接收小红的密钥,则小明可能会受到“中间人”攻击。因此,小明必须与小红验证他收到的公钥副本是否正确。 但是,在传输小红的公钥期间,未经授权的代理可能会截获该密钥。而且,同一代理可能截获来自小明的加密消息。但是,该代理无法用公钥解密该消息。该消息只能用小红的私钥解密,而该私钥并没有被传输。
小红不使用她的私钥加密给小明的答复消息,原因是任何具有公钥的人都可以解密该消息。如果小红想要将消息发送回小明,她将向小明索要他的公钥并使用该公钥加密她的消息。然后,小明使用与他相关联的私钥来解密该消息。 在此方案中,小红和小明使用公钥(非对称)加密来传输私钥(对称),并对其会话的其余部分使用私钥加密。

 

.NET Framework 提供了以下类来实现公钥加密算法:

  • DSACryptoServiceProvider

  • RSACryptoServiceProvider

  • ECDiffieHellman(基类)

  • ECDiffieHellmanCng

  • ECDiffieHellmanCngPublicKey(基类)

  • ECDiffieHellmanKeyDerivationFunction(基类)

  • ECDsaCng

RSA 允许同时进行加密和签名,但 DSA 只能用于签名,Diffie-Hellman 只能用于生成密钥。通常情况下,公钥算法比私钥算法具有更多的使用限制。

 

注意:证书从本质上说是一种特殊的公钥加密手段,特殊之处在于它可以存储在机器上,并且可以导出文件进行传递。

3. 数字签名

公钥算法还可用于构成数字签名。数字签名验证发送方的身份(如果您信任发送方的公钥)并帮助保护数据的完整性。
使用由小红生成的公钥,小红的数据的接收者可以通过将数字签名与小红的数据和小红的公钥进行比较来验证是否是小红发送了该数据。 为了使用公钥加密对消息进行数字签名,小红首先将哈希算法应用于该消息以创建消息摘要。该消息摘要是数据的紧凑且唯一的表示形式。
然后,小红用她的私钥加密该消息摘要以创建她的个人签名。在收到消息和签名时,小明使用小红的公钥解密签名以恢复消息摘要,并使用与小红所使用的相同的哈希算法来散列消息。
如果小明计算的消息摘要与从小红那里收到的消息摘要完全一致,小明就可以确定该消息来自私钥的持有人,并且数据未被修改过。如果小明相信小红是私钥的持有人,则他将知道该消息来自小红。

 

由于发送方的公钥为大家所共知,并且它通常包含在数字签名格式中,因此任何人都可以验证签名。此方法不保守消息的机密;若要使消息保密,还必须对消息进行加密。

.NET Framework 提供了以下类来实现数字签名算法:

  • DSACryptoServiceProvider

  • RSACryptoServiceProvider

  • ECDsa(基类)

  • ECDsaCng

 

4. 哈希

哈希值

哈希算法可将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值就称为哈希值。哈希值是一段数据的数值表示形式。散列一段纯文本时,即使只更改段落中的一个字母,随后的散列计算都会产生不同的值。如果哈希已进行强加密,其值将发生显著更改。例如,如果更改了消息的一个位,强哈希函数就可能生成相差 50% 的输出。很多输入值可能会散列为相同的输出值。但是,要找到散列为同一个值的两个不同的输入,在计算上是不可行的。

双方(小红和小明)可按以下方式使用哈希函数,以确保数据完整性:小红撰写要发送给小明的消息,并创建该消息的哈希。
随后,小明可以散列该消息,并将得到的哈希与原始哈希进行比较。如果这两个哈希值相同,则说明消息未被更改。
如若不同,则说明该消息在由小红撰写后已被他人更改。为了使此系统发挥作用,小红必须对除小明外的所有人保密原始的哈希值。
此外,也可以公开该哈希值,但条件是没有人能够对它进行修改。

 

.NET Framework 提供了以下类来实现数字签名算法:

  • HMACSHA1。

  • MACTripleDES。

  • MD5CryptoServiceProvider。

  • RIPEMD160。

  • SHA1Managed。

  • SHA256Managed。

  • SHA384Managed。

  • SHA512Managed。

  • 所有安全哈希算法 (SHA)、消息摘要 5 (MD5) 和 RIPEMD-160 算法的 HMAC 变体。

  • 所有 SHA 算法的 CryptoServiceProvider 实现(托管代码包装)。

  • 所有 MD5 和 SHA 算法的下一代加密技术 (CNG) 实现。

注意:

1966 年,人们发现了 MD5 的设计缺陷,并建议改用 SHA-1。2004 年,人们又发现了 MD5 的其他缺陷,因此认为这种算法已不再安全。另外,SHA-1 算法也暴露出不安全的方面,现在已建议改用 SHA-2。

 

posted @ 2017-10-19 17:23  CS408  阅读(1151)  评论(0编辑  收藏  举报