ASCIIEncoding.ASCII.GetBytes(sKey); 這里的sKey必須是8位英文字母。
url:
http://greatverve.cnblogs.com/archive/2011/10/12/csharp-Encrypt.html
//
須添加對System.Web的引用
using System.Web.Security;
...
/// <summary>
/// SHA1加密字符串
/// </summary>
/// <param name="source"> 源字符串 </param>
/// <returns> 加密后的字符串 </returns>
public string SHA1( string source)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(source, " SHA1 ");
}
/// <summary>
/// MD5加密字符串
/// </summary>
/// <param name="source"> 源字符串 </param>
/// <returns> 加密后的字符串 </returns>
public string MD5( string source)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(source, " MD5 ");;
}
方法二(可逆加密解密):
using System.Security.Cryptography;
...
public string Encode( string data)
{
byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
int i = cryptoProvider.KeySize;
MemoryStream ms = new MemoryStream();
CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);
StreamWriter sw = new StreamWriter(cst);
sw.Write(data);
sw.Flush();
cst.FlushFinalBlock();
sw.Flush();
return Convert.ToBase64String(ms.GetBuffer(), 0, ( int)ms.Length);
}
public string Decode( string data)
{
byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);
byte[] byEnc;
try
{
byEnc = Convert.FromBase64String(data);
}
catch
{
return null;
}
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream(byEnc);
CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cst);
return sr.ReadToEnd();
}
方法三(MD5不可逆):
using System.Security.Cryptography;
...
// MD5不可逆加密
// 32位加密
public string GetMD5_32( string s, string _input_charset)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(s));
StringBuilder sb = new StringBuilder( 32);
for ( int i = 0; i < t.Length; i++)
{
sb.Append(t[i].ToString( " x ").PadLeft( 2, ' 0 '));
}
return sb.ToString();
}
// 16位加密
public static string GetMd5_16( string ConvertString)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
string t2 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(ConvertString)), 4, 8);
t2 = t2.Replace( " - ", "");
return t2;
}
方法四(對稱加密):
using System.IO;
using System.Security.Cryptography;
...
private SymmetricAlgorithm mobjCryptoService;
private string Key;
/// <summary>
/// 對稱加密類的構造函數
/// </summary>
public SymmetricMethod()
{
mobjCryptoService = new RijndaelManaged();
Key = " Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7 ";
}
/// <summary>
/// 獲得密鑰
/// </summary>
/// <returns> 密鑰 </returns>
private byte[] GetLegalKey()
{
string sTemp = Key;
mobjCryptoService.GenerateKey();
byte[] bytTemp = mobjCryptoService.Key;
int KeyLength = bytTemp.Length;
if (sTemp.Length > KeyLength)
sTemp = sTemp.Substring( 0, KeyLength);
else if (sTemp.Length < KeyLength)
sTemp = sTemp.PadRight(KeyLength, ' ');
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
/// <summary>
/// 獲得初始向量IV
/// </summary>
/// <returns> 初試向量IV </returns>
private byte[] GetLegalIV()
{
string sTemp = " E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk ";
mobjCryptoService.GenerateIV();
byte[] bytTemp = mobjCryptoService.IV;
int IVLength = bytTemp.Length;
if (sTemp.Length > IVLength)
sTemp = sTemp.Substring( 0, IVLength);
else if (sTemp.Length < IVLength)
sTemp = sTemp.PadRight(IVLength, ' ');
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
/// <summary>
/// 加密方法
/// </summary>
/// <param name="Source"> 待加密的串 </param>
/// <returns> 經過加密的串 </returns>
public string Encrypto( string Source)
{
byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
MemoryStream ms = new MemoryStream();
mobjCryptoService.Key = GetLegalKey();
mobjCryptoService.IV = GetLegalIV();
ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
cs.Write(bytIn, 0, bytIn.Length);
cs.FlushFinalBlock();
ms.Close();
byte[] bytOut = ms.ToArray();
return Convert.ToBase64String(bytOut);
}
/// <summary>
/// 解密方法
/// </summary>
/// <param name="Source"> 待解密的串 </param>
/// <returns> 經過解密的串 </returns>
public string Decrypto( string Source)
{
byte[] bytIn = Convert.FromBase64String(Source);
MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
mobjCryptoService.Key = GetLegalKey();
mobjCryptoService.IV = GetLegalIV();
ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cs);
return sr.ReadToEnd();
}
方法五:
using System.IO;
using System.Security.Cryptography;
using System.Text;
...
// 默認密鑰向量
private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
/**//**//**/ /// <summary>
/// DES加密字符串
/// </summary>
/// <param name="encryptString"> 待加密的字符串 </param>
/// <param name="encryptKey"> 加密密鑰,要求為8位 </param>
/// <returns> 加密成功返回加密后的字符串,失敗返回源串 </returns>
public static string EncryptDES( string encryptString, string encryptKey)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring( 0, 8));
byte[] rgbIV = Keys;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
catch
{
return encryptString;
}
}
/**//**//**/ /// <summary>
/// DES解密字符串
/// </summary>
/// <param name="decryptString"> 待解密的字符串 </param>
/// <param name="decryptKey"> 解密密鑰,要求為8位,和加密密鑰相同 </param>
/// <returns> 解密成功返回解密后的字符串,失敗返源串 </returns>
public static string DecryptDES( string decryptString, string decryptKey)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
byte[] rgbIV = Keys;
byte[] inputByteArray = Convert.FromBase64String(decryptString);
DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
catch
{
return decryptString;
}
}
方法六(文件加密):
using System.IO;
using System.Security.Cryptography;
using System.Text;
...
// 加密文件
private static void EncryptData(String inName, String outName, byte[] desKey, byte[] desIV)
{
// Create the file streams to handle the input and output files.
FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength( 0);
// Create variables to help with read and write.
byte[] bin = new byte[ 100]; // 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 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.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write);
// Read from the input file, then encrypt and write to the output file.
while (rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
}
encStream.Close();
fout.Close();
fin.Close();
}
// 解密文件
private static void DecryptData(String inName, String outName, byte[] desKey, byte[] desIV)
{
// Create the file streams to handle the input and output files.
FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength( 0);
// Create variables to help with read and write.
byte[] bin = new byte[ 100]; // 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 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.CreateDecryptor(desKey, desIV), CryptoStreamMode.Write);
// Read from the input file, then encrypt and write to the output file.
while (rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
}
encStream.Close();
fout.Close();
fin.Close();
}
分享到:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C#
-----------------------------------------------
// 名稱空間
using System;
using System.Security.Cryptography;
using System.IO;
using System.Text;
// 方法
// 加密方法
public string Encrypt( string pToEncrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
// 把字符串放到byte數組中
// 原來使用的UTF8編碼,我改成Unicode編碼了,不行
byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
// byte[] inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt);
// 建立加密對象的密鑰和偏移量
// 原文使用ASCIIEncoding.ASCII方法的GetBytes方法
// 使得輸入密碼必須輸入英文文本
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(),CryptoStreamMode.Write);
// Write the byte array into the crypto stream
// (It will end up in the memory stream)
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
// Get the data back from the memory stream, and into a string
StringBuilder ret = new StringBuilder();
foreach( byte b in ms.ToArray())
{
// Format as hex
ret.AppendFormat( " {0:X2} ", b);
}
ret.ToString();
return ret.ToString();
}
// 解密方法
public string Decrypt( string pToDecrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
// Put the input string into the byte array
byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
for( int x = 0; x < pToDecrypt.Length / 2; x++)
{
int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
inputByteArray[x] = ( byte)i;
}
// 建立加密對象的密鑰和偏移量,此值重要,不能修改
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(),CryptoStreamMode.Write);
// Flush the data through the crypto stream into the memory stream
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
// Get the decrypted data back from the memory stream
// 建立StringBuild對象,CreateDecrypt使用的是流對象,必須把解密后的文本變成流對象
StringBuilder ret = new StringBuilder();
return System.Text.Encoding.Default.GetString(ms.ToArray());
}
-------------------------------------------------------
vb.Net :
-------------------------------------------------------
Imports System.Web.Security
Imports System.Security
Imports System.Security.Cryptography
Imports System.Text
Public Shared Function Encrypt(ByVal pToEncrypt As String, ByVal sKey As String) As String
Dim des As New DESCryptoServiceProvider()
Dim inputByteArray() As Byte
inputByteArray = Encoding.Default.GetBytes(pToEncrypt)
' 建立加密對象的密鑰和偏移量
' 原文使用ASCIIEncoding.ASCII方法的GetBytes方法
' 使得輸入密碼必須輸入英文文本
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
' 寫二進制數組到加密流
' (把內存流中的內容全部寫入)
Dim ms As New System.IO.MemoryStream()
Dim cs As New CryptoStream(ms, des.CreateEncryptor, CryptoStreamMode.Write)
' 寫二進制數組到加密流
' (把內存流中的內容全部寫入)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
' 建立輸出字符串
Dim ret As New StringBuilder()
Dim b As Byte
For Each b In ms.ToArray()
ret.AppendFormat( " {0:X2} ", b)
Next
Return ret.ToString()
End Function
' 解密方法
Public Shared Function Decrypt(ByVal pToDecrypt As String, ByVal sKey As String) As String
Dim des As New DESCryptoServiceProvider()
' 把字符串放入byte數組
Dim len As Integer
len = pToDecrypt.Length / 2 - 1
Dim inputByteArray(len) As Byte
Dim x, i As Integer
For x = 0 To len
i = Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16)
inputByteArray(x) = CType(i, Byte)
Next
' 建立加密對象的密鑰和偏移量,此值重要,不能修改
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
Dim ms As New System.IO.MemoryStream()
Dim cs As New CryptoStream(ms, des.CreateDecryptor, CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Return Encoding.Default.GetString(ms.ToArray)
End Function
------------------------------------------------
備注:
1. sKey輸入密碼的時候,必須使用英文字符,區分大小寫,且字符數量是8個,不能多也不能少,否則出錯。
2. 本人asp.net1. 1,vs.net2003,windows2003 server環境下C#和vb.net分別調試成功!
第二種:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace webrptdata
{
/// <summary>
/// 對稱加密算法類
/// </summary>
public class SymmetricMethod
{
private SymmetricAlgorithm mobjCryptoService;
private string Key;
/// <summary>
/// 對稱加密類的構造函數
/// </summary>
public SymmetricMethod()
{
mobjCryptoService = new RijndaelManaged();
Key = " Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7 ";
}
/// <summary>
/// 獲得密鑰
/// </summary>
/// <returns> 密鑰 </returns>
private byte[] GetLegalKey()
{
string sTemp = Key;
mobjCryptoService.GenerateKey();
byte[] bytTemp = mobjCryptoService.Key;
int KeyLength = bytTemp.Length;
if (sTemp.Length > KeyLength)
sTemp = sTemp.Substring( 0, KeyLength);
else if (sTemp.Length < KeyLength)
sTemp = sTemp.PadRight(KeyLength, ' ');
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
/// <summary>
/// 獲得初始向量IV
/// </summary>
/// <returns> 初試向量IV </returns>
private byte[] GetLegalIV()
{
string sTemp = " E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk ";
mobjCryptoService.GenerateIV();
byte[] bytTemp = mobjCryptoService.IV;
int IVLength = bytTemp.Length;
if (sTemp.Length > IVLength)
sTemp = sTemp.Substring( 0, IVLength);
else if (sTemp.Length < IVLength)
sTemp = sTemp.PadRight(IVLength, ' ');
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
/// <summary>
/// 加密方法
/// </summary>
/// <param name="Source"> 待加密的串 </param>
/// <returns> 經過加密的串 </returns>
public string Encrypto( string Source)
{
byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
MemoryStream ms = new MemoryStream();
mobjCryptoService.Key = GetLegalKey();
mobjCryptoService.IV = GetLegalIV();
ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
cs.Write(bytIn, 0, bytIn.Length);
cs.FlushFinalBlock();
ms.Close();
byte[] bytOut = ms.ToArray();
return Convert.ToBase64String(bytOut);
}
/// <summary>
/// 解密方法
/// </summary>
/// <param name="Source"> 待解密的串 </param>
/// <returns> 經過解密的串 </returns>
public string Decrypto( string Source)
{
byte[] bytIn = Convert.FromBase64String(Source);
MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
mobjCryptoService.Key = GetLegalKey();
mobjCryptoService.IV = GetLegalIV();
ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cs);
return sr.ReadToEnd();
}
}
}
using System.Web.Security;
...
/// <summary>
/// SHA1加密字符串
/// </summary>
/// <param name="source"> 源字符串 </param>
/// <returns> 加密后的字符串 </returns>
public string SHA1( string source)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(source, " SHA1 ");
}
/// <summary>
/// MD5加密字符串
/// </summary>
/// <param name="source"> 源字符串 </param>
/// <returns> 加密后的字符串 </returns>
public string MD5( string source)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(source, " MD5 ");;
}
方法二(可逆加密解密):
using System.Security.Cryptography;
...
public string Encode( string data)
{
byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
int i = cryptoProvider.KeySize;
MemoryStream ms = new MemoryStream();
CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);
StreamWriter sw = new StreamWriter(cst);
sw.Write(data);
sw.Flush();
cst.FlushFinalBlock();
sw.Flush();
return Convert.ToBase64String(ms.GetBuffer(), 0, ( int)ms.Length);
}
public string Decode( string data)
{
byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);
byte[] byEnc;
try
{
byEnc = Convert.FromBase64String(data);
}
catch
{
return null;
}
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream(byEnc);
CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cst);
return sr.ReadToEnd();
}
方法三(MD5不可逆):
using System.Security.Cryptography;
...
// MD5不可逆加密
// 32位加密
public string GetMD5_32( string s, string _input_charset)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(s));
StringBuilder sb = new StringBuilder( 32);
for ( int i = 0; i < t.Length; i++)
{
sb.Append(t[i].ToString( " x ").PadLeft( 2, ' 0 '));
}
return sb.ToString();
}
// 16位加密
public static string GetMd5_16( string ConvertString)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
string t2 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(ConvertString)), 4, 8);
t2 = t2.Replace( " - ", "");
return t2;
}
方法四(對稱加密):
using System.IO;
using System.Security.Cryptography;
...
private SymmetricAlgorithm mobjCryptoService;
private string Key;
/// <summary>
/// 對稱加密類的構造函數
/// </summary>
public SymmetricMethod()
{
mobjCryptoService = new RijndaelManaged();
Key = " Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7 ";
}
/// <summary>
/// 獲得密鑰
/// </summary>
/// <returns> 密鑰 </returns>
private byte[] GetLegalKey()
{
string sTemp = Key;
mobjCryptoService.GenerateKey();
byte[] bytTemp = mobjCryptoService.Key;
int KeyLength = bytTemp.Length;
if (sTemp.Length > KeyLength)
sTemp = sTemp.Substring( 0, KeyLength);
else if (sTemp.Length < KeyLength)
sTemp = sTemp.PadRight(KeyLength, ' ');
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
/// <summary>
/// 獲得初始向量IV
/// </summary>
/// <returns> 初試向量IV </returns>
private byte[] GetLegalIV()
{
string sTemp = " E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk ";
mobjCryptoService.GenerateIV();
byte[] bytTemp = mobjCryptoService.IV;
int IVLength = bytTemp.Length;
if (sTemp.Length > IVLength)
sTemp = sTemp.Substring( 0, IVLength);
else if (sTemp.Length < IVLength)
sTemp = sTemp.PadRight(IVLength, ' ');
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
/// <summary>
/// 加密方法
/// </summary>
/// <param name="Source"> 待加密的串 </param>
/// <returns> 經過加密的串 </returns>
public string Encrypto( string Source)
{
byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
MemoryStream ms = new MemoryStream();
mobjCryptoService.Key = GetLegalKey();
mobjCryptoService.IV = GetLegalIV();
ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
cs.Write(bytIn, 0, bytIn.Length);
cs.FlushFinalBlock();
ms.Close();
byte[] bytOut = ms.ToArray();
return Convert.ToBase64String(bytOut);
}
/// <summary>
/// 解密方法
/// </summary>
/// <param name="Source"> 待解密的串 </param>
/// <returns> 經過解密的串 </returns>
public string Decrypto( string Source)
{
byte[] bytIn = Convert.FromBase64String(Source);
MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
mobjCryptoService.Key = GetLegalKey();
mobjCryptoService.IV = GetLegalIV();
ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cs);
return sr.ReadToEnd();
}
方法五:
using System.IO;
using System.Security.Cryptography;
using System.Text;
...
// 默認密鑰向量
private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
/**//**//**/ /// <summary>
/// DES加密字符串
/// </summary>
/// <param name="encryptString"> 待加密的字符串 </param>
/// <param name="encryptKey"> 加密密鑰,要求為8位 </param>
/// <returns> 加密成功返回加密后的字符串,失敗返回源串 </returns>
public static string EncryptDES( string encryptString, string encryptKey)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring( 0, 8));
byte[] rgbIV = Keys;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
catch
{
return encryptString;
}
}
/**//**//**/ /// <summary>
/// DES解密字符串
/// </summary>
/// <param name="decryptString"> 待解密的字符串 </param>
/// <param name="decryptKey"> 解密密鑰,要求為8位,和加密密鑰相同 </param>
/// <returns> 解密成功返回解密后的字符串,失敗返源串 </returns>
public static string DecryptDES( string decryptString, string decryptKey)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
byte[] rgbIV = Keys;
byte[] inputByteArray = Convert.FromBase64String(decryptString);
DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
catch
{
return decryptString;
}
}
方法六(文件加密):
using System.IO;
using System.Security.Cryptography;
using System.Text;
...
// 加密文件
private static void EncryptData(String inName, String outName, byte[] desKey, byte[] desIV)
{
// Create the file streams to handle the input and output files.
FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength( 0);
// Create variables to help with read and write.
byte[] bin = new byte[ 100]; // 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 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.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write);
// Read from the input file, then encrypt and write to the output file.
while (rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
}
encStream.Close();
fout.Close();
fin.Close();
}
// 解密文件
private static void DecryptData(String inName, String outName, byte[] desKey, byte[] desIV)
{
// Create the file streams to handle the input and output files.
FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength( 0);
// Create variables to help with read and write.
byte[] bin = new byte[ 100]; // 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 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.CreateDecryptor(desKey, desIV), CryptoStreamMode.Write);
// Read from the input file, then encrypt and write to the output file.
while (rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
}
encStream.Close();
fout.Close();
fin.Close();
}
分享到:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C#
-----------------------------------------------
// 名稱空間
using System;
using System.Security.Cryptography;
using System.IO;
using System.Text;
// 方法
// 加密方法
public string Encrypt( string pToEncrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
// 把字符串放到byte數組中
// 原來使用的UTF8編碼,我改成Unicode編碼了,不行
byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
// byte[] inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt);
// 建立加密對象的密鑰和偏移量
// 原文使用ASCIIEncoding.ASCII方法的GetBytes方法
// 使得輸入密碼必須輸入英文文本
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(),CryptoStreamMode.Write);
// Write the byte array into the crypto stream
// (It will end up in the memory stream)
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
// Get the data back from the memory stream, and into a string
StringBuilder ret = new StringBuilder();
foreach( byte b in ms.ToArray())
{
// Format as hex
ret.AppendFormat( " {0:X2} ", b);
}
ret.ToString();
return ret.ToString();
}
// 解密方法
public string Decrypt( string pToDecrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
// Put the input string into the byte array
byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
for( int x = 0; x < pToDecrypt.Length / 2; x++)
{
int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
inputByteArray[x] = ( byte)i;
}
// 建立加密對象的密鑰和偏移量,此值重要,不能修改
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(),CryptoStreamMode.Write);
// Flush the data through the crypto stream into the memory stream
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
// Get the decrypted data back from the memory stream
// 建立StringBuild對象,CreateDecrypt使用的是流對象,必須把解密后的文本變成流對象
StringBuilder ret = new StringBuilder();
return System.Text.Encoding.Default.GetString(ms.ToArray());
}
-------------------------------------------------------
vb.Net :
-------------------------------------------------------
Imports System.Web.Security
Imports System.Security
Imports System.Security.Cryptography
Imports System.Text
Public Shared Function Encrypt(ByVal pToEncrypt As String, ByVal sKey As String) As String
Dim des As New DESCryptoServiceProvider()
Dim inputByteArray() As Byte
inputByteArray = Encoding.Default.GetBytes(pToEncrypt)
' 建立加密對象的密鑰和偏移量
' 原文使用ASCIIEncoding.ASCII方法的GetBytes方法
' 使得輸入密碼必須輸入英文文本
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
' 寫二進制數組到加密流
' (把內存流中的內容全部寫入)
Dim ms As New System.IO.MemoryStream()
Dim cs As New CryptoStream(ms, des.CreateEncryptor, CryptoStreamMode.Write)
' 寫二進制數組到加密流
' (把內存流中的內容全部寫入)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
' 建立輸出字符串
Dim ret As New StringBuilder()
Dim b As Byte
For Each b In ms.ToArray()
ret.AppendFormat( " {0:X2} ", b)
Next
Return ret.ToString()
End Function
' 解密方法
Public Shared Function Decrypt(ByVal pToDecrypt As String, ByVal sKey As String) As String
Dim des As New DESCryptoServiceProvider()
' 把字符串放入byte數組
Dim len As Integer
len = pToDecrypt.Length / 2 - 1
Dim inputByteArray(len) As Byte
Dim x, i As Integer
For x = 0 To len
i = Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16)
inputByteArray(x) = CType(i, Byte)
Next
' 建立加密對象的密鑰和偏移量,此值重要,不能修改
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
Dim ms As New System.IO.MemoryStream()
Dim cs As New CryptoStream(ms, des.CreateDecryptor, CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Return Encoding.Default.GetString(ms.ToArray)
End Function
------------------------------------------------
備注:
1. sKey輸入密碼的時候,必須使用英文字符,區分大小寫,且字符數量是8個,不能多也不能少,否則出錯。
2. 本人asp.net1. 1,vs.net2003,windows2003 server環境下C#和vb.net分別調試成功!
第二種:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace webrptdata
{
/// <summary>
/// 對稱加密算法類
/// </summary>
public class SymmetricMethod
{
private SymmetricAlgorithm mobjCryptoService;
private string Key;
/// <summary>
/// 對稱加密類的構造函數
/// </summary>
public SymmetricMethod()
{
mobjCryptoService = new RijndaelManaged();
Key = " Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7 ";
}
/// <summary>
/// 獲得密鑰
/// </summary>
/// <returns> 密鑰 </returns>
private byte[] GetLegalKey()
{
string sTemp = Key;
mobjCryptoService.GenerateKey();
byte[] bytTemp = mobjCryptoService.Key;
int KeyLength = bytTemp.Length;
if (sTemp.Length > KeyLength)
sTemp = sTemp.Substring( 0, KeyLength);
else if (sTemp.Length < KeyLength)
sTemp = sTemp.PadRight(KeyLength, ' ');
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
/// <summary>
/// 獲得初始向量IV
/// </summary>
/// <returns> 初試向量IV </returns>
private byte[] GetLegalIV()
{
string sTemp = " E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk ";
mobjCryptoService.GenerateIV();
byte[] bytTemp = mobjCryptoService.IV;
int IVLength = bytTemp.Length;
if (sTemp.Length > IVLength)
sTemp = sTemp.Substring( 0, IVLength);
else if (sTemp.Length < IVLength)
sTemp = sTemp.PadRight(IVLength, ' ');
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
/// <summary>
/// 加密方法
/// </summary>
/// <param name="Source"> 待加密的串 </param>
/// <returns> 經過加密的串 </returns>
public string Encrypto( string Source)
{
byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
MemoryStream ms = new MemoryStream();
mobjCryptoService.Key = GetLegalKey();
mobjCryptoService.IV = GetLegalIV();
ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
cs.Write(bytIn, 0, bytIn.Length);
cs.FlushFinalBlock();
ms.Close();
byte[] bytOut = ms.ToArray();
return Convert.ToBase64String(bytOut);
}
/// <summary>
/// 解密方法
/// </summary>
/// <param name="Source"> 待解密的串 </param>
/// <returns> 經過解密的串 </returns>
public string Decrypto( string Source)
{
byte[] bytIn = Convert.FromBase64String(Source);
MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
mobjCryptoService.Key = GetLegalKey();
mobjCryptoService.IV = GetLegalIV();
ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cs);
return sr.ReadToEnd();
}
}
}