俞志兵
南京市天印高級中學(xué) 南京 211151
作者:俞志兵,本科,中學(xué)一級教師,長期從事高中信息技術(shù)教學(xué)工作,任信息技術(shù)教研組組長,擅長網(wǎng)站開發(fā)。
總的來說,加密有兩種形式:1)對稱加密,加密和解密時使用的是同一個密鑰;2)非對稱加密,加密和解密時將使用不同的密鑰。通常是用公鑰作為加密密鑰,任何人都可以用它來加密信息。私鑰才是用來解密密鑰的,它只能用來對使用其對應(yīng)的公鑰加密的數(shù)據(jù)進行解密。對稱加密相對而言速度更快,但由于加密者和解密者都知道這個唯一的密鑰,因此安全性更差一些。非對稱加密則通過密鑰的方法來解決這個問題,由于私鑰永遠不會暴露,所以第三方更加難以破解其加密的信息。由于密鑰的方法需要更長的處理時間,因此通常的方法是使用非對稱密鑰加密機制在因特網(wǎng)上實現(xiàn)對對稱密鑰的加密,這樣就使這個用于加密的密鑰更安全,不會暴露給第三方。
在.NET的命名空間System.Security.Cryptography中提供了幾種算法。可用的非對稱算法包括DSA(Digital Signature Algorithm,數(shù)字簽名算法)和RSA(Rivest-Shamir-Adleman算法,它由3個發(fā)明者的名字組成:Ronald Rivest、Adi Shamir和Leonard Adleman)兩種。其中DSA只能夠用來對數(shù)據(jù)進行“簽名”,因此通常用來做驗證,而RSA更加通用。DSA現(xiàn)在是美國政府使用的數(shù)字驗證的標(biāo)準(zhǔn)。
.NET框架中可以找到的對稱加密算法包括DES(Data Encryption Standard,數(shù)字加密標(biāo)準(zhǔn))、Triple DES(3DES)、RC2(Ron’s Code或Rivest’s Cipher,都是源于Ronald Rivest)和Rijndael(源于其發(fā)明者John Daemem、Vincent Rijman的名字)。DES成為標(biāo)準(zhǔn)已經(jīng)有一段時間,盡管它也不斷發(fā)生變化。3DES和RC2都是DES的變種。3DES是通過對數(shù)據(jù)進行3次獨立的DES加密,扣除奇偶校驗位,其總的密鑰長度也達到168位。RC2的密鑰長度是可以變化的,最大可以達到128(如果要更長的密鑰,可以使用RC3、RC4等),因此根據(jù)密鑰長度不同,可能比DES更脆弱或更強壯。Rijndael是一種完全不同的加密方法,現(xiàn)在已經(jīng)被接納為新的AES(高級加密標(biāo)準(zhǔn))。該標(biāo)準(zhǔn)的目標(biāo)是替代DES。
由于.NET框架中的類是針對數(shù)據(jù)流進行優(yōu)化的,因此需要花一些時間來處理數(shù)據(jù)格式轉(zhuǎn)換。同樣需要定義一個密鑰以及執(zhí)行加密或解密操作的初始向量(IV)。需要使用IV應(yīng)歸究于加密的本性:為一串?dāng)?shù)據(jù)位計算加密值時,將會用到前面一串?dāng)?shù)據(jù)位的加密值。由于在加密開始時并不存在這些值,因此用IV來代替。在實踐中,IV和密鑰都將表示為一個字節(jié)的數(shù)組,而在DES加密中,其長度是64位(8字節(jié)),由于解密算法與加密算法類似,加密需要寫入加密數(shù)據(jù)的目標(biāo)數(shù)據(jù)流,而解密需要一個從中讀取已加密數(shù)據(jù)的源數(shù)據(jù)流。
對一個字符串進行加密所需的步驟:將源字符串轉(zhuǎn)換為一個字節(jié)數(shù)組;初始化一個加密算法類;使用這個加密算法類來生成一個加密者(encryptor)對象,實現(xiàn)Icrypto-Transform接口,它需要密鑰和IV值;使用加密者對象來初始化一個密文數(shù)據(jù)流(CryptoStream對象),該數(shù)據(jù)流還需要知道要加密哪些數(shù)據(jù),以及用來寫入加密數(shù)據(jù)的目標(biāo)數(shù)據(jù)流;使用這個密文數(shù)據(jù)流生成已加密數(shù)據(jù),并寫到由前面創(chuàng)建的源字節(jié)數(shù)組創(chuàng)建的目標(biāo)內(nèi)存數(shù)據(jù)流中;獲取存儲在這個數(shù)據(jù)流中的字節(jié)數(shù)據(jù);將這些字節(jié)數(shù)據(jù)轉(zhuǎn)換成一個字符串。
解密所采用的模式與加密類似:將源字符串轉(zhuǎn)換成一個字節(jié)數(shù)組;根據(jù)這個字節(jié)數(shù)組填充內(nèi)存數(shù)據(jù)流的值;初始化一個加密算法類;使用加密算法類生成一個解密者(decryptor)對象,實現(xiàn)ICryptoTransform接口,它需要密鑰和IV值;使用解密者對象來初始化一個密文數(shù)據(jù)流(ICryptoStream)對象,該數(shù)據(jù)流還需要知道解密什么數(shù)據(jù),并需要一個從中讀取已加密數(shù)據(jù)的源數(shù)據(jù)流;使用密文數(shù)據(jù)流來讀取已經(jīng)解密數(shù)據(jù)(可以使用StreamReader.ReadToEnd方法來獲取字符串型結(jié)果)。
限于篇幅,本文只給出加密方法,讀者可以根據(jù)加密方法自己寫出解密方法。
在網(wǎng)站根目錄下,新建文件夾(SecurityLib),在這個文件夾中新建類,命名為StringEncryptor。其Encrypt()方法如下所示:
public static string Encrypt(string sourceData)
{
set key and initialization vector values
byte[] key = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
byte[] iv = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
try
{ convert data to byte array
byte[] sourceDataBytes =
System.Text.ASCIIEncoding.ASCII.GetBytes(sourceData);
get target memory stream
MemoryStream tempStream = new MemoryStream();
get encryptor and encryption stream
DESCryptoServiceProvider encryptor =
new DESCryptoServiceProvider();
CryptoStream encryptionStream =
new CryptoStream(tempStream,
encryptor.CreateEncryptor(key, iv),
CryptoStreamMode.Write);
encrypt data
encryptionStream.Write(sourceDataBytes, 0,
sourceDataBytes.Length);
encryptionStream.FlushFinalBlock();
put data into byte array
byte[] encryptedDataBytes = tempStream.GetBuffer();
convert encrypted data into string
return Convert.ToBase64String(encryptedDataBytes, 0,(int)tempStream.Length);
}
}
1)網(wǎng)站根目錄下新建Web頁面,命名為SecurityTest.asp,做如下編輯:
Enter data to encrypt:
Enter data to decrypt:
2)修改SecurityTest.aspx.cs中的代碼:
using System;
…
using System.Text;
using SecurityLib;
…
protected void processButton_Click(object sender, EventArgs e)
{
string stringToEncrypt = encryptBox.Text;
string stringToDecrypt = decryptBox.Text;
string encryptedString =
StringEncryptor.Encrypt(stringToEncrypt);
if (stringToDecrypt == "")
{
stringToDecrypt = encryptedString;
}
string decryptedString =
StringEncryptor.Decrypt(stringToDecrypt);
StringBuilder sb = new StringBuilder();
sb.Append(“Encrypted data: “);
sb.Append(encryptedString);
sb.Append(“
Decrypted data: “);
sb.Append(decryptedString);
result.Text = sb.ToString();
}
3)在瀏覽器中運行SecurityTest.aspx,在第一個要加密的文本框中輸入“i am yuzhibing”,然后點擊Process按鈕,其結(jié)果如圖1所示。
現(xiàn)在絕大部分電子商務(wù)網(wǎng)站或平臺,都需要用戶檔案系統(tǒng),需要用戶編輯客戶詳情,包括信用卡詳情。信用卡中的信息出于安全因素考慮,必須加密后保存到數(shù)據(jù)層的數(shù)據(jù)庫中。登錄客戶編輯自己的信息,就需要從數(shù)據(jù)庫中解密到表示層。
[1]鄭齊心,房大偉,劉云峰.ASP.NET項目開發(fā)案例全程實錄[M].2版.北京:清華大學(xué)出版社,2011.
[2]趙松濤,陳小龍.Visual Studio 2005+SQL Server2005數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)[M].北京:電子工業(yè)出版社,2007.
[3]Darie C, Watson K. ASP.NET 2.0電子商務(wù)開發(fā)實戰(zhàn)[M].北京:人民郵電出版社,2007.
| 国产免费三级av在线| 午夜免费啪视频| 大学生被内谢粉嫩无套| 国产精品无码不卡在线播放| 日韩国产自拍视频在线观看| 久久99精品久久久久久清纯| 国产精品老熟女露脸视频| 国产内射XXXXX在线| 美女福利视频网址导航| 国产香蕉视频在线播放| 国产卡一卡二卡三| 亚洲色欲Aⅴ无码一区二区| 日韩字幕无线乱码免费| 亚洲人成在线播放网站| 国产丝袜无码一区二区三区视频| 免费看欧美日韩一区二区三区| 日本在线一区二区在线| 妺妺窝人体色777777| 亚洲av综合色区无码一二三区 | 成年无码av片完整版| 亚洲男人天堂2019| 人妻人妻少妇在线系列| 国产精品丝袜一区二区三区在线| 日韩中文字幕一区二区二区| 成人性生交大片免费| 欧美日韩亚洲国产千人斩| 在线观看女同一区二区| 精品久久久久久亚洲综合网| 日韩精品无码av中文无码版| 亚洲av午夜成人片精品| 日本女优激情四射中文字幕| 2019nv天堂香蕉在线观看| 黑人玩弄漂亮少妇高潮大叫| 亚洲a人片在线观看网址| 国产人妖视频一区二区| 夜夜躁日日躁狠狠久久av| 亚洲av日韩av无码av| 国产好片日本一区二区三区四区| 久久久精品网站免费观看| 精品国际久久久久999波多野 |