.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. 使用解密后的密钥和初始化向量解密消息。
代码分析:
...{
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);
}
- .net加密读书笔记
- .NET 读书笔记
- .Net 加密
- .net加密
- XenoCodeXenoCode 加密加密 .NET混淆.NET混淆
- .Net加密锁(对.NET加密保护)
- .Net加密锁(对.NET加密保护)
- Essential .NET读书笔记
- Essential .NET读书笔记
- .net framework 读书笔记
- VC++.NET读书笔记(1)
- .NET Framework读书笔记
- ADO.NET读书笔记
- ASP.NET Unleashed读书笔记
- .Net设计规范读书笔记
- .net 之美读书笔记
- ASP.NET MD5加密
- .NET中MD5加密
- Ready To Go!
- 面向对象程序设计和PHP
- 在Domino R6.x里,如何为多个数据库的ACL设置“复制或拷贝文档”?
- Taglib 原理和实现之支持El表达式(转贴)
- TCP连接的三次握手
- .net加密读书笔记
- 一些关于中文乱码问题的一些解决方案分类
- EL表达式(转贴)
- Java的多线程-线程间的通信(1)
- Java的多线程-线程间的通信(2)
- 单文档视图结构中利用OpenGL绘制图形
- 架构和框架的区别
- Java的多线程-线程间的通信(3)
- Java的多线程-线程间的通信(4)