厚積薄發(fā)呆盖,豐富的公用類庫積累拖云,助你高效進(jìn)行系統(tǒng)開發(fā)(8)----非對稱加密、BASE64加密应又、MD5等常用加密處理

俗話說宙项,一個(gè)好漢十個(gè)幫,眾人拾柴火焰高等都說明一個(gè)道理株扛,有更多的資源尤筐,更豐富的積累,都是助你走向成功席里,走向頂峰的推動(dòng)力。
本篇繼續(xù)繼續(xù)整理優(yōu)化已有的共用類庫拢驾,并繼續(xù)發(fā)表隨筆介紹公用類庫的接口方法以及詳細(xì)使用操作奖磁,力求給自己繼續(xù)優(yōu)化,積攢更豐富的公用類庫資源繁疤,加深了解的同時(shí)咖为,也給大家展現(xiàn)公用類庫好的方面。
本篇的公用類庫的介紹主題是加密解密的部分稠腊,加解密算法包括DES加解密躁染、Base64加解密、
AES RijndaelManaged加解密架忌、MD5加密吞彤、以及RSA非對稱加密等操作。
1叹放、非對稱加密饰恕、解密、驗(yàn)證輔助類 RSASecurityHelper

本人開發(fā)過很多共享軟件井仰,在共享軟件注冊方面積累了一些自己的經(jīng)驗(yàn),其中采用非對稱加密方式實(shí)現(xiàn)注冊碼驗(yàn)證的操作,就是其中一個(gè)比較重要的步驟某筐,由于其邏輯不可逆的特點(diǎn)庸毫,采用非對稱加密方式,較一般的對稱加密方式合是,能夠隱藏授權(quán)的邏輯了罪,因此具有更好的效果。 這個(gè)非對稱的解密解密聪全、驗(yàn)證操作捶惜,是我所有共享軟件里面用到的授權(quán)操作,很早很多朋友就這個(gè)問題問過我很多次荔烧,現(xiàn)在奉獻(xiàn)給大家注冊碼實(shí)現(xiàn)的思路及操作接口吱七,希望大家能夠在享受代碼帶來的便利外汽久,也可以提高自己對知識(shí)產(chǎn)權(quán)的保護(hù)。
一般來說踊餐,非對稱加密方式景醇,結(jié)合代碼混淆和強(qiáng)名稱驗(yàn)證,是比較好的實(shí)現(xiàn)注冊授權(quán)機(jī)制的功能吝岭。
**實(shí)現(xiàn)效果 **
1)本輔助類主要是用來方便實(shí)現(xiàn)非對稱加密三痰、解密、驗(yàn)證等相關(guān)操作窜管。
2)非對稱加密有RSA散劫、橢圓曲線等,最流行的是RSA幕帆。所謂的非對稱获搏,是因?yàn)樗袃蓚€(gè)密鑰,一個(gè)稱為公鑰失乾,一個(gè)稱為私鑰常熙。公鑰是可以對外發(fā)布的,而私鑰是自己保存的碱茁。用公鑰加密裸卫,必須用私鑰解密,反之纽竣,用私鑰加密必須用公鑰解密墓贿。所以,我們可以在軟件中保存公鑰的內(nèi)容蜓氨,這個(gè)是可以公開的募壕;私鑰我們可以自己留著。別人拿不到私鑰语盈,根本計(jì)算不出注冊碼來舱馅。
3)使用輔助類RSASecurityHelper實(shí)現(xiàn)注冊機(jī)制如下:
a. 注冊碼產(chǎn)生過程:
注冊信息(包括用戶名等信息)---> RSA私鑰加密 ---> 注冊碼。
b. 軟件驗(yàn)證注冊碼過程:
注冊碼 ---> RSA公鑰驗(yàn)證 ---> 驗(yàn)證成功或失敗刀荒。


**實(shí)現(xiàn)代碼 **
1)輔助類提供的方法接口如下所示:

/// <summary>    
/// 非對稱加密生成的私鑰和公鑰     
/// </summary>    
/// <param name="privateKey">私鑰</param>    
/// <param name="publicKey">公鑰</param>    
public static void GenerateRSAKey(out string privateKey, out string publicKey)   
  
#region 非對稱數(shù)據(jù)加密(公鑰加密)    
   
