.net加密读书笔记

来源:互联网 发布:67端口 编辑:程序博客网 时间:2024/05/20 07:16

1. 名词介绍

密钥 Secret key
对称加密算法 symmetric cryptography
非对称加密算法 asymmetric cryptography
数字签名 digital signature
证书 certificate
认证授权 certificate
摘要 digest

数字签名
非对称算法。
通过私钥对数据块进行加密,只有与之对应发布的公钥才能解密。从而确保了发布消息的正确身份。
非对称加密,即公私钥加密解密非常耗时,所以不适合为整个消息加密。因此可以用散列技术处理数据块,产生很小的摘要,通常128或160比特(bit)。
(类似做法,如网络编程中常用的CRC校验)
然后再对摘要进行数字签名。接受方解密摘要跟收到的数据块散列值进行比较,从而保证了消息再传播的过程中没有别撰改。

2 .NET的加密功能

 2.1 类介绍

   System.Security.Cryptography.SymmetricAlgorithm
      System.Security.Cryptography.DES
      System.Security.Cryptography.RC2
      System.Security.Cryptography.Rijndael
      System.Security.Cryptography.TripleDES
     
   System.Security.Cryptography.AsymmetricAlgorithm
      System.Security.Cryptography.DSA
      System.Security.Cryptography.RSA

2.2 范例

使用非对称算法加密消息的四个主要步骤
1. 获取发送者的私钥和接收者的公钥。
2. 借助随机密钥(random key)和初始化向量,用对称算法加密消息。
3. 用接收者的公钥为2步骤中的密钥和初始化向量加密。
4. 用发送者的私钥对消息进行数字签名处理。

对应的解密的四个步骤
1. 获取发送者的公钥和接收者的私钥。
2. 验证数字签名。
3. 解密密钥和初始化向量。
4. 使用解密后的密钥和初始化向量解密消息。

代码分析:

1. 获取密钥
{
 X509CertificateStore x509Store 
= null;
 
if (location == "CurrentUser")
 
{
  x509Store 
= X509CertificateStore.CurrentUserStore(X509CertificateStore.MyStore);
 }

 
else
 
{
  x509Store 
= X509CertificateStore.LocalMachineStore(X509CertificateStore.MyStore);
 }

 
bool open = x509Store.OpenRead();
 X509Certificate sender_cert 
= null;
 X509Certificate receiver_cert 
= null;
 
 
if (!open)
 
{
  
throw new Exception("unable to open the certificate store");
 }

 
 
 sender_cert 
= x509Store.FindCertificateBySubjectName("CN=XinChen, E=none@none.com")[0];
 receiver_cert 
= x509Store.FindCertificateBySubjectName("CN=Sherry, E=none@none.com")[0];
 
 RSAParameters sender_privateKey 
= sender_cert.Key.ExportParameters(true);
 RSAParameters receiver_publicKey 
= receiver_cert.PublicKey.ExportParameters(false);
}

 
2. 对称算法加密  (不指定初始密钥和初始向量,则由系统自动生成)
{
 SymmetricAlgorithm symmProvider 
= SymmetricAlgorithm.Create("TripleDES");
 
 encryptor 
= symmProvider.CreateEncryptor();

 CryptoStream encStream 
= new CryptoStream(data, encryptor, CryptoStreamMode.Read);
 MemoryStream encrypted  
= new MemoryStream();
 
byte[] buffer = new byte[1024];
 
int count = 0;
 
while ((count = encStream.Read(buffer,0,1024)) > 0)
 
{
  encrypted.Write(buffer,
0,count);
 }

}

3. 用接收者的公钥为2步骤中的密钥和初始化向量加密
{
 
byte[] key;
 
byte[] iv;
 RSACryptoServiceProvider asymmetricProvider 
= new RSACryptoServiceProvider();
 asymmetricProvider.ImportParameters(receiver_publicKey);
   
 key 
=  asymmetricProvider.Encrypt(symmProvider.Key,false);
 iv 
= asymmetricProvider.Encrypt(symmProvider.IV,false);
}

4. 创建数字签名
使用密钥为消息散列进行加密
{
byte[] signature;
asymmetricProvider.ImportParameters(sender_privateKey);
signature 
= asymmetricProvider.SignData(encrypted.ToArray(), new SHA1CryptoServiceProvider());
}


上面四个步骤的最后输出为encrypted、key、iv和signature

解密的代码演示:
1. 获取密钥
...
2. 验证数字签名
{
 asymmetricProvider.ImportParameters(sender_publicKey);
 
bool verify = asymmetricProvider.VerifyData(encrypted, new SHA1CryptoServiceProvider(), signature)
}

3. 解密密钥和初始化向量
{
asymmetricProvider.ImportParameters(receiver_privateKey);
byte[] decryptedKey = asymmetricProvider.Decrypt(key, false);
byte[] decryptediv = asymmetricProvider.Decrypt(iv, false);
}
 
4. 使用解密后的密钥和初始化向量解密消息。
{
SymmetricAlgorithm symmProvider 
= SymmetricAlgorithm.Create("TripleDES");
ICryptoTransform decryptor 
= symmProvider.CreateDecryptor(decryptedKey, decryptediv);
CryptoStream decStream 
= new CryptoStream(encrypted, decryptor, CryptoStreamMode.Read);
}
 

 

3.Hash散列举例

{
   System.Security.Cryptography.HashAlgorithm
      System.Security.Cryptography.KeyedHashAlgorithm
      System.Security.Cryptography.MD5
      System.Security.Cryptography.SHA1
      System.Security.Cryptography.SHA256
      System.Security.Cryptography.SHA384
      System.Security.Cryptography.SHA512
}

public static string Encrypt(string password) 
{
 password 
= password.ToLower();

 Byte[] clearBytes 
= new UnicodeEncoding().GetBytes(password);
 Byte[] hashedBytes 
= ((HashAlgorithm) CryptoConfig.CreateFromName("MD5")).ComputeHash(clearBytes);

 
return BitConverter.ToString(hashedBytes);
}
原创粉丝点击