如果用戶 A 要和 B 進(jìn)行數(shù)據(jù)交換,A 要通過網(wǎng)絡(luò)發(fā)送一段文字給 B,那如何保證數(shù)據(jù)在傳輸?shù)倪^程中是安全的呢?并且即使被別人截獲,也無法知道數(shù)據(jù)的內(nèi)容,這就用到加密技術(shù)。
	對稱密碼體制
	發(fā)送方用一個密鑰對數(shù)據(jù)進(jìn)行加密,接收方使用相同的密鑰進(jìn)行解密。
	? 加密和解密 的密鑰相同
	? 如何獲取或交換密鑰,保證密鑰的私密性非常重要
	? 密鑰量級是參與者的平方級數(shù),數(shù)量比較多
	? 適合對大量數(shù)據(jù)進(jìn)行加密,加密解密速度快
	? 加解密易于通過硬件實現(xiàn)
	非對稱密碼體制
	每個網(wǎng)絡(luò)參與者都有一對密鑰 - 私鑰和公鑰。用戶 A 的公鑰是公開的,任何與 A 通信的人都可以獲取,用來加密數(shù)據(jù)后發(fā)送給 A。A 的私鑰只有自己知道,用來解密數(shù)據(jù)。
	? 公鑰用來加密,私鑰用來解密。公私鑰不相同也不相關(guān)
	? 公鑰的交換無需保密
	? 密鑰的量級為參與者的數(shù)目
	? 加解密速度慢,不適合大量數(shù)據(jù)加密,常用于 對稱密碼 協(xié)商共享密鑰
	? 加解密操作難以通過硬件實現(xiàn)
	數(shù)字簽名
	用戶 A 發(fā)送給 B,B 如何確定數(shù)據(jù)是用戶 A 發(fā)送的,而不是別人偽造的數(shù)據(jù)呢?數(shù)字簽名可以鑒別消息的發(fā)送者
	? 用戶 A 先將要發(fā)送的數(shù)據(jù)進(jìn)行 MD5 計算生成唯一的 消息摘要 a
	? A 用私鑰簽名消息摘要 a
	? A 把數(shù)據(jù)和消息摘要 a 組合起來發(fā)送給 B
	? B 收到后用 A 的公鑰對消息摘要驗簽得到 a
	? B 用 MD5 算法對數(shù)據(jù)部分進(jìn)行計算得到消息摘要 b
	? B 對 a 和 b 進(jìn)行比較。如果相同則證明是 A 發(fā)送過來的
	A 計算數(shù)據(jù)的消息摘要,并用私鑰進(jìn)行加密的過程稱為 簽名算法。B 用 A 的公鑰解密消息摘要,并與自己計算的消息摘要進(jìn)行對比的過程稱為 驗證算法。
	如果直接對數(shù)據(jù)本身直接計算數(shù)字簽名,會比較耗時。所以一般做法是先將原數(shù)據(jù)進(jìn)行 Hash 運(yùn)算,得到的 Hash 值就叫做“摘要”。
	數(shù)字證書
	用戶 A 要給用戶 B 發(fā)送數(shù)據(jù),如何保證用戶 A 拿到的一定是用戶 B 的公鑰呢?
	數(shù)字證書是標(biāo)志通訊各方身份信息的一串?dāng)?shù)字,不是數(shù)字身份證而是身份認(rèn)證機(jī)構(gòu)蓋在數(shù)字身份證上的一個章或印。由權(quán)威機(jī)構(gòu)-CA(Certificate Authority)發(fā)行的,用來識別對方的身份。
	X.509是一種通用的證書規(guī)范。
	常見的數(shù)字證書格式:
	? .cer .crt - 用于存放證書,它是二進(jìn)制形式存放的,不含私鑰。
	? .pfx .p12 - 存放個人證書/私鑰,通常包含保護(hù)密碼,2 進(jìn)制方式
	從證書文件獲得證書對象:
	X509Certificate2 cert = new X509Certificate2 (@"c:/myCert.crt" );
	// 保護(hù)密碼
	String password = GetCertPassword();
	X509Certificate2 cert = new X509Certificate2 (@"c:/myCert.pfx", password);
	從本地證書容器獲得證書對象:
	private static X509Certificate2 GetCertificateFromStore(string certName)
	{
	// Get the certificate store for the current user.
	X509Store store = new X509Store(StoreLocation.CurrentUser);
	try
	{
	store.Open(OpenFlags.ReadOnly);
	// Place all certificates in an X509Certificate2Collection object.
	X509Certificate2Collection certCollection = store.Certificates;
	// If using a certificate with a trusted root you do not need to FindByTimeValid, instead:
	// currentCerts.Find(X509FindType.FindBySubjectDistinguishedName, certName, true);
	X509Certificate2Collection currentCerts = certCollection.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
	X509Certificate2Collection signingCert = currentCerts.Find(X509FindType.FindBySubjectDistinguishedName, certName, false);
	if (signingCert.Count == 0)
	return null;
	// Return the first certificate in the collection, has the right name and is current.
	return signingCert[0];
	}
	finally
	{
	store.Close();
	}
	}
	// 驗證證書有效期
	if (cert.NotAfter <= DateTime .Now)
	{
	throw new ApplicationException (" 用戶證書已經(jīng)過期!" );
	}
	// 獲取公鑰
	RSA publickKey = (RSA)cert.PublicKey.Key;
	RSA privateKey = cert.GetRSAPrivateKey();
	public class RSAHelper
	{
	/// RSA加密
	///
	///公鑰
	///
	///
	public static string RSAEncrypt(string xmlPublicKey, string m_strEncryptString)
	{
	RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
	provider.FromXmlString(xmlPublicKey);
	byte[] bytes = new UnicodeEncoding().GetBytes(m_strEncryptString);
	return Convert.ToBase64String(provider.Encrypt(bytes, false));
	}
	///
	
	/// RSA解密
	///
	///私鑰
	///
	///
	public static string RSADecrypt(string xmlPrivateKey, string m_strDecryptString)
	{
	RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
	provider.FromXmlString(xmlPrivateKey);
	byte[] rgb = Convert.FromBase64String(m_strDecryptString);
	byte[] bytes = provider.Decrypt(rgb, false);
	return new UnicodeEncoding().GetString(bytes);
	}
	}
	審核編輯:劉清