/// <summary>    
/// 非對稱加密字符串?dāng)?shù)據(jù)代嗤,返回加密后的數(shù)據(jù)    
/// </summary>    
/// <param name="publicKey">公鑰</param>    
/// <param name="originalString">待加密的字符串</param>    
/// <returns>加密后的數(shù)據(jù)</returns>    
public static string RSAEncrypt(string publicKey, string originalString)    
   
/// <summary>    
/// 非對稱加密字節(jié)數(shù)組,返回加密后的數(shù)據(jù)    
/// </summary>    
/// <param name="publicKey">公鑰</param>    
/// <param name="originalBytes">待加密的字節(jié)數(shù)組</param>    
/// <returns>返回加密后的數(shù)據(jù)</returns>    
public static string RSAEncrypt(string publicKey, byte[] originalBytes)   
  
#endregion   
  
#region 非對稱解密(私鑰解密)    
   
/// <summary>    
/// 非對稱解密字符串缠借,返回解密后的數(shù)據(jù)    
/// </summary>    
/// <param name="privateKey">私鑰</param>    
/// <param name="encryptedString">待解密數(shù)據(jù)</param>    
/// <returns>返回解密后的數(shù)據(jù)</returns>    
public static string RSADecrypt(string privateKey, string encryptedString)    
   
/// <summary>    
/// 非對稱解密字節(jié)數(shù)組干毅,返回解密后的數(shù)據(jù)    
/// </summary>    
/// <param name="privateKey">私鑰</param>    
/// <param name="encryptedBytes">待解密數(shù)據(jù)</param>    
/// <returns></returns>    
public static string RSADecrypt(string privateKey, byte[] encryptedBytes)   
  
#endregion   
  
#region 非對稱加密簽名、驗(yàn)證    
   
/// <summary>    
/// 使用非對稱加密簽名數(shù)據(jù)    
/// </summary>    
/// <param name="privateKey">私鑰</param>    
/// <param name="originalString">待加密的字符串</param>    
/// <returns>加密后的數(shù)據(jù)</returns>    
public static string RSAEncrypSignature(string privateKey, string originalString)    
          
/// <summary>    
/// 對私鑰加密簽名的字符串泼返,使用公鑰對其進(jìn)行驗(yàn)證    
/// </summary>    
/// <param name="originalString">未加密的文本硝逢,如機(jī)器碼</param>    
/// <param name="encrytedString">加密后的文本,如注冊序列號</param>    
/// <returns>如果驗(yàn)證成功返回True,否則為False</returns>    
public static bool Validate(string originalString, string encrytedString)    
   
/// <summary>    
/// 對私鑰加密的字符串渠鸽,使用公鑰對其進(jìn)行驗(yàn)證    
/// </summary>    
/// <param name="originalString">未加密的文本叫乌,如機(jī)器碼</param>    
/// <param name="encrytedString">加密后的文本,如注冊序列號</param>    
/// <param name="publicKey">非對稱加密的公鑰</param>    
/// <returns>如果驗(yàn)證成功返回True徽缚,否則為False</returns>    
public static bool Validate(string originalString, string encrytedString, string publicKey) 
#endregion 

2) 輔助類RSASecurityHelper的使用例子代碼如下所示

//生成加解密私鑰憨奸、公鑰    
string publicKey = "";    
string privateKey = "";    
RSASecurityHelper.GenerateRSAKey(out privateKey, out publicKey);    
   
string originalString = "testdata";    
string encryptedString = RSASecurityHelper.RSAEncrypt(publicKey, originalString);    
string originalString2 = RSASecurityHelper.RSADecrypt(privateKey, encryptedString);     
if (originalString == originalString2)    
{    
    MessageUtil.ShowTips("解密完全正確");    
}    
else   
{    
    MessageUtil.ShowWarning("解密失敗");    
}    
   
string regcode = RSASecurityHelper.RSAEncrypSignature(privateKey, originalString);    
bool validated = RSASecurityHelper.Validate(originalString, regcode, publicKey);    
MessageUtil.ShowTips( validated ? "驗(yàn)證成功" : "驗(yàn)證失敗");     

3)實(shí)際項(xiàng)目使用的注冊驗(yàn)證代碼如下所示。

