c#、vb.net 實現MD5加密
以下為MD5演算法用c#的實現
//MD5.cs
//MD5 16-bit,32-bits algorithm implemented in C#
using System;
using System.Text;
namespace Encrypter
{
/// <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.Substring(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)).Substring(("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();
}
return MD5;
}
}
}
以下為MD5演算法用VB的實現
//MD5.vb
//MD5 16-bit,32-bits algorithm implemented in C#
Namespace Encrypter
Public Class MD5
Private Const BITS_TO_A_BYTE As Integer = 8
Private Const BYTES_TO_A_WORD As Integer = 4
Private Const BITS_TO_A_WORD As Integer = 32
Private Shared m_lOnBits(30) As Long
Private Shared m_l2Power(30) As Long
Public Shared Function LShift(ByVal lValue As Long, ByVal iShiftBits As Integer) As Long
If iShiftBits = 0 Then
LShift = lValue
Exit Function
ElseIf iShiftBits = 31 Then
If lValue And 1 Then
LShift = &H80000000
Else
LShift = 0
End If
Exit Function
ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
Err.Raise(6)
End If
If (lValue And m_l2Power(31 - iShiftBits)) Then
LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000
Else
LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))
End If
End Function
Public Shared Function RShift(ByVal lValue As Long, ByVal iShiftBits As Integer) As Long
If iShiftBits = 0 Then
RShift = lValue
Exit Function
ElseIf iShiftBits = 31 Then
If lValue And &H80000000 Then
RShift = 1
Else
RShift = 0
End If
Exit Function
ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
Err.Raise(6)
End If
RShift = (lValue And &H7FFFFFFE) / m_l2Power(iShiftBits)
If (lValue And &H80000000) Then
RShift = (RShift Or (&H40000000 / m_l2Power(iShiftBits - 1)))
End If
End Function
Public Shared Function RotateLeft(ByVal lValue As Long, ByVal iShiftBits As Integer) As Long
RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits))
End Function
Private Shared Function AddUnsigned(ByVal lX As Long, ByVal lY As Long) As Long
Dim lX4 As Long
Dim lY4 As Long
Dim lX8 As Long
Dim lY8 As Long
Dim lResult As Long
lX8 = lX And &H80000000
lY8 = lY And &H80000000
lX4 = lX And &H40000000
lY4 = lY And &H40000000
lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF)
If lX4 And lY4 Then
lResult = lResult Xor &H80000000 Xor lX8 Xor lY8
ElseIf lX4 Or lY4 Then
If lResult And &H40000000 Then
lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8
Else
lResult = lResult Xor &H40000000 Xor lX8 Xor lY8
End If
Else
lResult = lResult Xor lX8 Xor lY8
End If
AddUnsigned = lResult
End Function
Private Shared Function md5_F(ByVal x As Long, ByVal y As Long, ByVal z As Long) As Long
md5_F = (x And y) Or ((Not x) And z)
End Function
Private Shared Function md5_G(ByVal x As Long, ByVal y As Long, ByVal z As Long) As Long
md5_G = (x And z) Or (y And (Not z))
End Function
Private Shared Function md5_H(ByVal x As Long, ByVal y As Long, ByVal z As Long) As Long
md5_H = (x Xor y Xor z)
End Function
Private Shared Function md5_I(ByVal x As Long, ByVal y As Long, ByVal z As Long) As Long
md5_I = (y Xor (x Or (Not z)))
End Function
Private Shared Sub md5_FF(ByRef a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long, ByVal x As Long, ByVal s As Long, ByVal ac As Long)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Shared Sub md5_GG(ByRef a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long, ByVal x As Long, ByVal s As Long, ByVal ac As Long)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Shared Sub md5_HH(ByRef a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long, ByVal x As Long, ByVal s As Long, ByVal ac As Long)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Shared Sub md5_II(ByRef a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long, ByVal x As Long, ByVal s As Long, ByVal ac As Long)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Shared Function ConvertToWordArray(ByVal sMessage As String)
Dim lMessageLength As Integer
Dim lNumberOfWords As Integer
Dim lWordArray() As Long
Dim lBytePosition As Integer
Dim lByteCount As Integer
Dim lWordCount As Integer
Const MODULUS_BITS As Long = 512
Const CONGRUENT_BITS As Long = 448
lMessageLength = Len(sMessage)
lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) / BITS_TO_A_BYTE)) / (MODULUS_BITS / BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS / BITS_TO_A_WORD)
ReDim lWordArray(lNumberOfWords - 1)
lBytePosition = 0
lByteCount = 0
Do Until lByteCount >= lMessageLength
lWordCount = lByteCount / BYTES_TO_A_WORD
lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition)
lByteCount = lByteCount + 1
Loop
lWordCount = lByteCount / BYTES_TO_A_WORD
lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition)
lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)
lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)
ConvertToWordArray = lWordArray
End Function
Public Shared Function WordToHex(ByVal lValue As Long)
Dim lByte As Long
Dim lCount As Long
For lCount = 0 To 3
lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1)
WordToHex = WordToHex & Right("0" & Hex(lByte), 2)
Next
End Function
Public Shared Function Encrypt(ByVal sMessage As String, ByVal stype As Integer)
m_lOnBits(0) = CLng(1)
m_lOnBits(1) = CLng(3)
m_lOnBits(2) = CLng(7)
m_lOnBits(3) = CLng(15)
m_lOnBits(4) = CLng(31)
m_lOnBits(5) = CLng(63)
m_lOnBits(6) = CLng(127)
m_lOnBits(7) = CLng(255)
m_lOnBits(8) = CLng(511)
m_lOnBits(9) = CLng(1023)
m_lOnBits(10) = CLng(2047)
m_lOnBits(11) = CLng(4095)
m_lOnBits(12) = CLng(8191)
m_lOnBits(13) = CLng(16383)
m_lOnBits(14) = CLng(32767)
m_lOnBits(15) = CLng(65535)
m_lOnBits(16) = CLng(131071)
m_lOnBits(17) = CLng(262143)
m_lOnBits(18) = CLng(524287)
m_lOnBits(19) = CLng(1048575)
m_lOnBits(20) = CLng(2097151)
m_lOnBits(21) = CLng(4194303)
m_lOnBits(22) = CLng(8388607)
m_lOnBits(23) = CLng(16777215)
m_lOnBits(24) = CLng(33554431)
m_lOnBits(25) = CLng(67108863)
m_lOnBits(26) = CLng(134217727)
m_lOnBits(27) = CLng(268435455)
m_lOnBits(28) = CLng(536870911)
m_lOnBits(29) = CLng(1073741823)
m_lOnBits(30) = CLng(2147483647)
m_l2Power(0) = CLng(1)
m_l2Power(1) = CLng(2)
m_l2Power(2) = CLng(4)
m_l2Power(3) = CLng(8)
m_l2Power(4) = CLng(16)
m_l2Power(5) = CLng(32)
m_l2Power(6) = CLng(64)
m_l2Power(7) = CLng(128)
m_l2Power(8) = CLng(256)
m_l2Power(9) = CLng(512)
m_l2Power(10) = CLng(1024)
m_l2Power(11) = CLng(2048)
m_l2Power(12) = CLng(4096)
m_l2Power(13) = CLng(8192)
m_l2Power(14) = CLng(16384)
m_l2Power(15) = CLng(32768)
m_l2Power(16) = CLng(65536)
m_l2Power(17) = CLng(131072)
m_l2Power(18) = CLng(262144)
m_l2Power(19) = CLng(524288)
m_l2Power(20) = CLng(1048576)
m_l2Power(21) = CLng(2097152)
m_l2Power(22) = CLng(4194304)
m_l2Power(23) = CLng(8388608)
m_l2Power(24) = CLng(16777216)
m_l2Power(25) = CLng(33554432)
m_l2Power(26) = CLng(67108864)
m_l2Power(27) = CLng(134217728)
m_l2Power(28) = CLng(268435456)
m_l2Power(29) = CLng(536870912)
m_l2Power(30) = CLng(1073741824)
Dim x() As Long
Dim k As Integer
Dim AA As Integer
Dim BB As Integer
Dim CC As Integer
Dim DD As Integer
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Const S11 As Integer = 7
Const S12 As Integer = 12
Const S13 As Integer = 17
Const S14 As Integer = 22
Const S21 As Integer = 5
Const S22 As Integer = 9
Const S23 As Integer = 14
Const S24 As Integer = 20
Const S31 As Integer = 4
Const S32 As Integer = 11
Const S33 As Integer = 16
Const S34 As Integer = 23
Const S41 As Integer = 6
Const S42 As Integer = 10
Const S43 As Integer = 15
Const S44 As Integer = 21
x = ConvertToWordArray(sMessage)
a = &H67452301
b = &HEFCDAB89
c = &H98BADCFE
d = &H10325476
For k = 0 To UBound(x) Step 16
AA = a
BB = b
CC = c
DD = d
md5_FF(a, b, c, d, x(k + 0), S11, &HD76AA478)
md5_FF(d, a, b, c, x(k + 1), S12, &HE8C7B756)
md5_FF(c, d, a, b, x(k + 2), S13, &H242070DB)
md5_FF(b, c, d, a, x(k + 3), S14, &HC1BDCEEE)
md5_FF(a, b, c, d, x(k + 4), S11, &HF57C0FAF)
md5_FF(d, a, b, c, x(k + 5), S12, &H4787C62A)
md5_FF(c, d, a, b, x(k + 6), S13, &HA8304613)
md5_FF(b, c, d, a, x(k + 7), S14, &HFD469501)
md5_FF(a, b, c, d, x(k + 8), S11, &H698098D8)
md5_FF(d, a, b, c, x(k + 9), S12, &H8B44F7AF)
md5_FF(c, d, a, b, x(k + 10), S13, &HFFFF5BB1)
md5_FF(b, c, d, a, x(k + 11), S14, &H895CD7BE)
md5_FF(a, b, c, d, x(k + 12), S11, &H6B901122)
md5_FF(d, a, b, c, x(k + 13), S12, &HFD987193)
md5_FF(c, d, a, b, x(k + 14), S13, &HA679438E)
md5_FF(b, c, d, a, x(k + 15), S14, &H49B40821)
md5_GG(a, b, c, d, x(k + 1), S21, &HF61E2562)
md5_GG(d, a, b, c, x(k + 6), S22, &HC040B340)
md5_GG(c, d, a, b, x(k + 11), S23, &H265E5A51)
md5_GG(b, c, d, a, x(k + 0), S24, &HE9B6C7AA)
md5_GG(a, b, c, d, x(k + 5), S21, &HD62F105D)
md5_GG(d, a, b, c, x(k + 10), S22, &H2441453)
md5_GG(c, d, a, b, x(k + 15), S23, &HD8A1E681)
md5_GG(b, c, d, a, x(k + 4), S24, &HE7D3FBC8)
md5_GG(a, b, c, d, x(k + 9), S21, &H21E1CDE6)
md5_GG(d, a, b, c, x(k + 14), S22, &HC33707D6)
md5_GG(c, d, a, b, x(k + 3), S23, &HF4D50D87)
md5_GG(b, c, d, a, x(k + 8), S24, &H455A14ED)
md5_GG(a, b, c, d, x(k + 13), S21, &HA9E3E905)
md5_GG(d, a, b, c, x(k + 2), S22, &HFCEFA3F8)
md5_GG(c, d, a, b, x(k + 7), S23, &H676F02D9)
md5_GG(b, c, d, a, x(k + 12), S24, &H8D2A4C8A)
md5_HH(a, b, c, d, x(k + 5), S31, &HFFFA3942)
md5_HH(d, a, b, c, x(k + 8), S32, &H8771F681)
md5_HH(c, d, a, b, x(k + 11), S33, &H6D9D6122)
md5_HH(b, c, d, a, x(k + 14), S34, &HFDE5380C)
md5_HH(a, b, c, d, x(k + 1), S31, &HA4BEEA44)
md5_HH(d, a, b, c, x(k + 4), S32, &H4BDECFA9)
md5_HH(c, d, a, b, x(k + 7), S33, &HF6BB4B60)
md5_HH(b, c, d, a, x(k + 10), S34, &HBEBFBC70)
md5_HH(a, b, c, d, x(k + 13), S31, &H289B7EC6)
md5_HH(d, a, b, c, x(k + 0), S32, &HEAA127FA)
md5_HH(c, d, a, b, x(k + 3), S33, &HD4EF3085)
md5_HH(b, c, d, a, x(k + 6), S34, &H4881D05)
md5_HH(a, b, c, d, x(k + 9), S31, &HD9D4D039)
md5_HH(d, a, b, c, x(k + 12), S32, &HE6DB99E5)
md5_HH(c, d, a, b, x(k + 15), S33, &H1FA27CF8)
md5_HH(b, c, d, a, x(k + 2), S34, &HC4AC5665)
md5_II(a, b, c, d, x(k + 0), S41, &HF4292244)
md5_II(d, a, b, c, x(k + 7), S42, &H432AFF97)
md5_II(c, d, a, b, x(k + 14), S43, &HAB9423A7)
md5_II(b, c, d, a, x(k + 5), S44, &HFC93A039)
md5_II(a, b, c, d, x(k + 12), S41, &H655B59C3)
md5_II(d, a, b, c, x(k + 3), S42, &H8F0CCC92)
md5_II(c, d, a, b, x(k + 10), S43, &HFFEFF47D)
md5_II(b, c, d, a, x(k + 1), S44, &H85845DD1)
md5_II(a, b, c, d, x(k + 8), S41, &H6FA87E4F)
md5_II(d, a, b, c, x(k + 15), S42, &HFE2CE6E0)
md5_II(c, d, a, b, x(k + 6), S43, &HA3014314)
md5_II(b, c, d, a, x(k + 13), S44, &H4E0811A1)
md5_II(a, b, c, d, x(k + 4), S41, &HF7537E82)
md5_II(d, a, b, c, x(k + 11), S42, &HBD3AF235)
md5_II(c, d, a, b, x(k + 2), S43, &H2AD7D2BB)
md5_II(b, c, d, a, x(k + 9), S44, &HEB86D391)
Console.WriteLine(a)
a = AddUnsigned(a, AA)
b = AddUnsigned(b, BB)
c = AddUnsigned(c, CC)
d = AddUnsigned(d, DD)
Next
If stype = 32 Then
Encrypt = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
Else
Encrypt = LCase(WordToHex(b) & WordToHex(c))
End If
End Function
End Class
End Namespace
相關推薦
c#、vb.net 實現MD5加密
以下為MD5演算法用c#的實現//MD5.cs//MD5 16-bit,32-bits algorithm implemented in C#using System;using System.Text; namespace Encrypter{ /// <summar
ApolloStudio高手之路(8):用Python呼叫.Net(C#、VB.Net等)開發的動態連結庫(DLL庫檔案)實現相互協作
ApolloStudio是基於.Net與Python雙架構下的實現,這樣的架構體系使得其具有傳統定製軟體無法比擬的超強拓展性,在本文中我們將介紹這兩者是如何在ApolloStudio平臺上實現優勢互補的。由於在ApolloStudio中使用的更易學習的Python作為主導指令碼語言,這裡我們將介
VisualStudio移動開發(C#、VB.NET)Smobiler開發平臺——AlbumView相冊控件的使用方式
vb.net add 使用 [1] 方式 enter 模式 bubuko aso AlbumView控件 一、 樣式一 我們要實現上圖中的效果,需要如下的操作: 從工具欄上的“Smobiler Components”拖動一個AlbumView控件到窗
VS2017移動開發(C#、VB.NET)——Numeric控件的使用方式
默認 EDA 變量 vb.net num days 修改 透明 9.png Visual Studio 2017移動開發 控件介紹和使用方式:Numeric控件 Smobiler開發平臺,.NET移動開發 一、 樣式一 我們要實現上圖中的效果,需要
用VS2017進行移動開發(C#、VB.NET)——OfflineCameraButton控件的屬性、使用方式
send 什麽 ima 你在 nbsp .net for handles 成員變量 OfflineCameraButton控件 一、 樣式一 我們要實現上圖中的效果,需要如下的操作: 從工具欄上的“Smobiler Components”拖動一個Of
asp.net實現MD5加密
在ASP.NET中MD5的加密方式很簡單,程式碼如下: 首先引入名稱空間: using System.Web.Security;程式碼: FormsAuthentication.HashPasswor
.net 實現MD5加密功能
C# winform 實現MD5加密功能 : MD5的全稱是message-digest algorithm 5(資訊-摘要演算法,在90年代初由mit laboratory for computer science和rsa data security inc的r
安全不安全003:C#實現MD5加密演算法
MD5是一種資訊-摘要演算法,一種單向函式演算法(也就是HASH演算法)。將不同輸入長度的資訊進行雜湊計算,得到固定長度的輸出。它的主要特點是,不可逆 和唯一性。即不能由結果計算出輸入值;且不同的輸入值計算得到的固定長度輸出是唯一的。 目前使用的面向物件程式語言中,基本都有類庫實現好的MD5方法
.NET 簡單實現MD5加密函式
一、自定義Md5加密函式 public static string Md5(string str) { MD5 md5 = MD5.Create(); byte[] bufstr = Encoding.GetEncoding("GBK").GetBytes(str); byte[] has
Linux下如何用C實現MD5加密
md5典型應用是對一段資訊(Message)產生資訊摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多軟體在下載的時候都有一個檔名相同,副檔名為.md5的檔案,在這個檔案中通常只有一行文字,大致結構如:MD5 (tanajiya.tar.gz)
C++實現md5加密(相容中文)
說明:由於呼叫了windows api來對中文進行了處理,所以暫僅支援windows #include <iostream> #include <windows.h> using namespace std; typedef unsigned cha
JS 實現MD5加密,以及發現的JS對字元的處理、替換等
在實際開發工作中,用到介面開發,報文采用的是MD5加密方式,自己想做一個html的靜態頁面來實現報文的封裝和加密,在這個過程中就發現了js對雙引號“"”的處理不像看上去那麼簡單了。還有js替換字串的方法。 js實現MD5加密: <body>
C++實現md5加密或計算檔案的唯一性識別
由於網路上傳了很多關於C++實現md5加密的類,至於那個是原創,我不敢妄加猜測,只是這裡我宣告我是轉載的,並支援原創。 對於md5加密演算法,我提供兩檔案: #ifndef MD5_H #define MD5_H #include <string> #i
.NET(C#、VB)APP開發——Smobiler平臺控制元件介紹:SliderView控制元件
SliderView控制元件 一、  
java實現md5加密
comm 代碼 inf 應用領域 ast center href 攻擊 字符串
oracle中實現md5加密
mobile var mob decode null 函數 加密 raw oracl 記得要實現md5加密,在oracle 11g 和 12c中是有不同的方式的,在12c中較為簡單,記得直接有預定義的函數。 但是在11g中要實現就需要自己進行一些額外的處理,以下給出一個m
ASP.NET MVC-MD5加密
有時候需要對資料進行MD5加密,可以採用MD5CryptoServiceProvider類進行加密。以下程式碼參考官方手冊-MD5CryptoServiceProvider。 using System; using System.Security.Cryptography; using Syst
國密SM —— SM3單向雜湊、SM3案例實現、SM4分組密碼標準、Go語言實現SM4加密
func main() { hash := sm3.New() hash.Write([]byte("i am wek $$ The_Reader !")) result := hash.Sum(nil) println("sm3 hash = ",hex.EncodeToStri
qt實現md5加密
#include <QCoreApplication> #include <QCryptographicHash> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplicati
C#或 VB.NET通過 ServiceController 程式碼控制Windows服務安裝解除安裝過程出錯,對windows服務程式檔案佔用,無法釋放資源問題
一、VS報的錯誤 二、程式碼 三、錯誤分析 1.首先,這個錯誤是因為檔案許可權問題引起的,筆者系統為WIN10,VS2017。筆者在給要控制安裝啟動的windows服務程式資料夾新增上“Everyone”許可權後,是可以正常通過程式碼正常控制windows服務的安裝、