- 
                                密鑰
                                +關(guān)注
關(guān)注
1文章
148瀏覽量
20741 - 
                                加密技術(shù)
                                +關(guān)注
關(guān)注
0文章
147瀏覽量
17758 - 
                                加解密
                                +關(guān)注
關(guān)注
0文章
18瀏覽量
6688 
發(fā)布評論請先 登錄
如何確保DMA傳輸過程中的數(shù)據(jù)都是好的?
使用PCM4204進(jìn)行音頻數(shù)據(jù)采集的過程中,如何把采集到的音頻數(shù)據(jù)通過USB傳輸到PC上呢?
請問ldc1000在與主機(jī)進(jìn)行數(shù)據(jù)傳輸的過程中,數(shù)據(jù)傳輸速率設(shè)置為多大合適?
熱敏打印機(jī)打出數(shù)據(jù)在電流傳輸過程中的獲取
如何減少SPDIF傳輸過程中時鐘抖動
轉(zhuǎn):如何減少SPDIF傳輸過程中時鐘抖動
有什么辦法能解決高速數(shù)據(jù)在采樣、傳輸過程中遇到的問題?
如何保證數(shù)據(jù)在傳輸過程中的安全呢(防竊?。?/a>
modbus在通信的過程中如何實現(xiàn)大數(shù)據(jù)包的傳輸?
SMT加工過程中有哪些機(jī)器設(shè)備可以給客戶保證品質(zhì)呢?
Jtti.cc如何確保海外服務(wù)器租用過程中的數(shù)據(jù)安全?
如何保障遠(yuǎn)程運(yùn)維過程中的數(shù)據(jù)安全和隱私?
    
          
        
        
如何保證數(shù)據(jù)在傳輸?shù)倪^程中是安全的呢
                
 
           
            
            
                
            
評論