/// <summary>    
/// 每次程序運(yùn)行時(shí)候,檢查用戶是否注冊    
/// </summary>    
/// <returns>如果用戶已經(jīng)注冊, 那么返回True, 否則為False</returns>    
public bool CheckRegister()    
{    
    // 先獲取用戶的注冊碼進(jìn)行比較    
    string serialNumber = string.Empty; //注冊碼    
    RegistryKey reg = Registry.CurrentUser.OpenSubKey(UIConstants.SoftwareRegistryKey, true);    
    if (null != reg)    
    {    
        serialNumber = (string)reg.GetValue("SerialNumber");    
        Portal.gc.bRegisted = Portal.gc.Register(serialNumber);    
    }    
   
    return Portal.gc.bRegisted;    
}    
   
/// <summary>    
/// 調(diào)用非對稱加密方式對序列號進(jìn)行驗(yàn)證    
/// </summary>    
/// <param name="serialNumber">正確的序列號</param>    
/// <returns>如果成功返回True凿试,否則為False</returns>    
public bool Register(String serialNumber)    
{    
    string hardNumber = HardwareInfoHelper.GetCPUId();    
    return RSASecurityHelper.Validate(hardNumber, serialNumber);    
}    
   
public string GetHardNumber()    
{    
    return HardwareInfoHelper.GetCPUId(); 
}   

**2排宰、**** DES對稱加解密、AES RijndaelManaged加解密那婉、Base64加密解密板甘、MD5加密等操作輔助類 EncodeHelper **
**實(shí)現(xiàn)效果 **
1)本輔助類主要是用來方便實(shí)現(xiàn)DES對稱加解密、AES RijndaelManaged加解密详炬、Base64加密解密盐类、MD5加密等操作。
2)本輔助類實(shí)現(xiàn)多種加解密處理痕寓,可以實(shí)現(xiàn)字符串傲醉、文件蝇闭、文件流等加密處理呻率。該加密輔助類匯集各種加密處理邏輯,是一個(gè)非常常用呻引、方便應(yīng)對各種加密處理的輔助類礼仗。

**實(shí)現(xiàn)代碼 **
1)輔助類提供的方法接口如下所示:

/// <summary>    
/// 使用默認(rèn)加密    
/// </summary>    
/// <param name="strText"></param>    
/// <returns></returns>    
public static string DesEncrypt(string strText)    
   
/// <summary>    
/// 使用默認(rèn)解密    
/// </summary>    
/// <param name="strText">解密字符串</param>    
/// <returns></returns>    
public static string DesDecrypt(string strText)    
   
/// <summary>     
/// 加密字符串,注意strEncrKey的長度為8位    
/// </summary>     
/// <param name="strText">待加密字符串</param>     
/// <param name="strEncrKey">加密鍵</param>     
/// <returns></returns>     
public static string DesEncrypt(string strText, string strEncrKey)    
   
/// <summary>     
/// 解密字符串,注意strEncrKey的長度為8位    
/// </summary>     
/// <param name="strText">待解密的字符串</param>     
/// <param name="sDecrKey">解密鍵</param>     
/// <returns>解密后的字符串</returns>     
public static string DesDecrypt(string strText, string sDecrKey)    
   
/// <summary>     
/// 加密數(shù)據(jù)文件,注意strEncrKey的長度為8位    
/// </summary>     
/// <param name="m_InFilePath">待加密的文件路徑</param>     
/// <param name="m_OutFilePath">輸出文件路徑</param>     
/// <param name="strEncrKey">加密鍵</param>     
public static void DesEncrypt(string m_InFilePath, string m_OutFilePath, string strEncrKey)    
   
/// <summary>     
/// 解密數(shù)據(jù)文件,注意strEncrKey的長度為8位    
/// </summary>     
/// <param name="m_InFilePath">待解密的文件路徑</param>     
/// <param name="m_OutFilePath">輸出路徑</param>     
/// <param name="sDecrKey">解密鍵</param>     
public static void DesDecrypt(string m_InFilePath, string m_OutFilePath, string sDecrKey)   
       
#endregion   
  
#region 對稱加密算法AES RijndaelManaged加密解密    
   
/// <summary>    
/// 對稱加密算法AES RijndaelManaged加密(RijndaelManaged(AES)算法是塊式加密算法)    
/// </summary>    
/// <param name="encryptString">待加密字符串</param>    
/// <returns>加密結(jié)果字符串</returns>    
public static string AES_Encrypt(string encryptString)    
   
