谈谈数据加密的处理_第1页
谈谈数据加密的处理_第2页
谈谈数据加密的处理_第3页
谈谈数据加密的处理_第4页
谈谈数据加密的处理_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、谈谈数据加密的处理-提供各种算法处理 数据的加密重要性大家皆知,很多情况下需要对数据进行加密处理,但各种重要数据的加密要求不一样,有些需要时可逆的,有些是不要求可逆的,可逆的一般称之为对称加密算法,不可逆的一般可以成为非对称加密算法。如登录密码,一般较好的方式是采用不可逆的加密算法,如MD5、SHA256、哈希数值等,当然也有的采用可逆的强度好一些的加密方式,在选择加密键值的时候,变化一下也算是比较不错的选择。另外一些为了掩人耳目或者不让别人直接可以查看到,就采用其他的加密算法,如DES加密算法、AES的RijndaelManaged加密算法,或者也可以采用Base64加密,甚至我看到一个很变

2、态的方式,就是用MD5加密的头,内容则采用Base64的方式加密,一般不知道内情的还真的不好处理。 在吉日走火入魔失眠夜浅谈管理软件信息安全,用户名、密码的加密解密【附C#配套加密解密源码】 的文章中也对加密做了一些介绍和分析,并贴出了MD5、DES的加密方式代码,吉日的文章图文并茂、哲理及诙谐例子并存,本文有感而发,做一些补充,希望园子同行共通过切磋,交流心得。 加密字符串的方式有很多,也都可以通过这样的加密文件内容,不过较好的方式可能是采用DES及AES两种方式来加密文件了,下面贴出的代码中包含了加解密文件的算法。下面具体贴出本人收藏的各种加密算法代码。 1、DES加密字符串及文件等 如果

3、想可逆的算法,这种方式一般不错,只要结合动态密钥,就可以做出强度比较高的加密应用了。  #region DES对称加密解密 public const string DEFAULT_ENCRYPT_KEY = "12345678"/ <summary>/ 使用默认加密/ </summary>/ <param name="strText"></param>/ <returns></returns>public static string DesEncrypt(string st

4、rText)        try            return DesEncrypt(strText, DEFAULT_ENCRYPT_KEY);            catch          &

5、#160; return ""                    / <summary>/ 使用默认解密/ </summary>/ <param name="strText"></param>/ <returns></returns>public static string DesDecrypt(str

6、ing strText)        try            return DesDecrypt(strText, DEFAULT_ENCRYPT_KEY);            catch         &

7、#160;  return ""                    / <summary>/ Encrypt the string / Attention:key must be 8 bits / </summary>/ <param name="strText">string</param>/ <param

8、name="strEncrKey">key</param>/ <returns></returns>public static string DesEncrypt(string strText, string strEncrKey)        byte byKey = null;byte IV = 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF ;     

9、0;      byKey = Encoding.UTF8.GetBytes(strEncrKey.Substring(0, 8);            DESCryptoServiceProvider des = new DESCryptoServiceProvider();byte inputByteArray = Encoding.UTF8.GetBytes(strText);    &#

10、160;       MemoryStream ms = new MemoryStream();            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);          

