代码笔记 | 用C#实现跟CI里面的加密解密
2016-09-01 18:01
441 查看
using System; using System.Text; using System.IO; using System.Security.Cryptography; namespace CI { class CI_Encrypt { private string key; private string hash_type = "sha1"; public CI_Encrypt(string key = "") { if(key.Length > 0) { this.key = key; } } public string encode(string data) { RijndaelManaged aes = new RijndaelManaged(); aes.KeySize = 256; aes.BlockSize = 256; aes.Padding = PaddingMode.Zeros; aes.Mode = CipherMode.CBC; aes.Key = this.get_key(key); aes.GenerateIV(); var _IV = aes.IV; byte[] buffer; ICryptoTransform AESEncrypt = aes.CreateEncryptor(aes.Key, aes.IV); using (MemoryStream msEncrypt = new MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, AESEncrypt, CryptoStreamMode.Write)) { using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) { //Write all data to the stream. swEncrypt.Write(data); } buffer = msEncrypt.ToArray(); } } var enc = new byte [ _IV.Length + buffer.Length ]; Array.Copy(_IV,enc ,_IV.Length); Array.Copy(buffer,0,enc,_IV.Length,buffer.Length); return this.add_cipher_noise(enc); } public string decode(string data) { string plainText; byte[] _enc_data = this.remove_cipher_noise(Convert.FromBase64String(data)); using (RijndaelManaged aes = new RijndaelManaged()) { aes.KeySize = 256; aes.BlockSize = 256; aes.Padding = PaddingMode.Zeros; aes.Mode = CipherMode.CBC; aes.Key = this.get_key(key); var _IV = new byte[aes.IV.Length]; Array.Copy(_enc_data, _IV, _IV.Length); aes.IV = _IV; var endata = new byte[_enc_data.Length - aes.IV.Length]; Array.Copy(_enc_data, aes.IV.Length, endata, 0, endata.Length); // Create a decrytor to perform the stream transform. ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV); // Create the streams used for decryption. using (MemoryStream msDecrypt = new MemoryStream(endata)) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { using (StreamReader srDecrypt = new StreamReader(csDecrypt)) { // Read the decrypted bytes from the decrypting stream // and place them in a string. plainText = srDecrypt.ReadToEnd(); } } } } return plainText; } public string add_cipher_noise(byte[] data) { string hashkey = this.hash(System.Text.Encoding.Default.GetString(this.get_key(this.key))); char[] keyChar = hashkey.ToCharArray(); byte[] encrpytData = new byte[data.Length]; for (int i = 0, j = 0; i < data.Length; i++, j++) { if (j >= hashkey.Length) { j = 0; } var temp = (((int)data[i] + (int)keyChar[j]) % 256); encrpytData[i] = (byte)temp; } return System.Convert.ToBase64String(encrpytData); } public byte[] remove_cipher_noise(byte[] data) { string hashkey = this.hash(System.Text.Encoding.Default.GetString(this.get_key(this.key))); char[] keyChar = hashkey.ToCharArray(); byte[] encrpytData = new byte[data.Length]; int temp; for (int i = 0, j = 0; i < data.Length; i++, j++) { if (j >= hashkey.Length) { j = 0; } temp = (int)data[i] - (int)keyChar[j]; if(temp < 0) { temp += 256; } encrpytData[i] = (byte)temp; } return encrpytData; } private string hash(string key) { byte[] hashBytes; if (this.hash_type == "sha1") { SHA1 sha = new SHA1CryptoServiceProvider(); hashBytes = (sha.ComputeHash(System.Text.Encoding.Default.GetBytes(key))); } else { MD5 md5 = new MD5CryptoServiceProvider(); hashBytes = (md5.ComputeHash(System.Text.Encoding.Default.GetBytes(key))); } StringBuilder sb = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("X2")); } return sb.ToString().ToLower(); } private byte[] get_key(string key) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] hashBytes = (md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key))); StringBuilder sb = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("X2")); } return System.Text.Encoding.Default.GetBytes(sb.ToString().ToLower()); } } }
相关文章推荐
- C# 程序简单实现加密解密程序代码
- C#代码实现对AES加密解密
- asp实现的sha1加密解密代码(和C#兼容)
- asp实现的sha1加密解密代码(和C#兼容)
- C#实现AES加密和解密函数原代码
- 用C#实现字符串的加密解密操作
- C#实现AES加密和解密函数
- 用C#实现AES加密和解密
- QQ协议TEA加密解密代码 C#
- (转)使用Vernam(维尔南/弗纳姆)算法实现文件加密解密[C#]
- C#中RSA加密解密和签名与验证的实现 (转)
- C#实现AES加密和解密函数
- 用C#实现AES加密和解密
- C#中RSA加密解密和签名与验证的实现
- 高分求救,微软屏传开源的项目,里面也有屏传的代码,是用C#实现的。
- AES加密解密代码实现
- C#实现DES加密解密,AES加密解密
- 『原创』c#实现文件加密、解密及文件拖拽至程序图标直接打开
- C#中RSA加密解密和签名与验证的实现
- C#实现256位AES加密和解密