/// <summary>    
/// 對稱加密算法AES RijndaelManaged加密(RijndaelManaged(AES)算法是塊式加密算法)    
/// </summary>    
/// <param name="encryptString">待加密字符串</param>    
/// <param name="encryptKey">加密密鑰,須半角字符</param>    
/// <returns>加密結(jié)果字符串</returns>    
public static string AES_Encrypt(string encryptString, string encryptKey)    
   
/// <summary>    
/// 對稱加密算法AES RijndaelManaged解密字符串    
/// </summary>    
/// <param name="decryptString">待解密的字符串</param>    
/// <returns>解密成功返回解密后的字符串,失敗返源串</returns>    
public static string AES_Decrypt(string decryptString)    
   
/// <summary>    
/// 對稱加密算法AES RijndaelManaged解密字符串    
/// </summary>    
/// <param name="decryptString">待解密的字符串</param>    
/// <param name="decryptKey">解密密鑰,和加密密鑰相同</param>    
/// <returns>解密成功返回解密后的字符串,失敗返回空</returns>    
public static string AES_Decrypt(string decryptString, string decryptKey)    
   
   
/// <summary>    
/// 加密文件流    
/// </summary>    
/// <param name="fs">文件流</param>    
/// <returns></returns>    
public static CryptoStream AES_EncryptStrream(FileStream fs, string decryptKey)    
   
/// <summary>    
/// 解密文件流    
/// </summary>    
/// <param name="fs">文件流</param>    
/// <returns></returns>    
public static CryptoStream AES_DecryptStream(FileStream fs, string decryptKey)    
   
/// <summary>    
/// 對指定文件加密    
/// </summary>    
/// <param name="InputFile">輸入文件</param>    
/// <param name="OutputFile">輸出文件</param>    
/// <returns></returns>    
public static bool AES_EncryptFile(string InputFile, string OutputFile)    
   
/// <summary>    
/// 對指定的文件解壓縮    
/// </summary>    
/// <param name="InputFile">輸入文件</param>    
/// <param name="OutputFile">輸出文件</param>    
/// <returns></returns>    
public static bool AES_DecryptFile(string InputFile, string OutputFile)   
  
#endregion   
  
#region Base64加密解密    
/// <summary>    
/// Base64是一種使用64基的位置計(jì)數(shù)法逻悠。它使用2的最大次方來代表僅可列印的ASCII 字元元践。    
/// 這使它可用來作為電子郵件的傳輸編碼。在Base64中的變數(shù)使用字元A-Z童谒、a-z和0-9 单旁,    
/// 這樣共有62個(gè)字元,用來作為開始的64個(gè)數(shù)字饥伊,最後兩個(gè)用來作為數(shù)字的符號在不同的    
/// 系統(tǒng)中而不同象浑。    
/// Base64加密    
/// </summary>    
/// <param name="str">Base64方式加密字符串</param>    
/// <returns></returns>    
public static string Base64Encrypt(string str)    
   
/// <summary>    
/// Base64解密字符串    
/// </summary>    
/// <param name="str">待解密的字符串</param>    
/// <returns></returns>    
public static string Base64Decrypt(string str)   
  
#endregion   
  
#region MD5加密    
   
/// <summary>     
/// 使用MD5加密字符串    
/// </summary>     
/// <param name="strText">待加密的字符串</param>     
/// <returns>MD5加密后的字符串</returns>     
public static string MD5Encrypt(string strText)    
   
/// <summary>    
/// 使用MD5加密的Hash表    
/// </summary>    
/// <param name="input">待加密字符串</param>    
/// <returns></returns>    
public static string MD5EncryptHash(String input)    
   
/// <summary>    
/// 使用Md5加密為16進(jìn)制字符串    
/// </summary>    
/// <param name="input">待加密字符串</param>    
/// <returns></returns>    
public static string MD5EncryptHashHex(String input)    
   
/// <summary>    
/// MD5 三次加密算法.計(jì)算過程: (QQ使用)    
/// 1. 驗(yàn)證碼轉(zhuǎn)為大寫    
/// 2. 將密碼使用這個(gè)方法進(jìn)行三次加密后,與驗(yàn)證碼進(jìn)行疊加    
/// 3. 然后將疊加后的內(nèi)容再次MD5一下,得到最終驗(yàn)證碼的值    
/// </summary>    
/// <param name="s"></param>    
/// <returns></returns>    
public static string EncyptMD5_3_16(string s)   
  