11、  cs.Write(inputByteArray, 0, inputByteArray.Length);            cs.FlushFinalBlock();return Convert.ToBase64String(ms.ToArray();        / <summary>/ Decrypt string / Attention:key must be 8 bits / &

12、lt;/summary>/ <param name="strText">Decrypt string</param>/ <param name="sDecrKey">key</param>/ <returns>output string</returns>public static string DesDecrypt(string strText, string sDecrKey)        byte b

13、yKey = null;byte IV = 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF ;byte inputByteArray = new BytestrText.Length;            byKey = Encoding.UTF8.GetBytes(sDecrKey.Substring(0, 8);          &#

14、160; DESCryptoServiceProvider des = new DESCryptoServiceProvider();            inputByteArray = Convert.FromBase64String(strText);            MemoryStream ms = new MemoryStream();  

15、;          CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);            cs.Write(inputByteArray, 0, inputByteArray.Length);     &

16、#160;      cs.FlushFinalBlock();            Encoding encoding = new UTF8Encoding();return encoding.GetString(ms.ToArray();        / <summary>/ Encrypt files / Attention:key must b

17、e 8 bits / </summary>/ <param name="m_InFilePath">Encrypt file path</param>/ <param name="m_OutFilePath">output file</param>/ <param name="strEncrKey">key</param>public static void DesEncrypt(string m_InFilePath, string m_OutFil

18、ePath, string strEncrKey)        byte byKey = null;byte IV = 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF ;            byKey = Encoding.UTF8.GetBytes(strEncrKey.Substring(0, 8);     &

19、#160;      FileStream fin = new FileStream(m_InFilePath, FileMode.Open, FileAccess.Read);            FileStream fout = new FileStream(m_OutFilePath, FileMode.OpenOrCreate, FileAccess.Write);     

20、       fout.SetLength(0);/Create variables to help with read and write. byte bin = new byte100; /This is intermediate storage for the encryption. long rdlen = 0; /This is the total number of bytes written. long totlen = fin.Length; /This is the total length of the input

21、 file. int len; /This is the number of bytes to be written at a time.             DES des = new DESCryptoServiceProvider();            CryptoStream encStream = new CryptoStream(fout, des.Cre

22、ateEncryptor(byKey, IV), CryptoStreamMode.Write);/Read from the input file, then encrypt and write to the output file. while (rdlen < totlen)                           

23、; len = fin.Read(bin, 0, 100);                encStream.Write(bin, 0, len);                rdlen = rdlen + len;      

24、60;                 encStream.Close();            fout.Close();            fin.Close();    

25、0;   / <summary>/ Decrypt files / Attention:key must be 8 bits / </summary>/ <param name="m_InFilePath">Decrypt filepath</param>/ <param name="m_OutFilePath">output filepath</param>/ <param name="sDecrKey">key</para

26、m>public static void DesDecrypt(string m_InFilePath, string m_OutFilePath, string sDecrKey)        byte byKey = null;byte IV = 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF ;            byKey = Encoding.UTF

27、8.GetBytes(sDecrKey.Substring(0, 8);            FileStream fin = new FileStream(m_InFilePath, FileMode.Open, FileAccess.Read);            FileStream fout = new FileStream(m_OutFilePath, File

28、Mode.OpenOrCreate, FileAccess.Write);            fout.SetLength(0);/Create variables to help with read and write. byte bin = new byte100; /This is intermediate storage for the encryption. long rdlen = 0; /This is the total number of bytes writte

29、n. long totlen = fin.Length; /This is the total length of the input file. int len; /This is the number of bytes to be written at a time.             DES des = new DESCryptoServiceProvider();         &

30、#160;  CryptoStream encStream = new CryptoStream(fout, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);/Read from the input file, then encrypt and write to the output file. while (rdlen < totlen)               

31、0;            len = fin.Read(bin, 0, 100);                encStream.Write(bin, 0, len);              

32、;  rdlen = rdlen + len;                        encStream.Close();            fout.Close();      

33、0;     fin.Close();        #endregion 2、 对称加密算法AES RijndaelManaged加密解密 #region 对称加密算法AES RijndaelManaged加密解密 private static readonly string Default_AES_Key = "#kim123"private static byte Keys = 0x41, 0x72, 0x65, 0x79, 0x6F, 0x75, 0x6D,

34、 0x79,0x53,0x6E, 0x6F, 0x77, 0x6D, 0x61, 0x6E, 0x3F ;/ <summary>/ 对称加密算法AES RijndaelManaged加密(RijndaelManaged(AES)算法是块式加密算法)/ </summary>/ <param name="encryptString">待加密字符串</param>/ <returns>加密结果字符串</returns>public static string AES_Encrypt(string encryp

35、tString)        return AES_Encrypt(encryptString, Default_AES_Key);        / <summary>/ 对称加密算法AES RijndaelManaged加密(RijndaelManaged(AES)算法是块式加密算法)/ </summary>/ <param name="encryptString">待加密字符串</par

36、am>/ <param name="encryptKey">加密密钥,须半角字符</param>/ <returns>加密结果字符串</returns>public static string AES_Encrypt(string encryptString, string encryptKey)                    encr

37、yptKey = GetSubString(encryptKey, 32, "");            encryptKey = encryptKey.PadRight(32, ' ');            RijndaelManaged rijndaelProvider = new RijndaelManaged(); &

38、#160;          rijndaelProvider.Key = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 32);            rijndaelProvider.IV = Keys;            ICryp

39、toTransform rijndaelEncrypt = rijndaelProvider.CreateEncryptor();byte inputData = Encoding.UTF8.GetBytes(encryptString);byte encryptedData = rijndaelEncrypt.TransformFinalBlock(inputData, 0, inputData.Length);return Convert.ToBase64String(encryptedData);        / &

40、lt;summary>/ 对称加密算法AES RijndaelManaged解密字符串/ </summary>/ <param name="decryptString">待解密的字符串</param>/ <returns>解密成功返回解密后的字符串,失败返源串</returns>public static string AES_Decrypt(string decryptString)        return AES_Decrypt(d

41、ecryptString, Default_AES_Key);        / <summary>/ 对称加密算法AES RijndaelManaged解密字符串/ </summary>/ <param name="decryptString">待解密的字符串</param>/ <param name="decryptKey">解密密钥,和加密密钥相同</param>/ <returns>解密成功返回

42、解密后的字符串,失败返回空</returns>public static string AES_Decrypt(string decryptString, string decryptKey)        try                          &

43、#160; decryptKey = GetSubString(decryptKey, 32, "");                decryptKey = decryptKey.PadRight(32, ' ');                Rijnda

44、elManaged rijndaelProvider = new RijndaelManaged();                rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);                rijndaelP

45、rovider.IV = Keys;                ICryptoTransform rijndaelDecrypt = rijndaelProvider.CreateDecryptor();byte inputData = Convert.FromBase64String(decryptString);byte decryptedData = rijndaelDecrypt.TransformFinalBlock(inputDa

46、ta, 0, inputData.Length);return Encoding.UTF8.GetString(decryptedData);            catch            return string.Empty;            

47、60;       / <summary>/ 按字节长度(按字节,一个汉字为2个字节)取得某字符串的一部分/ </summary>/ <param name="sourceString">源字符串</param>/ <param name="length">所取字符串字节长度</param>/ <param name="tailString">附加字符串(当字符串不够长时,尾部所添加的字符串,

48、一般为".")</param>/ <returns>某字符串的一部分</returns>private static string GetSubString(string sourceString, int length, string tailString)        return GetSubString(sourceString, 0, length, tailString);       

49、 / <summary>/ 按字节长度(按字节,一个汉字为2个字节)取得某字符串的一部分/ </summary>/ <param name="sourceString">源字符串</param>/ <param name="startIndex">索引位置,以0开始</param>/ <param name="length">所取字符串字节长度</param>/ <param name="tailString"&g

50、t;附加字符串(当字符串不够长时,尾部所添加的字符串,一般为".")</param>/ <returns>某字符串的一部分</returns>private static string GetSubString(string sourceString, int startIndex, int length, string tailString)        string myResult = sourceString;/当是日文或韩文时(注:中文的范围:u4e00 -

51、 u9fa5, 日文在u0800 - u4e00, 韩文为xAC00-xD7A3)if (System.Text.RegularExpressions.Regex.IsMatch(sourceString, "u0800-u4e00+") |                System.Text.RegularExpressions.Regex.IsMatch(sourceString, "xAC00-xD7A3+&

52、quot;)            /当截取的起始位置超出字段串长度时if (startIndex >= sourceString.Length)                return string.Empty;         

53、0;      else                return sourceString.Substring(startIndex,                      

54、;                             (length + startIndex) > sourceString.Length) ? (sourceString.Length - startIndex) : length);      

55、;                      /中文字符,如"中国人民abcd123"if (length <= 0)            return string.Empty;       

56、;     byte bytesSource = Encoding.Default.GetBytes(sourceString);/当字符串长度大于起始位置if (bytesSource.Length > startIndex)            int endIndex = bytesSource.Length;/当要截取的长度在字符串的有效长度范围内if (bytesSource.Length > (startIndex +

57、length)                                    endIndex = length + startIndex;         &#

58、160;      else                   /当不在有效范围内时,只取到字符串的结尾                    length = bytesSource.L

59、ength - startIndex;                    tailString = ""                int anResultFlag = new intlength;int nFlag = 0;/字节

60、大于127为双字节字符for (int i = startIndex; i < endIndex; i+)                if (bytesSourcei > 127)                      

61、                      nFlag+;if (nFlag = 3)                          &

62、#160;                         nFlag = 1;                        &

63、#160;                   else                               &

64、#160;            nFlag = 0;                                     &

65、#160;  anResultFlagi = nFlag;                /最后一个字节为双字节字符的一半if (bytesSourceendIndex - 1 > 127) && (anResultFlaglength - 1 = 1)             

66、0;                      length = length + 1;                byte bsResult = new bytelength;     

67、0;          Array.Copy(bytesSource, startIndex, bsResult, 0, length);                myResult = Encoding.Default.GetString(bsResult);        

68、;        myResult = myResult + tailString;return myResult;            return string.Empty;        / <summary>/ 加密文件流/ </summary>/ <param name="fs">

69、</param>/ <returns></returns>public static CryptoStream AES_EncryptStrream(FileStream fs, string decryptKey)                    decryptKey = GetSubString(decryptKey, 32, ""); &#

70、160;          decryptKey = decryptKey.PadRight(32, ' ');            RijndaelManaged rijndaelProvider = new RijndaelManaged();           

71、rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);            rijndaelProvider.IV = Keys;            ICryptoTransform encrypto = rijndaelProvider.CreateEncryptor();   

72、         CryptoStream cytptostreamEncr = new CryptoStream(fs, encrypto, CryptoStreamMode.Write);return cytptostreamEncr;        / <summary>/ 解密文件流/ </summary>/ <param name="fs"></param>/ <

73、returns></returns>public static CryptoStream AES_DecryptStream(FileStream fs, string decryptKey)                    decryptKey = GetSubString(decryptKey, 32, "");     

74、;       decryptKey = decryptKey.PadRight(32, ' ');            RijndaelManaged rijndaelProvider = new RijndaelManaged();            rijndaelProvider.Key

75、= Encoding.UTF8.GetBytes(decryptKey);            rijndaelProvider.IV = Keys;            ICryptoTransform Decrypto = rijndaelProvider.CreateDecryptor();      

76、60;     CryptoStream cytptostreamDecr = new CryptoStream(fs, Decrypto, CryptoStreamMode.Read);return cytptostreamDecr;        / <summary>/ 对指定文件加密/ </summary>/ <param name="InputFile"></param>/ <param name=&q

77、uot;OutputFile"></param>/ <returns></returns>public static bool AES_EncryptFile(string InputFile, string OutputFile)        try            string decryptKey = ""  &

78、#160;             FileStream fr = new FileStream(InputFile, FileMode.Open);                FileStream fren = new FileStream(OutputFile, FileMode.Create);  

79、              CryptoStream Enfr = AES_EncryptStrream(fren, decryptKey);byte bytearrayinput = new bytefr.Length;                fr.Read(bytearrayinput, 0, bytear

80、rayinput.Length);                Enfr.Write(bytearrayinput, 0, bytearrayinput.Length);                Enfr.Close();      

81、;          fr.Close();                fren.Close();            catch         

82、60;  /文件异常return false;            return true;        / <summary>/ 对指定的文件解压缩/ </summary>/ <param name="InputFile"></param>/ <param name="OutputFile"></

83、param>/ <returns></returns>public static bool AES_DecryptFile(string InputFile, string OutputFile)        try            string decryptKey = ""       

84、         FileStream fr = new FileStream(InputFile, FileMode.Open);                FileStream frde = new FileStream(OutputFile, FileMode.Create);       

85、;         CryptoStream Defr = AES_DecryptStream(fr, decryptKey);byte bytearrayoutput = new byte1024;int m_count = 0;do                        

86、60;           m_count = Defr.Read(bytearrayoutput, 0, bytearrayoutput.Length);                    frde.Write(bytearrayoutput, 0, m_count);if (m_count <

87、bytearrayoutput.Length)break;                while (true);                Defr.Close();          

88、60;     fr.Close();                frde.Close();            catch            /文件异常return false;

89、            return true;        #endregion 3、  Base64加密解密算法 #region Base64加密解密 / <summary>/ Base64是一種使用64基的位置計數法。它使用2的最大次方來代表僅可列印的ASCII 字元。/ 這使它可用來作為電子郵件的傳輸編碼。在Base64中的變數使用字元A-Z、a-z和0-9 ,/ 這樣共有62個字元,

90、用來作為開始的64個數字,最後兩個用來作為數字的符號在不同的/ 系統中而不同。/ Base64加密/ </summary>/ <param name="str"></param>/ <returns></returns>public static string Base64Encrypt(string str)        byte encbuff = System.Text.Encoding.UTF8.GetBytes(str);return

91、 Convert.ToBase64String(encbuff);        / <summary>/ Base64解密/ </summary>/ <param name="str"></param>/ <returns></returns>public static string Base64Decrypt(string str)        byte de

92、cbuff = Convert.FromBase64String(str);return System.Text.Encoding.UTF8.GetString(decbuff);        #endregion 4、 MD5加密及验证 MD5的加密处理应用还是比较多,由于破解难度很大,基本上大型网站或者软件商,密码加密一般采用这种方式居多。 而MD5可以用来获得32、 16、8等全部部分内容加密内容,也可以获取其加密后的哈希值。 / <summary> / 获得32位的MD5加密/ </summary

93、>/ <param name="input"></param>/ <returns></returns>public static string GetMD5_32(string input)                    System.Security.Cryptography.MD5 md5 = System.Security.Cr

94、yptography.MD5.Create();byte data = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(input);            StringBuilder sb = new StringBuilder();for (int i = 0; i < data.Length; i+)         

95、0;                  sb.Append(datai.ToString("x2");            return sb.ToString();        / <summary>/ 获得16位的MD5

96、加密/ </summary>/ <param name="input"></param>/ <returns></returns>public static string GetMD5_16(string input)        return GetMD5_32(input).Substring(8, 16);        / <summary>/ 获得8位的

97、MD5加密/ </summary>/ <param name="input"></param>/ <returns></returns>public static string GetMD5_8(string input)        return GetMD5_32(input).Substring(8, 8);        / <summary>/ 获得4位

98、的MD5加密/ </summary>/ <param name="input"></param>/ <returns></returns>public static string GetMD5_4(string input)        return GetMD5_32(input).Substring(8, 4);        public static string M

99、D5EncryptHash(String input)                    MD5 md5 = new MD5CryptoServiceProvider();/the GetBytes method returns byte array equavalent of a stringbyte res = md5.ComputeHash(Encoding.Default.GetBytes(input),

100、 0, input.Length);char temp = new charres.Length;/copy to a char array which can be passed to a String constructor            Array.Copy(res, temp, res.Length);/return the result as a stringreturn new String(temp);     &

101、#160;  5、 对文件添加MD5标签及验证 这种方式比较有趣,我也是最近才发现其中的奥妙,其实我们为了防止文件被修改,可以采用这种方式预先添加MD5码,然后在程序代码中进行验证,这样至少可以减少部分篡改的行为吧,因为只要文件有些少的修改,Md5码将会发生变化的,呵呵。 #region MD5签名验证 / <summary>/ 对给定文件路径的文件加上标签/ </summary>/ <param name="path">要加密的文件的路径</param>/ <returns>标签的值</returns>public static bool AddMD5(string path)        bool IsNeed = true;if (CheckMD5(path)     &#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论