MD5算法:
using System;
using System.Text;
namespace BaseStationPDA
{
//// <summary>
/// Summary description for MD5.
/// </summary>
public class MD5
{
const
int BITS_TO_A_BYTE = 8;
const
int BYTES_TO_A_WORD = 4;
const
int BITS_TO_A_WORD = 32;
private static long[] m_lOnBits = new long[30 + 1];
private static long[] m_l2Power = new long[30 + 1];
private static long LShift( long lValue, long iShiftBits )
{
long LShift = 0;
if ( iShiftBits == 0 )
{
LShift = lValue;
return LShift;
}
else
{
if(iShiftBits == 31 )
{
if ( Convert.ToBoolean( lValue & 1 ) )
{
LShift = 0x80000000;
}
else
{
LShift = 0;
}
return LShift;
}
else
{
if(iShiftBits < 0 || iShiftBits > 31 )
{
// Err.Raise 6;
}
}
}
if ( Convert.ToBoolean( ( lValue & m_l2Power[31 - iShiftBits] ) ) )
{
LShift = ( ( lValue & m_lOnBits[31 - ( iShiftBits + 1 )] ) * m_l2Power[iShiftBits] ) | 0x80000000;
}
else
{
LShift = ( ( lValue & m_lOnBits[31 - iShiftBits] ) * m_l2Power[iShiftBits] );
}
return LShift;
}
private static long RShift( long lValue, long iShiftBits )
{
long RShift = 0;
if ( iShiftBits == 0 )
{
RShift = lValue;
return RShift;
}
else
{
if(iShiftBits == 31 )
{
if ( Convert.ToBoolean( lValue & 0x80000000 ) )
{
RShift = 1;
}
else
{
RShift = 0;
}
return RShift;
}
else
{
if(iShiftBits < 0 || iShiftBits > 31 )
{
// Err.Raise 6;
}
}
}
RShift = ( lValue & 0x7FFFFFFE ) / m_l2Power[iShiftBits];
if ( Convert.ToBoolean( ( lValue & 0x80000000 ) ) )
{
RShift = ( RShift | ( 0x40000000 / m_l2Power[iShiftBits - 1] ) );
}
return RShift;
}
private static long RotateLeft( long lValue, long iShiftBits )
{
long RotateLeft = 0;
RotateLeft = LShift( lValue, iShiftBits ) | RShift( lValue, ( 32 - iShiftBits ) );
return RotateLeft;
}
private static long AddUnsigned( long lX, long lY )
{
long AddUnsigned = 0;
long lX4 = 0;
long lY4 = 0;
long lX8 = 0;
long lY8 = 0;
long lResult = 0;
lX8 = lX & 0x80000000;
lY8 = lY & 0x80000000;
lX4 = lX & 0x40000000;
lY4 = lY & 0x40000000;
lResult = ( lX & 0x3FFFFFFF ) + ( lY & 0x3FFFFFFF );
if ( Convert.ToBoolean( lX4 & lY4 ) )
{
lResult = lResult ^ 0x80000000 ^ lX8 ^ lY8;
}
else if(Convert.ToBoolean( lX4 | lY4 ) )
{
if ( Convert.ToBoolean( lResult & 0x40000000 ) )
{
lResult = lResult ^ 0xC0000000 ^ lX8 ^ lY8;
}
else
{
lResult = lResult ^ 0x40000000 ^ lX8 ^ lY8;
}
}
else
{
lResult = lResult ^ lX8 ^ lY8;
}
AddUnsigned = lResult;
return AddUnsigned;
}
private static long md5_F( long x, long y, long z )
{
long md5_F = 0;
md5_F = ( x & y ) | ( (~x ) & z );
return md5_F;
}
private static long md5_G( long x, long y, long z )
{
long md5_G = 0;
md5_G = ( x & z ) | ( y & (~z ) );
return md5_G;
}
private static long md5_H( long x, long y, long z )
{
long md5_H = 0;
md5_H = ( x ^ y ^ z );
return md5_H;
}
private static long md5_I( long x, long y, long z )
{
long md5_I = 0;
md5_I = ( y ^ ( x | ( ~z ) ) );
return md5_I;
}
private static void md5_FF( ref long a, long b, long c, long d, long x, long s, long ac )
{
a = AddUnsigned( a, AddUnsigned( AddUnsigned( md5_F( b, c, d ), x ), ac ) );
a = RotateLeft( a, s );
a = AddUnsigned( a, b );
}
private static void md5_GG( ref long a, long b, long c, long d, long x, long s, long ac )
{
a = AddUnsigned( a, AddUnsigned( AddUnsigned( md5_G( b, c, d ), x ), ac ) );
a = RotateLeft( a, s );
a = AddUnsigned( a, b );
}
private static void md5_HH( ref long a, long b, long c, long d, long x, long s, long ac )
{
a = AddUnsigned( a, AddUnsigned( AddUnsigned( md5_H( b, c, d ), x ), ac ) );
a = RotateLeft( a, s );
a = AddUnsigned( a, b );
}
private static void md5_II( ref long a, long b, long c, long d, long x, long s, long ac )
{
a = AddUnsigned( a, AddUnsigned( AddUnsigned( md5_I( b, c, d ), x ), ac ) );
a = RotateLeft( a, s );
a = AddUnsigned( a, b );
}
private static long[] ConvertToWordArray( string sMessage )
{
long[] ConvertToWordArray = null;
int lMessageLength = 0;
int lNumberOfWords = 0;
long[] lWordArray = null;
int lBytePosition = 0;
int lByteCount = 0;
int lWordCount = 0;
const
int MODULUS_BITS = 512;
const
int CONGRUENT_BITS = 448;
lMessageLength = sMessage.Length;
lNumberOfWords = ( ( ( lMessageLength + ( ( MODULUS_BITS - CONGRUENT_BITS ) / BITS_TO_A_BYTE ) ) / ( MODULUS_BITS / BITS_TO_A_BYTE ) ) + 1 ) * ( MODULUS_BITS / BITS_TO_A_WORD );
lWordArray = new long[lNumberOfWords];
lBytePosition = 0;
lByteCount = 0;
while( lByteCount < lMessageLength )
{
lWordCount = lByteCount / BYTES_TO_A_WORD;
lBytePosition = ( lByteCount % BYTES_TO_A_WORD ) * BITS_TO_A_BYTE;
lWordArray[lWordCount] = lWordArray[lWordCount] | LShift( Convert.ToByte( sMessage.Sub
string( lByteCount, 1 ).ToCharArray( )[0] ), lBytePosition );
lByteCount = lByteCount + 1;
}
lWordCount = lByteCount / BYTES_TO_A_WORD;
lBytePosition = ( lByteCount % BYTES_TO_A_WORD ) * BITS_TO_A_BYTE;
lWordArray[lWordCount] = lWordArray[lWordCount] | LShift( 0x80, lBytePosition );
lWordArray[lNumberOfWords - 2] = LShift( lMessageLength, 3 );
lWordArray[lNumberOfWords - 1] = RShift( lMessageLength, 29 );
ConvertToWordArray = lWordArray;
return ConvertToWordArray;
}
private static
string WordToHex( long lValue )
{
string WordToHex = "";
long lByte = 0;
int lCount = 0;
for( lCount = 0;
lCount <= 3;
lCount++ )
{
lByte = RShift( lValue, lCount * BITS_TO_A_BYTE ) & m_lOnBits[BITS_TO_A_BYTE - 1];
WordToHex = WordToHex + ( ( "0" + ToHex( lByte ) ).Sub
string( ( "0" + ToHex( lByte ) ).Length - 2 ) );
}
return WordToHex;
}
private static
string ToHex( long dec )
{
string strhex = "";
while( dec > 0 )
{
strhex = tohex( dec % 16 ) + strhex;
dec = dec / 16;
}
return strhex;
}
private static
string tohex( long hex )
{
string strhex = "";
switch( hex )
{
case 10: strhex = "a";
break;
case 11: strhex = "b";
break;
case 12: strhex = "c";
break;
case 13: strhex = "d";
break;
case 14: strhex = "e";
break;
case 15: strhex = "f";
break;
default : strhex = hex.ToString( );
break;
}
return strhex;
}
public static
string Encrypt( string sMessage,
int stype )
{
string MD5 = "";
for( int i=0;
i<=30;
i++ )
{
m_lOnBits[i] = Convert.ToInt64( Math.Pow( 2, i+1 ) -1 );
m_l2Power[i] = Convert.ToInt64( Math.Pow( 2, i ) );
}
long[] x = null;
int k = 0;
long AA = 0;
long BB = 0;
long CC = 0;
long DD = 0;
long a = 0;
long b = 0;
long c = 0;
long d = 0;
const
int S11 = 7;
const
int S12 = 12;
const
int S13 = 17;
const
int S14 = 22;
const
int S21 = 5;
const
int S22 = 9;
const
int S23 = 14;
const
int S24 = 20;
const
int S31 = 4;
const
int S32 = 11;
const
int S33 = 16;
const
int S34 = 23;
const
int S41 = 6;
const
int S42 = 10;
const
int S43 = 15;
const
int S44 = 21;
x = ConvertToWordArray( sMessage );
a = 0x67452301;
b = 0xEFCDAB89;
c = 0x98BADCFE;
d = 0x10325476;
for( k = 0;
k < x.Length;
k += 16 )
{
AA = a;
BB = b;
CC = c;
DD = d;
md5_FF( ref a, b, c, d, x[k + 0], S11, 0xD76AA478 );
md5_FF( ref d, a, b, c, x[k + 1], S12, 0xE8C7B756 );
md5_FF( ref c, d, a, b, x[k + 2], S13, 0x242070DB );
md5_FF( ref b, c, d, a, x[k + 3], S14, 0xC1BDCEEE );
md5_FF( ref a, b, c, d, x[k + 4], S11, 0xF57C0FAF );
md5_FF( ref d, a, b, c, x[k + 5], S12, 0x4787C62A );
md5_FF( ref c, d, a, b, x[k + 6], S13, 0xA8304613 );
md5_FF( ref b, c, d, a, x[k + 7], S14, 0xFD469501 );
md5_FF( ref a, b, c, d, x[k + 8], S11, 0x698098D8 );
md5_FF( ref d, a, b, c, x[k + 9], S12, 0x8B44F7AF );
md5_FF( ref c, d, a, b, x[k + 10], S13, 0xFFFF5BB1 );
md5_FF( ref b, c, d, a, x[k + 11], S14, 0x895CD7BE );
md5_FF( ref a, b, c, d, x[k + 12], S11, 0x6B901122 );
md5_FF( ref d, a, b, c, x[k + 13], S12, 0xFD987193 );
md5_FF( ref c, d, a, b, x[k + 14], S13, 0xA679438E );
md5_FF( ref b, c, d, a, x[k + 15], S14, 0x49B40821 );
md5_GG( ref a, b, c, d, x[k + 1], S21, 0xF61E2562 );
md5_GG( ref d, a, b, c, x[k + 6], S22, 0xC040B340 );
md5_GG( ref c, d, a, b, x[k + 11], S23, 0x265E5A51 );
md5_GG( ref b, c, d, a, x[k + 0], S24, 0xE9B6C7AA );
md5_GG( ref a, b, c, d, x[k + 5], S21, 0xD62F105D );
md5_GG( ref d, a, b, c, x[k + 10], S22, 0x2441453 );
md5_GG( ref c, d, a, b, x[k + 15], S23, 0xD8A1E681 );
md5_GG( ref b, c, d, a, x[k + 4], S24, 0xE7D3FBC8 );
md5_GG( ref a, b, c, d, x[k + 9], S21, 0x21E1CDE6 );
md5_GG( ref d, a, b, c, x[k + 14], S22, 0xC33707D6 );
md5_GG( ref c, d, a, b, x[k + 3], S23, 0xF4D50D87 );
md5_GG( ref b, c, d, a, x[k + 8], S24, 0x455A14ED );
md5_GG( ref a, b, c, d, x[k + 13], S21, 0xA9E3E905 );
md5_GG( ref d, a, b, c, x[k + 2], S22, 0xFCEFA3F8 );
md5_GG( ref c, d, a, b, x[k + 7], S23, 0x676F02D9 );
md5_GG( ref b, c, d, a, x[k + 12], S24, 0x8D2A4C8A );
md5_HH( ref a, b, c, d, x[k + 5], S31, 0xFFFA3942 );
md5_HH( ref d, a, b, c, x[k + 8], S32, 0x8771F681 );
md5_HH( ref c, d, a, b, x[k + 11], S33, 0x6D9D6122 );
md5_HH( ref b, c, d, a, x[k + 14], S34, 0xFDE5380C );
md5_HH( ref a, b, c, d, x[k + 1], S31, 0xA4BEEA44 );
md5_HH( ref d, a, b, c, x[k + 4], S32, 0x4BDECFA9 );
md5_HH( ref c, d, a, b, x[k + 7], S33, 0xF6BB4B60 );
md5_HH( ref b, c, d, a, x[k + 10], S34, 0xBEBFBC70 );
md5_HH( ref a, b, c, d, x[k + 13], S31, 0x289B7EC6 );
md5_HH( ref d, a, b, c, x[k + 0], S32, 0xEAA127FA );
md5_HH( ref c, d, a, b, x[k + 3], S33, 0xD4EF3085 );
md5_HH( ref b, c, d, a, x[k + 6], S34, 0x4881D05 );
md5_HH( ref a, b, c, d, x[k + 9], S31, 0xD9D4D039 );
md5_HH( ref d, a, b, c, x[k + 12], S32, 0xE6DB99E5 );
md5_HH( ref c, d, a, b, x[k + 15], S33, 0x1FA27CF8 );
md5_HH( ref b, c, d, a, x[k + 2], S34, 0xC4AC5665 );
md5_II( ref a, b, c, d, x[k + 0], S41, 0xF4292244 );
md5_II( ref d, a, b, c, x[k + 7], S42, 0x432AFF97 );
md5_II( ref c, d, a, b, x[k + 14], S43, 0xAB9423A7 );
md5_II( ref b, c, d, a, x[k + 5], S44, 0xFC93A039 );
md5_II( ref a, b, c, d, x[k + 12], S41, 0x655B59C3 );
md5_II( ref d, a, b, c, x[k + 3], S42, 0x8F0CCC92 );
md5_II( ref c, d, a, b, x[k + 10], S43, 0xFFEFF47D );
md5_II( ref b, c, d, a, x[k + 1], S44, 0x85845DD1 );
md5_II( ref a, b, c, d, x[k + 8], S41, 0x6FA87E4F );
md5_II( ref d, a, b, c, x[k + 15], S42, 0xFE2CE6E0 );
md5_II( ref c, d, a, b, x[k + 6], S43, 0xA3014314 );
md5_II( ref b, c, d, a, x[k + 13], S44, 0x4E0811A1 );
md5_II( ref a, b, c, d, x[k + 4], S41, 0xF7537E82 );
md5_II( ref d, a, b, c, x[k + 11], S42, 0xBD3AF235 );
md5_II( ref c, d, a, b, x[k + 2], S43, 0x2AD7D2BB );
md5_II( ref b, c, d, a, x[k + 9], S44, 0xEB86D391 );
a = AddUnsigned( a, AA );
b = AddUnsigned( b, BB );
c = AddUnsigned( c, CC );
d = AddUnsigned( d, DD );
}
if ( stype == 32 )
{
MD5 = ( ( ( ( WordToHex( a ) ) + ( WordToHex( b ) ) ) + ( WordToHex( c ) ) ) + ( WordToHex( d ) ) ).ToLower( );
}
else
{
MD5 = ( ( WordToHex( b ) ) + ( WordToHex( c ) ) ).ToLower( );
}
//
MD5=MD5.Replace( "0", "a" );
//
MD5=MD5.Replace( "1", "b" );
//
MD5=MD5.Replace( "2", "cs" );
//
MD5=MD5.Replace( "3", "d" );
//
MD5=MD5.Replace( "4", "e" );
//
MD5=MD5.Replace( "5", "f" );
//
MD5=MD5.Replace( "6", "k" );
//
MD5=MD5.Replace( "7", "s" );
////
MD5=MD5.Replace( "8", "r" );
//
MD5=MD5.Replace( "9", "ip" );
//
MD5=MD5.Replace( "j", "8" );
//
MD5=MD5.Replace( "o", "3" );
////
MD5=MD5.Replace( "a", "04" );
//
MD5=MD5.Replace( "m", "3" );
//
MD5=MD5.Replace( "x", "67" );
//
MD5=MD5.Replace( "p", "23" );
//
MD5=MD5.Replace( "g", "7" );
//自已再加上个尾缀别人根本解不出来
return MD5;
}
}
}
( 2 )倒序加1与顺序减1
public static
string DecryptStr( string rs ) //顺序减1解码
{
byte[] by=new byte[rs.Length];
for( int i=0;
i<=rs.Length-1;
i++ )
{
by[i]=( byte )( ( byte )rs[i]-1 );
}
rs="";
for( int i=by.Length-1;
i>=0;
i-- )
{
rs+=( ( char )by[i] ).ToString( );
}
return rs;
}
public static
string EncryptStr( string rs ) //倒序加1加密
{
byte[] by=new byte[rs.Length];
for( int i=0;
i<=rs.Length-1;
i++ )
{
by[i]=( byte )( ( byte )rs[i]+1 );
}
rs="";
for( int i=by.Length-1;
i>=0;
i-- )
{
rs+=( ( char )by[i] ).ToString( );
}
return rs;
}
( 3 )又一种不同的密钥
public static
string EncryptMethod( string rs ) //加密
{
byte[] desKey = new byte[]
{
0x16, 0x09, 0x14, 0x15, 0x07, 0x01, 0x05, 0x08
}
;
byte[] desIV = new byte[]
{
0x16, 0x09, 0x14, 0x15, 0x07, 0x01, 0x05, 0x08
}
;
DESCryptoServiceProvider des = new DESCryptoServiceProvider( );
try
{
byte[] inputByteArray = Encoding.Default.GetBytes( rs );
//byte[] inputByteArray=Encoding.Unicode.GetBytes( rs );
des.Key = desKey;
// ASCIIEncoding.ASCII.GetBytes( sKey );
des.IV = desIV;
//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( );
}
catch
{
return rs;
}
finally
{
des = null;
}
}
public static
string DecryptMethod( string rs )
//解密
{
byte[] desKey = new byte[]
{
0x16, 0x09, 0x14, 0x15, 0x07, 0x01, 0x05, 0x08
}
;
byte[] desIV = new byte[]
{
0x16, 0x09, 0x14, 0x15, 0x07, 0x01, 0x05, 0x08
}
;
DESCryptoServiceProvider des = new DESCryptoServiceProvider( );
try
{
//Put the input
string
into the byte array
byte[] inputByteArray = new byte[rs.Length / 2];
for( int x = 0;
x < rs.Length / 2;
x++ )
{
int i = ( Convert.ToInt32( rs.Sub
string( x * 2, 2 ), 16 ) );
inputByteArray[x] = ( byte )i;
}
des.Key = desKey;
//ASCIIEncoding.ASCII.GetBytes( sKey );
des.IV = desIV;
//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
StringBuilder ret = new StringBuilder( );
return System.Text.Encoding.Default.GetString( ms.ToArray( ) );
}
catch
{
return rs;
}
finally
{
des = null;
}
}
有些加密的还可以起到别的作用,如上次我在PDA上要post图片和一些说明文字到web服务器上中文的处理就是用了一些小巧的加密算法,因为.net的mobile上不支持一些特殊的算法(支持MD5但MD5不可解密的)上面写的两种都不支持所以只好另写:
private
string aa( string bb )
{
byte[] by=new byte[bb.Length];
by=System.Text.Encoding.UTF8.GetBytes( bb );
string r=Convert.ToBase64String( by );
return r;
}
private
string bb( string aa )
{
byte[] by=Convert.FromBase64String( aa );
string r=Encoding.UTF8.GetString( by );
return r;
}