#endregion    
   
/// <summary>    
/// SHA256函數(shù)    
/// </summary>    
/// <param name="str">原始字符串</param>    
/// <returns>SHA256結(jié)果(返回長度為44字節(jié)的字符串)</returns>    
public static string SHA256(string str)    
   
/// <summary>    
/// 加密字符串(使用MD5+Base64混合加密)    
/// </summary>    
/// <param name="input">待加密的字符串</param>    
/// <returns></returns>    
public static string EncryptString(string input)    
   
/// <summary>    
/// 解密加過密的字符串(使用MD5+Base64混合加密)    
/// </summary>    
/// <param name="input">待解密的字符串</param>    
/// <param name="throwException">解密失敗是否拋異常</param>    
/// <returns></returns>    
public static string DecryptString(string input, bool throwException) 

2) 輔助類EncodeHelper的使用例子代碼如下所示

/// <summary>    
/// 對字符串加密    
/// </summary>    
/// <returns></returns>    
private string EncodePassword(string passwordText)    
{    
    return EncodeHelper.MD5Encrypt(passwordText);    
}  
private void btnEncrypt_Click(object sender, EventArgs e)    
{    
    string original = "測試加密字符串";    
    Console.WriteLine("original:" + original);    
   
    string encrypt = EncodeHelper.SHA256(original);    
    Console.WriteLine("EncodeHelper.SHA256" + encrypt);    
   
    //DES加解密    
    encrypt = EncodeHelper.DesEncrypt(original);    
    Console.WriteLine("EncodeHelper.DesEncrypt:" + encrypt);    
   
    string decrypt = EncodeHelper.DesDecrypt(encrypt);    
    Console.WriteLine("EncodeHelper.DesDecrypt:" + decrypt);    
   
    //MD5加密    
    encrypt = EncodeHelper.MD5Encrypt(original);    
    Console.WriteLine("EncodeHelper.MD5Encrypt:" + encrypt);    
    encrypt = EncodeHelper.MD5EncryptHash(original);    
    Console.WriteLine("EncodeHelper.MD5EncryptHash:" + encrypt);    
    encrypt = EncodeHelper.MD5EncryptHashHex(original);    
    Console.WriteLine("EncodeHelper.MD5EncryptHashHex" + encrypt);    
    encrypt = EncodeHelper.EncyptMD5_3_16(original);    
    Console.WriteLine("EncodeHelper.EncyptMD5_3_16:" + encrypt);    
   
    //Base64加解密    
    encrypt = EncodeHelper.Base64Encrypt(original);    
    Console.WriteLine("EncodeHelper.Base64Encrypt" + encrypt);    
    decrypt = EncodeHelper.Base64Encrypt(encrypt);    
    Console.WriteLine("EncodeHelper.Base64Encrypt" + decrypt);    
   
    encrypt = EncodeHelper.AES_Encrypt(original);    
    Console.WriteLine("EncodeHelper.AES_Encrypt" + encrypt);    
    decrypt = EncodeHelper.AES_Decrypt(encrypt);    
    Console.WriteLine("EncodeHelper.AES_Decrypt" + decrypt);   c

**3、 MD5各種長度加密字符琅豆、驗(yàn)證MD5等操作輔助類 MD5Util **
**實(shí)現(xiàn)效果 **
1)本輔助類主要是用來方便實(shí)現(xiàn)MD5各種長度加密字符愉豺、驗(yàn)證MD5等操作。
2)MD5即Message-Digest Algorithm 5(信息-摘要算法 5)茫因,用于確保信息傳輸完整一致蚪拦。是計(jì)算機(jī)廣泛使用的散列算法之一(又譯摘要算法、哈希算法)。
3)MD5已經(jīng)廣泛使用在為文件傳輸提供一定的可靠性方面驰贷。例如盛嘿,服務(wù)器預(yù)先提供一個(gè)MD5校驗(yàn)和,用戶下載完文件以后饱苟,用MD5算法計(jì)算下載文件的MD5校驗(yàn)和孩擂,然后通過檢查這兩個(gè)校驗(yàn)和是否一致,就能判斷下載的文件是否出錯(cuò)

**實(shí)現(xiàn)代碼 **
1)輔助類提供的方法接口如下所示:

/// <summary>    
/// 獲得32位的MD5加密    
/// </summary>    
public static string GetMD5_32(string input)    
   
