C#几种加密算法,包括MD5

 
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 = "";
            
forint 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];
    
forint i=0;
    i
<=rs.Length-1;
    i
++ )
    {
        by[i]
=byte )( ( byte )rs[i]-1 );
    }
    rs
="";
    
forint 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];
    
forint i=0;
    i
<=rs.Length-1;
    i
++ )
    {
        by[i]
=byte )( ( byte )rs[i]+1 );
    }
    rs
="";
    
forint 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[]
    {
        
0x160x090x140x150x070x010x050x08
    }
    ;
    
byte[] desIV = new  byte[]
    {
        
0x160x090x140x150x070x010x050x08
    }
    ;
    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( );
        
foreachbyte 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[]
    {
        
0x160x090x140x150x070x010x050x08
    }
    ;
    
byte[] desIV = new  byte[]
    {
        
0x160x090x140x150x070x010x050x08
    }
    ;
    DESCryptoServiceProvider des 
= new DESCryptoServiceProvider( );
    
try
    {
        
//Put the input 
        string 
        into the 
byte array
        
byte[] inputByteArray = new byte[rs.Length / 2];
        
forint x = 0;
        x 
< rs.Length / 2;
        x
++ )
        {
            
int i = ( Convert.ToInt32( rs.Sub
            
string( x * 22 ), 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;
}
 
原文地址:https://www.cnblogs.com/zkxp/p/367325.html