/// <summary>    
/// 獲得16位的MD5加密    
/// </summary>    
public static string GetMD5_16(string input)    
        
/// <summary>    
/// 獲得8位的MD5加密    
/// </summary>    
public static string GetMD5_8(string input)    
   
/// <summary>    
/// 獲得4位的MD5加密    
/// </summary>    
public static string GetMD5_4(string input)    
   
/// <summary>    
/// 添加MD5的前綴箱熬,便于檢查有無篡改    
/// </summary>    
public static string AddMD5Profix(string input)    
   
/// <summary>    
/// 移除MD5的前綴    
/// </summary>    
public static string RemoveMD5Profix(string input)    
   
/// <summary>    
/// 驗(yàn)證MD5前綴處理的字符串有無被篡改    
/// </summary>    
public static bool ValidateValue(string input)   
  
#region MD5簽名驗(yàn)證    
        
/// <summary>    
/// 對給定文件路徑的文件加上標(biāo)簽    
/// </summary>    
/// <param name="path">要加密的文件的路徑</param>    
/// <returns>標(biāo)簽的值</returns>    
public static bool AddMD5(string path)    
   
/// <summary>    
/// 對給定路徑的文件進(jìn)行驗(yàn)證类垦,如果一致返回True,否則返回False    
/// </summary>    
/// <param name="path"></param>    
/// <returns>是否加了標(biāo)簽或是否標(biāo)簽值與內(nèi)容值一致</returns>    
public static bool CheckMD5(string path)   

2) 輔助類 **MD5Util **的使用例子代碼如下所示

//為文件增加MD5編碼標(biāo)簽城须,然后驗(yàn)證是否被修改    
string file = @"c:\test.xls";    
bool flag2 = MD5Util.AddMD5(file);    
Console.WriteLine(flag2);    
   
//對給定路徑的文件進(jìn)行驗(yàn)證蚤认,如果一致返回True,否則返回False    
bool flag3 = MD5Util.CheckMD5(file);    
Console.WriteLine(flag3);  

4糕伐、基于Base64的加密編碼輔助類 Base64Util
**實(shí)現(xiàn)效果 **
1)本輔助類主要是用來方便實(shí)現(xiàn)基于Base64的加密編碼砰琢。
2)Base64被定義為:Base64內(nèi)容傳送編碼被設(shè)計(jì)用來把任意序列的8位字節(jié)描述為一種不易被人直接識(shí)別的形式。Base64編碼一般在電子郵件中可以查看到良瞧,打開一封Email陪汽,查看其原始信息(您可以通過收取、導(dǎo)出該郵件用文本編輯器查看)褥蚯。加密是肯定的挚冤,但是加密的目的不是讓用戶發(fā)送非常安全的Email。這種加密方式主要就是“防君子不防小人”赞庶。即達(dá)到一眼望去完全看不出內(nèi)容即可训挡。
3)采用Base64編碼不僅比較簡短,同時(shí)也具有不可讀性歧强,即所編碼的數(shù)據(jù)不會(huì)被人用肉眼所直接看到澜薄。

**實(shí)現(xiàn)代碼 **
1)輔助類提供的方法接口如下所示:

/// <summary>    
/// 使用默認(rèn)的密碼表加密字符串    
/// </summary>    
/// <param name="input">待加密字符串</param>    
/// <returns></returns>    
public static string Encrypt(string input)    
   
/// <summary>    
/// 使用默認(rèn)的密碼表解密字符串    
/// </summary>    
/// <param name="input">待解密字符串</param>    
/// <returns></returns>    
public static string Decrypt(string input)    
   
/// <summary>    
/// 獲取具有標(biāo)準(zhǔn)的Base64密碼表的加密類    
/// </summary>    
/// <returns></returns>    
public static Base64Util GetStandardBase64()    

2) 輔助類Base64Util的使用例子代碼如下所示

private void btnBase64_Click(object sender, EventArgs e)    
{    
    string original = "這是一個(gè)測試的Base64加密字符串";    
    string encrypt = Base64Util.Encrypt(original);    
    Console.WriteLine(encrypt);//輸出內(nèi)容:6L*Z5pi_5LiA5Liq5rWL6K*V55qEQmFzZTY05Yqg5b*G5b2X56ym5Liy    
   
    string decrypt = Base64Util.Decrypt(encrypt);    
    Debug.Assert(original == decrypt);//驗(yàn)證相等    
}  c

5、QQ密碼加密操作輔助類 QQEncryptUtil
**實(shí)現(xiàn)效果 **
1)本輔助類主要是用來方便實(shí)現(xiàn)QQ密碼加密操作摊册。 2)在QQ的很多模擬網(wǎng)頁采集數(shù)據(jù)肤京,需要輸入用戶賬號、密碼茅特,其中密碼是需要進(jìn)行加密操作的忘分,一般使用js腳本實(shí)現(xiàn),這里把它轉(zhuǎn)化為C#的代碼操作温治,其實(shí)也就是把密碼和驗(yàn)證碼通過3次MD5加密實(shí)現(xiàn)的饭庞。


**實(shí)現(xiàn)代碼 **
1)輔助類提供的方法接口如下所示:

/// <summary>    
/// QQ根據(jù)密碼及驗(yàn)證碼對數(shù)據(jù)進(jìn)行加密    
/// </summary>    
/// <param name="password">原始密碼</param>    
/// <param name="verifyCode">驗(yàn)證碼</param>    
/// <returns></returns>    
public static string EncodePasswordWithVerifyCode(string password, string verifyCode)   

2) 輔助類QQEncryptUtil的使用例子代碼如下所示

private bool CheckLogin()    
{    
    HttpHelper httpHelper = new HttpHelper();    
    string refUrl = "http://ui.ptlogin2.qq.com/cgi-bin/login?appid=3000801&s_url=http%3A%2F%2Fqun.qq.com%2Fgod%2Fsucc.htm&f_url=loginerroralert&lang=2052&bgcolor=ffffff&style=1&low_login=1&link_target=blank&target=self&hide_title_bar=1&dummy=1";    
   
    string verifyCode = this.txtVerify.Text;    
    string postData = string.Format("u={0}&p={1}&verifycode={2}&aid=3000801&u1=http%3A%2F%2Fqun.qq.com%2Fgod%2Fsucc.htm&h=1&ptredirect=0&ptlang=2052&from_ui=1&dumy=&fp=loginerroralert",    
        this.txtUsername.Text, QQEncryptUtil.EncodePasswordWithVerifyCode(this.txtPassword.Text, verifyCode), verifyCode);    
   
    string result = httpHelper.GetHtml("http://ptlogin2.qq.com/login?" + postData, Portal.gc.cookieQun, refUrl);    
    string errorTxt = result;    
    bool isLogin = result.Contains("登錄成功!");    
    return isLogin;    
}   

CHM幫助文檔持續(xù)更新中熬荆,統(tǒng)一下載地址是: http://www.iqidi.com/download/commonshelp.rar

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舟山,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌累盗,老刑警劉巖寒矿,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異若债,居然都是意外死亡符相,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門蠢琳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啊终,“玉大人,你說我怎么就攤上這事傲须±渡” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵泰讽,是天一觀的道長例衍。 經(jīng)常有香客問我,道長已卸,這世上最難降的妖魔是什么佛玄? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮累澡,結(jié)果婚禮上梦抢,老公的妹妹穿的比我還像新娘。我一直安慰自己永乌,他們只是感情好惑申,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布具伍。 她就那樣靜靜地躺著翅雏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪人芽。 梳的紋絲不亂的頭發(fā)上望几,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音萤厅,去河邊找鬼橄抹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛惕味,可吹牛的內(nèi)容都是我干的楼誓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼名挥,長吁一口氣:“原來是場噩夢啊……” “哼疟羹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤榄融,失蹤者是張志新(化名)和其女友劉穎参淫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愧杯,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涎才,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了力九。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耍铜。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖跌前,靈堂內(nèi)的尸體忽然破棺而出业扒,到底是詐尸還是另有隱情,我是刑警寧澤舒萎,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布程储,位于F島的核電站,受9級特大地震影響臂寝,放射性物質(zhì)發(fā)生泄漏章鲤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一咆贬、第九天 我趴在偏房一處隱蔽的房頂上張望败徊。 院中可真熱鬧,春花似錦掏缎、人聲如沸皱蹦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沪哺。三九已至,卻和暖如春酌儒,著一層夾襖步出監(jiān)牢的瞬間辜妓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工忌怎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留籍滴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓榴啸,卻偏偏與公主長得像孽惰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子鸥印,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容