vb实现md5加密算法
VB.net的MD5代码
的MD5代码原文:/link?url=VBUqC6fqVp5OB3mhfzlphknuY HwNqtO-VWq0tahehkdWx_ECIWOZCEWw6X0opDTf[vb]view plaincopyprint?1.Imports System2.Imports System.Security.Cryptography3.Imports System.Text4.Module Example5.' 哈希输入字符串并返回一个32字符的十六进制字符串哈希。
6.Function getMd5Hash(ByVal input As String) As String7.' 创建新的一个MD5CryptoServiceProvider对象的实例。
8.Dim md5Hasher As New MD5CryptoServiceProvider()9.' 输入的字符串转换为字节数组,并计算哈希。
10.Dim data As Byte() = puteHash(Encod ing.Default.GetBytes(input))11.' 创建一个新的StringBuilder收集的字节,并创建一个字符串。
12.Dim sBuilder As New StringBuilder()13.' 通过每个字节的哈希数据和格式为十六进制字符串的每一个循环。
14.Dim i As Integer15.For i = 0 To data.Length - 116.sBuilder.Append(data(i).ToString("x2"))17.Next i18.' 返回十六进制字符串。
19.Return sBuilder.ToString()20.End Function21.' 验证对一个字符串的哈希值。
22.Function verifyMd5Hash(ByVal input As String,ByVal h ash As String) As Boolean23.' 哈希的输入。
EXCEL中自建公式,利用VBA对指定字符串进行MD5加密
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub md5_GG(a, b, c, d, X, s, ac)
RShift = (lValue And &H7FFFFFFE) \ m_l2Power(iShiftBits)
If (lValue And &H80000000) Then
RShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1)))
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), X), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub md5_II(a, b, c, d, X, s, ac)
End Function
Private Function AddUnsigned(lX, lY)
Dim lX4
Dim lY4
Dim lX8
Dim lY8
Dim lResult
lX8 = lX And &H80000000
lY8 = lY And &H80000000
ReDim lWordArray(lNumberOfWords - 1)
lBytePosition = 0
MD5算法
MD5算法:第一步:增加填充增加padding使得数据长度(bit为单位)模512为448。
如果数据长度正好是模512为448,增加512个填充bit,也就是说填充的个数为1-512。
第一个bit为1,其余全部为0。
第二步:补足长度将数据长度转换为64bit的数值,如果长度超过64bit所能表示的数据长度的范围,值保留最后64bit,增加到前面填充的数据后面,使得最后的数据为512bit的整数倍。
也就是32bit 的16倍的整数倍。
在RFC1321中,32bit称为一个word。
第三步:初始化变量:用到4个变量,分别为A、B、C、D,均为32bit长。
初始化为:A: 01 23 45 67B: 89 ab cd efC: fe dc ba 98D: 76 54 32 10第四步:数据处理:首先定义4个辅助函数:F(X,Y,Z) = XY v not(X) ZG(X,Y,Z) = XZ v Y not(Z)H(X,Y,Z) = X xor Y xor ZI(X,Y,Z) = Y xor (X v not(Z))其中:XY表示按位与,X v Y表示按位或,not(X)表示按位取反。
xor表示按位异或。
函数中的X、Y、Z均为32bit。
定义一个需要用到的数组:T(i),i取值1-64,T(i)等于abs(sin(i))的4294967296倍的整数部分,i 为弧度。
假设前三步处理后的数据长度为32*16*Nbit第五步:输出:最后得到的ABCD为输出结果,共128bit。
A为低位,D为高位。
MD5在编程中的实现下面来看看如何在C语言和VB中实现MD5算法————————————————————————————————————————————*/#ifndef PROTOTYPES#define PROTOTYPES 0#endiftypedef unsigned char *POINTER;typedef unsigned short int UINT2;typedef unsigned long int UINT4;#if PROTOTYPES#define PROTO_LIST(list) list#else#define PROTO_LIST(list) ()#endif——————————MD5.h————————————————————————————typedef struct {UINT4 state[4];UINT4 count[2];unsigned char buffer[64];} MD5_CTX;void MD5Init PROTO_LIST ((MD5_CTX *));void MD5Update PROTO_LIST((MD5_CTX *, unsigned char *, unsigned int));void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));※※※※※※※※※MD5C.C※※※※※※※※※※※※※※※※※※※※※※※※#include "global.h"#include "md5.h"#define S11 7#define S12 12#define S13 17#define S14 22#define S21 5#define S22 9#define S23 14#define S24 20#define S31 4#define S32 11#define S33 16#define S34 23#define S41 6#define S42 10#define S43 15#define S44 21static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64])); static void Encode PROTO_LIST((unsigned char *, UINT4 *, unsigned int));static void Decode PROTO_LIST((UINT4 *, unsigned char *, unsigned int));static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int)); static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));static unsigned char PADDING[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};/* 定义F G H I 为四个基数#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))#define H(x, y, z) ((x) ^ (y) ^ (z))#define I(x, y, z) ((y) ^ ((x) | (~z)))#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))#define FF(a, b, c, d, x, s, ac) { \(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}#define GG(a, b, c, d, x, s, ac) { \(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}#define HH(a, b, c, d, x, s, ac) { \(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}#define II(a, b, c, d, x, s, ac) { \(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}/*开始进行MD5计算void MD5Init (context)MD5_CTX *context;{context->count[0] = context->count[1] = 0;/* 在这里定义四个常数,也就是我们刚才讲到的四个特征数.context->state[0] = 0x67452301;context->state[1] = 0xefcdab89;context->state[2] = 0x98badcfe;context->state[3] = 0x10325476;}void MD5Update (context, input, inputLen)MD5_CTX *context;unsigned char *input;unsigned int inputLen;{unsigned int i, index, partLen;index = (unsigned int)((context->count[0] >> 3) & 0x3F);if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) context->count[1]++;context->count[1] += ((UINT4)inputLen >> 29);partLen = 64 - index;if (inputLen >= partLen) {MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);MD5Transform (context->state, context->buffer);for (i = partLen; i + 63 < inputLen; i += 64)MD5Transform (context->state, &input[i]);index = 0;}elsei = 0;MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i],inputLen-i);}void MD5Final (digest, context)unsigned char digest[16];MD5_CTX *context;{unsigned char bits[8];unsigned int index, padLen;Encode (bits, context->count, 8);index = (unsigned int)((context->count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index);MD5Update (context, PADDING, padLen);MD5Update (context, bits, 8);Encode (digest, context->state, 16);MD5_memset ((POINTER)context, 0, sizeof (*context));}static void MD5Transform (state, block)UINT4 state[4];unsigned char block[64];{UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; Decode (x, block, 64);/* 第一轮循环*/FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 *//* 第二轮循环*/GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 *//* 第三轮循环*/HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 *//* 第四轮循环*/II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */state[0] += a;state[1] += b;state[2] += c;state[3] += d;MD5_memset ((POINTER)x, 0, sizeof (x));}static void Encode (output, input, len)unsigned char *output;UINT4 *input;unsigned int len;{unsigned int i, j;for (i = 0, j = 0; j < len; i++, j += 4) {output[j] = (unsigned char)(input[i] & 0xff);output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);}}static void Decode (output, input, len)UINT4 *output;unsigned char *input;unsigned int len;{unsigned int i, j;for (i = 0, j = 0; j < len; i++, j += 4)output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);}static void MD5_memcpy (output, input, len) POINTER output;POINTER input;unsigned int len;{unsigned int i;for (i = 0; i < len; i++) output[i] = input[i]; }static void MD5_memset (output, value, len) POINTER output;int value;unsigned int len;{unsigned int i;for (i = 0; i < len; i++)((char *)output)[i] = (char)value;}。
Serv-U与VB文件系统编程在实验教学中的应用
:
最 强 大 、 用 最 简 单 的 F P服 务 器 软 件 之 一 , 是 在 1 使 T 但 3 常 使 用 中 , 果 仅 为 每 次 实 验 创 建 一 个 文 件 夹 , 后 每 如 然 个学 生 将 实 验 结 果 提 交 进 指定 文 件 夹 . 种 管 理 方 式 容 这 易 导致 学 生 互 相 拷 贝 的情 形 出现 , 管 上 传 时 可 以设 定 尽 仅允 许 写入 不 允 许 读 取 的 权 限 。 对 于像 数 字 媒 体 制 作 但 类课 程 需 要 多 次 实 验 课 时 完 成 一 次实 验 的情 况 . 是 不 还 能有 效 控 制 , 为第 二 次 课 有 必要 将 上 次 提 交 的下 载 下 因 来 以便 继 续 制 作 , 样 必 须 开放 读 取 权 限 。 这 为此 , 须 为 必 每个 学生设 置不 同的用 户 帐户 , 果用 手工方 式 在S r— 如 ev U 中同 时设 置大 量 的用 户 帐 号 , 作 量将 十分 巨大 。通 过 工 分 析 S r— 软件 的配 置 文 件 S rU a mo . i ev U ev D e ni ,配 合 读 n 取 每 个 班 级 学 生 的 学 号 姓 名 文 件 ,我 们 可 以 通 过 VB 编 程 来 设 置 其 中的参 数 值 , 而 实 现 批 量 用 户 帐号 的添 从 加 与设 置 , 时 根 据 需 要 实 现 批 量 创 建 用 户 文 件 夹 等 同
完 成 上 述 任 务 ,ev U 是 现 今 Wid ws 最 流 行 、 能 S r— no 下 功
U elxp nl0 sr= u eg 1 1
[ S R x p n l】 U E = u e g1 P sw r as od
VB Md5算法
第一轮
ff(a,b,c,d,m0,7,0xd76aa478)
ff(d,a,b,c,m1,12,0xe8c7b756)
ff(c,d,a,b,m2,17,0x242070db)
ff(b,c,d,a,m3, 22,0xc1bdceee)
md5还广泛用于加密和解密技术上。比如在unix系统中用户的密码就是以md5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成md5值,然后再去和保存在文件系统中的md5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。
md5中有四个32位被称作链接变量(chaining variable)的整数参数,他们分别为:a=0x01234567,b=0x89 abcdef,c=0xfedcba98,d=0x76543210。
当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。
gg(d,a,b,c,m2,9,0xfcefa3f8)
gg(c,d,a,b,m7,14,0x676f02d9)
gg(b,c,d,a,m12,20,0x8d2a4c8a)
第三轮
hh(a,b,c,d,m5,4,0xfffa39变量中:a到a, b到b,c到c,d到d。
主循环有四轮(md4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a 、b、c或d中之一。
用VB编写文件加密程序
用VB编写文件加密程序1.引言在大部分的加密软件,只是针对某种特殊的文件进行处理,并且只是使用简单的加密手段,很容易被解密者破解;有一些高强度的加密软件要求有昂贵硬件设备予以支持,这样加密后的文件很不方便在别的机器上对文件进行解密操作;还有一些加密软件是在利用系统的漏洞进行加密,一旦这些漏洞被修补,极易造成文件的丢失.计算机病毒[1]是指编制或者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或者程序代码.试想可以用计算机病毒的原理,把插入的破坏计算机功能或数据的代码换成具有解密特定数据能力的代码,被注入病毒的文件可以看作是已加密好的数据,重新排列解密代码和被加密数据的位置,只要有执行能力的代码可以引导数据正确的解密,那么这种方法是行的通的.而且被加密的数据看成了一个整体,使用时将加密文件分离,这样就不会有特定文件类型的限制了,再在这个基础上辅以特定的加密算法就可以对文件进行更强的保护了,杜绝了上面所属加密方法的不足.由于是将具有执行能力的文件注入到已加密好的文件中,运行时将它们分离,我们就把这种方法叫做捆绑的方法.利用这种方法就可以对文件进行加密了.2.捆绑捆绑是将几个东西用绳索等帮绑在一起,用在软件中,就是这样的[2]:想实现运行一个文件同时运行其它多个文件,必须要把多个文件"组合"成一个文件,而这一个文件还必须有"分解"的能力,这样才能把捆绑起来的文件分离出来,使之正常运行.而"组合"也可以有多种形式,比如把要捆绑的文件一个一个的加到文件末尾,或者以资源形式组合到一个文件中,还有复杂一点的利用专用的安装打包工具组合(例如安装时捆绑的流氓软件).基于捆绑式的文件加密使用的是第一种组合方式,也称为传统式捆绑机.这里把起捆绑并加密文件作用的程序叫做加密程序,它是一个EXE可执行文件;要加密的文件经加密程序加密后捆绑在事先写好的具有解密能力的解密程序文件尾部,此时的文件称为解密程序,具有解密引导功能的程序称为解密引导程序.解密时,先执行具有解密能力的解密程序,从自身中分离出捆绑的那个需要解密的文件.3.开发环境及需求3.1开发目的如何保护自己的文件不被非授权盗用的问题,始终困扰着每一个人.现在,市面上充斥着各式各样的加密软件,用这些加密软件可以加密你的文件,它通常是将待加密的文件作为纯数据处理,加密后还需一个特定的解密软件来针对这个加密后的文件进行解密,这样做的缺点是显而易见的:解密时需要解密程序存在,不易于在未装有解密程序的平台上解密,通用性差,一旦解密程序丢失,加密后的文件是难以恢复的;大量的加密软件仅仅是针对PE可执行文件的,使得许多的其它文件没法保护;另外还有些软件对数据的加密是利用系统的漏洞,这样对数据是很不全的.这里通过捆绑的方法将解密程序同加密的数据作为一个整体,加密后的文件将生成一个可执行文件,而不是一个单纯的数据乱码,单纯的数据是很难判断自身是否完整,这样就使用户确定文件的完整.当文件使用时,要求您拥有正确的密码,开始使用时能够和使用普通文件一样使用,使用完毕以后该文件依然保持加密状态,下次使用依然需要输入密码,解除了重复加解密的过程.3.2捆绑式加密技术实现语言及需解决的问题开发语言的选取:Visual Basic软件的功能极为强大,深受程序员喜欢.VB的P-code方式编译的程序很难破解,因为我们跟踪用这种方式编译的程序时,看不到程序作者写的程序,只能看到VB的程序,我们只能在微软设计好的VB程序里面兜圈子,但是在兜圈子的过程中,作者的程序已经在执行了,并且由于它的开发速度快,适合于捆绑式文件加密技术的实现.实现捆绑式的文件加密方法,需解决的几个问题:1、如何加入密码检测;2、如何隐藏文件密码;3、对正常用户而言,不应造成使用不便.3.3运行需求正常使用时不应出错,若运行时遇到不可恢复的系统错误,也必须保证数据完好无损,要求系统运行时能够保证正确性、可靠性.4.功能设计4.1设计环境及其配置说明操作系统:WINDOWS XP编程环境:Visual Basic 6.0 for SP64.2软件的运行4.2.1加密程序工作流程见图4.2.1.4.2.2解密程序工作流程见图4.2.2.5. 详细设计5.1 加密程序设计5.1.1 用户界面设计如图5.1.1是加密程序的界面,它采用了现在流行的向导式界面,拥有很强的交互性,只有当用户完成一次与程序的对话,程序才能进行下一次的输入,使得软件的可上手性大大简化.只要按照上面的顺序,当用户输入○1中的文件路径,程序将自动的弹出○2,要求用户输入加密后的文件存放路径,之后将自动弹出○3的框架,要求输入密码,在用户输入密码时,软件系统将自动判断密码的强度,这样可以帮助用户选择合适的密码.下面分析软件的实现:5.1.2 加密过程实现当用户选择好加密的文件和加密后的文件位置之后并输入一致的加密密码就可以进行程序的加密了,当用户点击【加密】按钮后,就会触发以下的事件: 加密文件 输入密码P 生成加密文件确认密码Q P==Q YN用户选择加密文件 图4.2.1加密程序流程图 图4.2.2解密程序流程图 解密文件 运行待加密后文件输入密码R生成解密文件 P==R Y N图5.1.1加密端程序231Private Sub Encode(Name As String, Filter As String, Password As String) '加密模块Open Name For Binary Access Read As #1ReDim p1Array(LOF(1) - 1)MySize1 = LOF(1)Get #1, , p1ArrayClose #1En.Code p1Array, Password '用已有加密算法加密数据Call LoadDataIntoFile(101, Trim(File2)) '处理待加密文件pLength = FileLen(Trim(File2))Open Trim(File2) For Binary Access Write As #1Put #1, pLength, p1ArrayPut #1, pLength + MySize1, " " & "[Password]" & Password & "[FN]" & Filter '将附加信息写到文件末尾Close #1CRC_Exe Trim(File2)MsgBox "加密成功!", vbInformationExit Sub代码5.1.2 加密过程实现以上的代码 5.1.2首先将要加密的文件以二进制的形式读入一个文件大小的p1Array 缓冲中,然后以用户输入的密码作密匙对数组p1Array用事先写好的算法进行数据加密,加密后的数据仍放在数组p1Array中.为了日后解密的方便,将解密引导程序放在p1Array的前面,用捆绑的形式,在我们运行解密程序时,就可以对附在后面的数据文件进行解密了.为了达到跨机运行,就不得不把密码写入加密后的文件中,这里作为演示,为了清楚,以“[Password]”为密码存放开始的标志,将加密后的密码信息放在“[Password]”后面,这样还不够,将来解密文件后,仍要保持文件的类型,将文件的扩展名放在“[FN]”后面,最后将解密引导程序+加密后的文件数据+[Password]+加密后的密码+[FN]+未加密的文件扩展名保存为加密后的文件的尾部.5.1.3密码加密的保存若将密码以明文的形式保存在加密文件中,很容易通过查看加密文件获得密码,那么这样对加密文件是十分危险的,我们就必须对密码进行加密保存.这里用MD5[3][4]对密码进行加密,这样做的好处是它将产生一个固定长度为128位的信息摘要,有利于解密时密码真确与否的判断.5.1.4加密后加密文件完整性的判断加密后的文件很容易被那些破解者通过文件编辑器编辑,修改特定的代码,以达到破解的目的,那么就必须预防这种破解手段,实现软件代码校验,以防止被修改,比如用CRC[5]或者MD5进行自身代码完整性检测.加密程序是加密文件的程序,同时也是一个用于增加CRC特征码的程序,我们将这些特征码写在文件的末尾.Const CRC_HEAD = &H761226 '用于判断是否添加了CRC校验Private Type stCRClHead As Long '验证是否进行CRC校验的标识lCRC As Long 'CRC校验值End Type代码5.1.4文件完整性判断数据结构定义以上定义了一个stCRC的数据类型,用于保存所需的校验标志位和校验码信息,在解密时将判断校验信息,经过这一处理,修改任何一处,解密软件运行后会自动退出,给用户程序没有运行的假象,对于校验信息的判断将在解密引导程序中讨论.5.2解密引导程序设计5.2.1用户界面设计图5.2.1用户端解密程序界面图5.2.1样式是端解密引导程序的界面,由于它的功能是用于判断用户的密码是否正确,所以采用简洁大方的对话框的方式.下面分析软件的实现.5.2.2解密过程实现当用户输入正确的解密密码后,用户选择【运行】和【解包】按钮,都会触发文件解密的事件,以下是关键代码:代码5.2.2的这段代码是让解密程序从自身的程序中分解出经加密后的文件代码,然后把这些代码放入缓冲vbArray中,再对这一缓冲数组进行解密,最后将解密后的数据写入预定的文件.Private Sub Decode_Click(PASSWORD as String )Open cPath & App.EXEName & ".EXE" For Binary Access Read As #1 '打开自身lenght = LOF(1) - MySize - Len(Trim(SF)) – 59'获取有效加密文件的长度ReDim vbArray(lenght - 1)Get #1, MySize, vbArrayClose #1De.Code vbArray, PASSWORD '根据密码解密文件数据Open File1 & "." & SF For Binary Access Write As #1Put #1, , vbArray '将文件写入外存Close #1End Sub代码5.2.2解密过程实现5.2.3文件解密时完整性的判断实现在加密程序的设计中,已经对加密后的文件引入了文件完整性的校验标志,那么解密程序执行时,首先就要判断文件是否完整,否则停止程序运行.Private Sub CRC_Check()strExe = App.Path & "\" & App.EXEName & ".exe"length = FileLen(strExe) - LenB(sCRC) - 1Open strExe For Binary As # hFile '读取加密文件数据到数组Get #hFile, length , sCRCClose #hFileIf sCRC.lHead = CRC_HEAD Then '如果程序添加了CRC验证则验证CRC值If Get_CRC(strExe) <> sCRC.lCRC Then End '验证加密文件CRC和保存的CRC值是否相同ElseEndEnd IfEnd Sub代码5.2.3解密时文件完整性判断代码5.2.3就是用来验证现在的加密文件同保存的校验信息是否一致.5.2.4加密文件的进一步保护[6]通过加密程序加密后的文件,它的加密强度还不是很强.由于解密引导程序同被加密的数据是捆绑在一起的,要保护加密的数据就还要对解密引导程序进行一些安全处理,以防破解者通过跟踪解密引导程序的方法得知解密密码.所以对加密文件的进一步保护就等同于对解密引导程序的保护,以下是我对解密引导程序设计的一些保护方法:1.反调试Anti-Debug检测父进程反RING3调试器,我们知道WIN32系统一般软件的父进程都是EXPLORE,而OllyDbg等RING3调试器对软件进行调试时都是将它们的进程设为它的子进程,我们只要让程序检查父进程是否为EXPLORE.EXE就行,如果发现父进程不是EXPLORE.EXE就自动退出.2.反静态反汇编对加密程序和解密引导程序加壳,增加程序的安全性,就会使静态反汇编程序不能对程序进行汇编,从而保护代码不被泄漏.6.使用说明及测试6.1使用说明该软件能在Windows98以及以上的WINDOWS操作系统平台下运行,由于Windows操作系统使用的广泛性,使得这一方法可以被广泛的使用.它可以对任何你想加密的文件(*.txt)、图像文件(*.jpg,*.gif,*.bmp)、音乐文件、可执行文件等几乎一切的文件进行加密,这就是说你可以用它对各种文件进行加密,文本文件该软件使你要加密的文件最终生成一个可执行文件,当文件使用时,要求您输入正确的密码,文件使用时和使用普通文件一样使用该文件,使用完毕以后该文件依然保持加密状态,下次使用依然需要输入密码,该软件解除了需要重复加解密的过程.软件充分考虑了用户的操作,通过简单几步的界面选择便可以达到加密文件的目的.加密程序EnCode用于加密目标文件.解密引导程序DeCode用于与被加密文件的捆绑,并实现文件的解密过程、解密后与系统关联文件运行的实现.6.2测试分析及效果1.用加密程序EnCode加密WINDOWS自带的记事本Notepad.exe后的生成的文件记为NotepadJM.exe,运行加密后的文件并输入正确的密码可以成功的解密,并运行程序,软件基本功能实现.2.用用Ultra Edit打开NotepadJM.exe文件,任意修改一个字节,然后运行该程序,一旦运行程序退出,程序的完整性检查成功.3.用目前流行的OllyDBG动态调试工具加载并运行NotepadJM.exe,调试器运行并时EIP指针转到结束代码,使得无法跟踪软件的解密过程,程序的反动态调试成功.6.3对该软件的展望希望以后可以用其它的方法进一步对加密文件进行保护,使得用捆绑方法加密文件变的更加安全,实现的功能也变的更加强大.7.结束语7.1总结通过对病毒工作原理、捆绑文件方法及密码学的学习,通过软件保护方法的学习,经过自己的努力独立的写成了这个小程序,它用文件捆绑的方法来对文件进行加密保护,加密强度很高,破解难度也很高,在有些方面甚至比一些商业加密软件还要出色,受到了广大网友的好评.使用捆绑的方法不仅可以实现文件的加密解密,还因该可以实现其它的功能,这就需要我的进一步的学习了.7.2致谢本文是在刘军老师的精心指导下完成的.从论文的选题、文章结构的构筑到最后的定稿,都得到了刘老师的细心指点和提携,克服了多个技术上难以逾越的障碍.刘老师严谨的治学作风让我受益匪浅.在此仅向刘老师致以最诚挚的谢意.同时也向关心并支持我的家人、同学和热心的网友致以最衷心的感谢.(指导教师:刘军)参考文献[1]Billy Belceb. Billy Belceb病毒编写教程(DOS篇)---一些重要的理论[EB]. http://w/bbshtml/BBS6/pediy64063.htm[2]WAKU.轩辕EXE捆绑机[EB]./showthread.php?threadid=27366,2006-06-14.[3][美] Bruce Schneier. 吴世忠祝世雄张文政等译 . 应用密码学 [M]. 北京:机械工业出版社,2000 年1月第1版.[4][美]A MD5 Class[CP]./vb/scripts/ShowCode.asp?txtCodeId=65445&lngWId=1. 2006-5-22.[5][美]Fast File CRC-Checksum Tagging[CP]./vb/scripts/ShowCode.asp?txtCodeId=21434&lngWId=1.2001-3-1.[6]段刚. 加密与解密[M]. 北京:电子工业出版社,2003 年6月第2版.[7]武新华.撩开软件保护的面纱[M]. 呼和浩特:内蒙古大学出版社,2003年9月第1版.[8]李庭文. 专家门诊——VisualBasic开发答疑[M]. 北京:人民邮电出版社,2003年6月第1版.[9]CSDN, DFCG. 软件加密技术内幕[J].网络资源出版社.[10][美]William Stamatakis. Microsoft Visual Basic Design Patterns[M].Redmond:Microsoft Press, 2000.[11][美]The Mandelbrot Set (International) Limited. Advanced Microsoft Visual Basic6.0[M].Redmond:Microsoft Press, 1998.。
MD5加密算法(java及js)
MD5加密算法(java及js)为了防⽌⽤户登陆过程中信息被拦截导致信息泄露,我们应该在客户端就对⽤户密码进⾏加密。
浏览器提交给服务器的是加密后的信息,即使被恶意拦截,被拦截信息也已做了加密处理,现在⽐较安全的⼀种加密算法是MD5加密算法,尽管MD5是⼀种单向的加密算法,但⽹上也有破解⽹站,所以为了进⼀步提⾼安全性,可以进⾏两次md5加密,或者结合其他的加密⽅法如3des等进⾏⼆次加密。
代码如下:js版:var hexcase = 0;function hex_md5(a) {if (a == "")return a;return rstr2hex(rstr_md5(str2rstr_utf8(a)))}function hex_hmac_md5(a, b) {return rstr2hex(rstr_hmac_md5(str2rstr_utf8(a), str2rstr_utf8(b)))}function md5_vm_test() {return hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72"}function rstr_md5(a) {return binl2rstr(binl_md5(rstr2binl(a), a.length * 8))}function rstr_hmac_md5(c, f) {var e = rstr2binl(c);if (e.length > 16) {e = binl_md5(e, c.length * 8)}var a = Array(16), d = Array(16);for ( var b = 0; b < 16; b++) {a[b] = e[b] ^ 909522486;d[b] = e[b] ^ 1549556828}var g = binl_md5(a.concat(rstr2binl(f)), 512 + f.length * 8);return binl2rstr(binl_md5(d.concat(g), 512 + 128))}function rstr2hex(c) {try {hexcase} catch (g) {hexcase = 0}var f = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";var b = "";var a;for ( var d = 0; d < c.length; d++) {a = c.charCodeAt(d);b += f.charAt((a >>> 4) & 15) + f.charAt(a & 15)}return b}function str2rstr_utf8(c) {var b = "";var d = -1;var a, e;while (++d < c.length) {a = c.charCodeAt(d);e = d + 1 < c.length ? c.charCodeAt(d + 1) : 0;if (55296 <= a && a <= 56319 && 56320 <= e && e <= 57343) {a = 65536 + ((a & 1023) << 10) + (e & 1023);d++}if (a <= 127) {b += String.fromCharCode(a)} else {if (a <= 2047) {b += String.fromCharCode(192 | ((a >>> 6) & 31), 128 | (a & 63))} else {if (a <= 65535) {b += String.fromCharCode(224 | ((a >>> 12) & 15),128 | ((a >>> 6) & 63), 128 | (a & 63))} else {if (a <= 2097151) {b += String.fromCharCode(240 | ((a >>> 18) & 7),128 | ((a >>> 12) & 63),128 | ((a >>> 6) & 63), 128 | (a & 63))}}}}}return b}function rstr2binl(b) {var a = Array(b.length >> 2);for ( var c = 0; c < a.length; c++) {a[c] = 0}for ( var c = 0; c < b.length * 8; c += 8) {a[c >> 5] |= (b.charCodeAt(c / 8) & 255) << (c % 32)}return a}function binl2rstr(b) {var a = "";for ( var c = 0; c < b.length * 32; c += 8) {a += String.fromCharCode((b[c >> 5] >>> (c % 32)) & 255) }return a}function binl_md5(p, k) {p[k >> 5] |= 128 << ((k) % 32);p[(((k + 64) >>> 9) << 4) + 14] = k;var o = 1732584193;var n = -271733879;var m = -1732584194;var l = 271733878;for ( var g = 0; g < p.length; g += 16) {var j = o;var h = n;var f = m;var e = l;o = md5_ff(o, n, m, l, p[g + 0], 7, -680876936);l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586);m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819);n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330);o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897);l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426);m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341);n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983);o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416);l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417);m = md5_ff(m, l, o, n, p[g + 10], 17, -42063);n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162);o = md5_ff(o, n, m, l, p[g + 12], 7, 1804603682);l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101);m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290);n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329);o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510);l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632);m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713);n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302);o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691);l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083);m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335);n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848);o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438);l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690);m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961);n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501);o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467);l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784);m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473);n = md5_gg(n, m, l, o, p[g + 12], 20, -1926607734);o = md5_hh(o, n, m, l, p[g + 5], 4, -378558);l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463);m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562);n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556);o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060);l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353);m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632);n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640);o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174);l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222);m = md5_hh(m, l, o, n, p[g + 3], 16, -722521979);n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189);o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487);l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835);m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520);n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651);o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844);l = md5_ii(l, o, n, m, p[g + 7], 10, 1126891415);m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905);n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055);o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571);l = md5_ii(l, o, n, m, p[g + 3], 10, -1894986606);m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523);n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799);o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359);l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744);m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380);n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649);o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070);l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379);m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259);n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551);o = safe_add(o, j);n = safe_add(n, h);m = safe_add(m, f);l = safe_add(l, e)}return Array(o, n, m, l)}function md5_cmn(h, e, d, c, g, f) {return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d)}function md5_ff(g, f, k, j, e, i, h) {return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h)}function md5_gg(g, f, k, j, e, i, h) {return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h)}function md5_hh(g, f, k, j, e, i, h) {return md5_cmn(f ^ k ^ j, g, f, e, i, h)}function md5_ii(g, f, k, j, e, i, h) {return md5_cmn(k ^ (f | (~j)), g, f, e, i, h)}function safe_add(a, d) {var c = (a & 65535) + (d & 65535);var b = (a >> 16) + (d >> 16) + (c >> 16);return (b << 16) | (c & 65535)}function bit_rol(a, b) {return (a << b) | (a >>> (32 - b))};java版(代码来源:/computer-lzy/archive/2011/04/28/2031649.html):package md5;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/** MD5 加密算法*/public class MD5 {// 全局数组private final static String[] strDigits = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };public MD5() {}// 返回形式为数字跟字符串private static String byteToArrayString(byte bByte) {int iRet = bByte;// System.out.println("iRet="+iRet);if (iRet < 0) {iRet += 256;}int iD1 = iRet / 16;int iD2 = iRet % 16;return strDigits[iD1] + strDigits[iD2];}// 返回形式只为数字private static String byteToNum(byte bByte) {int iRet = bByte;System.out.println("iRet1=" + iRet);if (iRet < 0) {iRet += 256;}return String.valueOf(iRet);}// 转换字节数组为16进制字串private static String byteToString(byte[] bByte) {StringBuffer sBuffer = new StringBuffer();for (int i = 0; i < bByte.length; i++) {sBuffer.append(byteToArrayString(bByte[i]));}return sBuffer.toString();}public static String GetMD5Code(String strObj) {String resultString = null;try {resultString = new String(strObj);MessageDigest md = MessageDigest.getInstance("MD5");// md.digest() 该函数返回值为存放哈希值结果的byte数组resultString = byteToString(md.digest(strObj.getBytes()));} catch (NoSuchAlgorithmException ex) {ex.printStackTrace();}return resultString;}public static void main(String[] args) {MD5 getMD5 = new MD5();System.out.println(getMD5.GetMD5Code(getMD5.GetMD5Code("aaaaaa"))); }}版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。
MD5加密算法简介
MD5加密算法简介一、算法实现(转载自绿色兵团)1、MD5算法是对输入的数据进行补位,使得如果数据位长度LEN对512求余的结果是448。
即数据扩展至K*512+448位。
即K*64+56个字节,K为整数。
具体补位操作:补一个1,然后补0至满足上述要求2、补数据长度:用一个64位的数字表示数据的原始长度B,把B用两个32位数表示。
这时,数据就被填补成长度为512位的倍数。
3. 初始化MD5参数四个32位整数(A,B,C,D) 用来计算信息摘要,初始化使用的是十六进制表示的数字A=0X01234567B=0X89abcdefC=0Xfedcba98D=0X765432104、处理位操作函数X,Y,Z为32位整数。
F(X,Y,Z) = X&Y|NOT(X)&ZG(X,Y,Z) = X&Z|Y¬(Z)H(X,Y,Z) = X xor Y xor ZI(X,Y,Z) = Y xor (X|not(Z))5、主要变换过程:使用常数组T[1 ... 64],T为32位整数用16进制表示,数据用16个32位的整数数组M[]表示。
具体过程如下:/* 处理数据原文*/For i = 0 to N/16-1 do/*每一次,把数据原文存放在16个元素的数组X中. */For j = 0 to 15 doSet X[j] to M[i*16+j].end /结束对J的循环/* Save A as AA, B as BB, C as CC, and D as DD. */AA = ABB = BCC = CDD = D/* 第1轮*//* 以[abcd k s i]表示如下操作a =b + ((a + F(b,c,d) + X[k] + T) <<< s). *//* Do the following 16 operations. */[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4][ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8] [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12] [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16] /* 第2轮* *//* 以[abcd k s i]表示如下操作a =b + ((a + G(b,c,d) + X[k] + T) <<< s). *//* Do the following 16 operations. */[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20] [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24] [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28] [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]/* 第3轮*//* 以[abcd k s i]表示如下操作a =b + ((a + H(b,c,d) + X[k] + T) <<< s). *//* Do the following 16 operations. */[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36] [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40] [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44] [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48] /* 第4轮*//* 以[abcd k s i]表示如下操作a =b + ((a + I(b,c,d) + X[k] + T) <<< s). *//* Do the following 16 operations. */[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52] [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56] [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60] [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]/* 然后进行如下操作*/A = A + AAB = B + BBC = C + CCD = D + DDend /* 结束对I的循环*/6、输出结果。
字符串的MD5加密实现
字符串的MD5加密实现一、制作如下界面:二、编写代码:Imports System.Web.Security '加密所需类库Imports System.Data.SqlClientImports System.Data.OleDbImports System.DataPublic Class WebForm1Inherits System.Web.UI.Page#Region " Web 窗体设计器生成的代码 "'该调用是 Web 窗体设计器所必需的。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() Me.OleDbConnection1 = New System.Data.OleDb.OleDbConnection''OleDbConnection1'Me.OleDbConnection1.ConnectionString = "Provider=Microsoft Jet OLEDB 4.0;Data Source=dbs.mdb"End SubProtected WithEvents Label2 As belProtected WithEvents Button1 As System.Web.UI.WebControls.ButtonProtected WithEvents Label1 As belProtected WithEvents TBName As System.Web.UI.WebControls.TextBoxProtected WithEvents TBPwd As System.Web.UI.WebControls.TextBoxProtected WithEvents Result As belProtected WithEvents OleDbConnection1 As System.Data.OleDb.OleDbConnection'注意: 以下占位符声明是 Web 窗体设计器所必需的。
JS实现MD5加密
JS实现MD5加密⼤家好,我是梦⾟⼯作室的灵,最近在写⼀个调试助⼿所需要实现MD5加密,就各处找了MD5 js加密的⽅法,然后现在封装好了给⼤家,⽅便以后使⽤function md5(string){function md5_RotateLeft(lValue, iShiftBits){return(lValue << iShiftBits)|(lValue >>>(32- iShiftBits));}function md5_AddUnsigned(lX, lY){var lX4, lY4, lX8, lY8, lResult;lX8 =(lX &0x80000000);lY8 =(lY &0x80000000);lX4 =(lX &0x40000000);lY4 =(lY &0x40000000);lResult =(lX &0x3FFFFFFF)+(lY &0x3FFFFFFF);if(lX4 & lY4){return(lResult ^0x80000000^ lX8 ^ lY8);}if(lX4 | lY4){if(lResult &0x40000000){return(lResult ^0xC0000000^ lX8 ^ lY8);}else{return(lResult ^0x40000000^ lX8 ^ lY8);}}else{return(lResult ^ lX8 ^ lY8);}}function md5_F(x, y, z){return(x & y)|((~x)& z);}function md5_G(x, y, z){return(x & z)|(y &(~z));}function md5_H(x, y, z){return(x ^ y ^ z);}function md5_I(x, y, z){return(y ^(x |(~z)));}function md5_FF(a, b, c, d, x, s, ac){a =md5_AddUnsigned(a,md5_AddUnsigned(md5_AddUnsigned(md5_F(b, c, d), x), ac));return md5_AddUnsigned(md5_RotateLeft(a, s), b);};function md5_GG(a, b, c, d, x, s, ac){a =md5_AddUnsigned(a,md5_AddUnsigned(md5_AddUnsigned(md5_G(b, c, d), x), ac));return md5_AddUnsigned(md5_RotateLeft(a, s), b);};function md5_HH(a, b, c, d, x, s, ac){a =md5_AddUnsigned(a,md5_AddUnsigned(md5_AddUnsigned(md5_H(b, c, d), x), ac));return md5_AddUnsigned(md5_RotateLeft(a, s), b);};function md5_II(a, b, c, d, x, s, ac){a =md5_AddUnsigned(a,md5_AddUnsigned(md5_AddUnsigned(md5_I(b, c, d), x), ac));return md5_AddUnsigned(md5_RotateLeft(a, s), b);};function md5_ConvertToWordArray(string){var lWordCount;var lMessageLength = string.length;var lNumberOfWords_temp1 = lMessageLength +8;var lNumberOfWords_temp2 =(lNumberOfWords_temp1 -(lNumberOfWords_temp1 %64))/64;var lNumberOfWords =(lNumberOfWords_temp2 +1)*16;var lWordArray =Array(lNumberOfWords -1);var lBytePosition =0;var lByteCount =0;while(lByteCount < lMessageLength){lWordCount =(lByteCount -(lByteCount %4))/4;lBytePosition =(lByteCount %4)*8;lWordArray[lWordCount]=(lWordArray[lWordCount]|(string.charCodeAt(lByteCount)<< lBytePosition));lByteCount++;}lWordCount =(lByteCount -(lByteCount %4))/4;lBytePosition =(lByteCount %4)*8;lWordArray[lWordCount]= lWordArray[lWordCount]|(0x80<< lBytePosition);lWordArray[lNumberOfWords -2]= lMessageLength <<3;lWordArray[lNumberOfWords -1]= lMessageLength >>>29;return lWordArray;};function md5_WordToHex(lValue){var WordToHexValue ="", WordToHexValue_temp ="", lByte, lCount;for(lCount =0; lCount <=3; lCount++){lByte =(lValue >>>(lCount *8))&255;WordToHexValue_temp ="0"+ lByte.toString(16);WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length -2,2);}return WordToHexValue;};function md5_Utf8Encode(string){string = string.replace(/\r\n/g,"\n");var utftext ="";for(var n =0; n < string.length; n++){var c = string.charCodeAt(n);if(c <128){utftext += String.fromCharCode(c);}else if((c >127)&&(c <2048)){utftext += String.fromCharCode((c >>6)|192);utftext += String.fromCharCode((c &63)|128);}else{utftext += String.fromCharCode((c >>12)|224);utftext += String.fromCharCode(((c >>6)&63)|128);utftext += String.fromCharCode((c &63)|128);}}return utftext;};var x =Array();var k, AA, BB, CC, DD, a, b, c, d;var S11 =7, S12 =12, S13 =17, S14 =22;var S21 =5, S22 =9, S23 =14, S24 =20;var S31 =4, S32 =11, S33 =16, S34 =23;var S41 =6, S42 =10, S43 =15, S44 =21;string =md5_Utf8Encode(string);x =md5_ConvertToWordArray(string);a =0x67452301;b =0xEFCDAB89;c =0x98BADCFE;c =0x98BADCFE;d =0x10325476;for(k =0; k < x.length; k +=16){AA = a;BB = b;CC = c;DD = d;a =md5_FF(a, b, c, d, x[k +0], S11,0xD76AA478);d =md5_FF(d, a, b, c, x[k +1], S12,0xE8C7B756);c =md5_FF(c, d, a, b, x[k +2], S13,0x242070DB);b =md5_FF(b, c, d, a, x[k +3], S14,0xC1BDCEEE);a =md5_FF(a, b, c, d, x[k +4], S11,0xF57C0FAF);d =md5_FF(d, a, b, c, x[k +5], S12,0x4787C62A);c =md5_FF(c, d, a, b, x[k +6], S13,0xA8304613); b =md5_FF(b, c, d, a, x[k +7], S14,0xFD469501);a =md5_FF(a, b, c, d, x[k +8], S11,0x698098D8);d =md5_FF(d, a, b, c, x[k +9], S12,0x8B44F7AF);c =md5_FF(c, d, a, b, x[k +10], S13,0xFFFF5BB1);b =md5_FF(b, c, d, a, x[k +11], S14,0x895CD7BE);a =md5_FF(a, b, c, d, x[k +12], S11,0x6B901122);d =md5_FF(d, a, b, c, x[k +13], S12,0xFD987193);c =md5_FF(c, d, a, b, x[k +14], S13,0xA679438E);b =md5_FF(b, c, d, a, x[k +15], S14,0x49B40821);a =md5_GG(a, b, c, d, x[k +1], S21,0xF61E2562);d =md5_GG(d, a, b, c, x[k +6], S22,0xC040B340);c =md5_GG(c, d, a, b, x[k +11], S23,0x265E5A51);b =md5_GG(b, c, d, a, x[k +0], S24,0xE9B6C7AA);a =md5_GG(a, b, c, d, x[k +5], S21,0xD62F105D);d =md5_GG(d, a, b, c, x[k +10], S22,0x2441453);c =md5_GG(c, d, a, b, x[k +15], S23,0xD8A1E681);b =md5_GG(b, c, d, a, x[k +4], S24,0xE7D3FBC8);a =md5_GG(a, b, c, d, x[k +9], S21,0x21E1CDE6);d =md5_GG(d, a, b, c, x[k +14], S22,0xC33707D6);c =md5_GG(c, d, a, b, x[k +3], S23,0xF4D50D87);b =md5_GG(b, c, d, a, x[k +8], S24,0x455A14ED);a =md5_GG(a, b, c, d, x[k +13], S21,0xA9E3E905);d =md5_GG(d, a, b, c, x[k +2], S22,0xFCEFA3F8);c =md5_GG(c, d, a, b, x[k +7], S23,0x676F02D9);b =md5_GG(b, c, d, a, x[k +12], S24,0x8D2A4C8A);a =md5_HH(a, b, c, d, x[k +5], S31,0xFFFA3942);d =md5_HH(d, a, b, c, x[k +8], S32,0x8771F681);c =md5_HH(c, d, a, b, x[k +11], S33,0x6D9D6122);b =md5_HH(b, c, d, a, x[k +14], S34,0xFDE5380C);a =md5_HH(a, b, c, d, x[k +1], S31,0xA4BEEA44);d =md5_HH(d, a, b, c, x[k +4], S32,0x4BDECFA9);c =md5_HH(c, d, a, b, x[k +7], S33,0xF6BB4B60);b =md5_HH(b, c, d, a, x[k +10], S34,0xBEBFBC70);a =md5_HH(a, b, c, d, x[k +13], S31,0x289B7EC6);d =md5_HH(d, a, b, c, x[k +0], S32,0xEAA127FA);c =md5_HH(c, d, a, b, x[k +3], S33,0xD4EF3085);b =md5_HH(b, c, d, a, x[k +6], S34,0x4881D05);a =md5_HH(a, b, c, d, x[k +9], S31,0xD9D4D039);d =md5_HH(d, a, b, c, x[k +12], S32,0xE6DB99E5);c =md5_HH(c, d, a, b, x[k +15], S33,0x1FA27CF8);b =md5_HH(b, c, d, a, x[k +2], S34,0xC4AC5665);a =md5_II(a, b, c, d, x[k +0], S41,0xF4292244);d =md5_II(d, a, b, c, x[k +7], S42,0x432AFF97);c =md5_II(c, d, a, b, x[k +14], S43,0xAB9423A7); b =md5_II(b, c, d, a, x[k +5], S44,0xFC93A039);a =md5_II(a, b, c, d, x[k +12], S41,0x655B59C3);d =md5_II(d, a, b, c, x[k +3], S42,0x8F0CCC92);c =md5_II(c, d, a, b, x[k +10], S43,0xFFEFF47D);b =md5_II(b, c, d, a, x[k +1], S44,0x85845DD1);a =md5_II(a, b, c, d, x[k +8], S41,0x6FA87E4F);d =md5_II(d, a, b, c, x[k +15], S42,0xFE2CE6E0);c =md5_II(c, d, a, b, x[k +6], S43,0xA3014314);c =md5_II(c, d, a, b, x[k +6], S43,0xA3014314);b =md5_II(b, c, d, a, x[k +13], S44,0x4E0811A1);a =md5_II(a, b, c, d, x[k +4], S41,0xF7537E82);d =md5_II(d, a, b, c, x[k +11], S42,0xBD3AF235);c =md5_II(c, d, a, b, x[k +2], S43,0x2AD7D2BB);b =md5_II(b, c, d, a, x[k +9], S44,0xEB86D391);a =md5_AddUnsigned(a, AA);b =md5_AddUnsigned(b, BB);c =md5_AddUnsigned(c, CC);d =md5_AddUnsigned(d, DD);}return(md5_WordToHex(a)+md5_WordToHex(b)+md5_WordToHex(c)+md5_WordToHex(d)).toLowerCase(); }module.exports ={md5,}调⽤⽅法如下:var md5util=require("../../utils/md5util.js");//写⽂件路径即可md5util.md5("value");//放需要加密的内容。
三类加密算法VB.NET的实现
三类加密算法的实现研究SSO的副产品,在寻找好的加密算法在中常用的有:不可逆的HASH算法,如MD5,SHA1,对称可逆的DES,不对称可逆的RSA等.我最终选择的是对称可拟的AES算法的衍生算法:Rijndael,因为它加密后的长度比较小,适合在URL中携带,而原本考虑的RSA算法生成128位长度的字串,显得未免太长了,呼呼以下代码综合了网上各类文章并做了部分整合修改.需要的人可以使用.至于MD5,SHA1,BASE64之类的在.NET里一条语句就搞定.呼呼------------------Rijndael算法:密钥KEY和起始量IV都通过专门的函数生成.如果是要做成可调用的函数,可修改EncryptString128Bit,DecryptString128Bit Imports System.Security.CryptographyImports System.IOImports System.TextPublic Class Form1Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadEnd SubPrivate Function CreateKey(ByVal strPassword As String) As Byte()Dim chrData() As Char = strPassword.ToCharArrayDim intLength As Integer = chrData.GetUpperBound(0) Dim bytDataT oHash(intLength) As ByteFor i As Integer = 0 To chrData.GetUpperBound(0)bytDataToHash(i) = CByte(Asc(chrData(i)))NextDim SHA512 As NewSystem.Security.Cryptography.SHA512Managed Dim bytResult As Byte() = puteHash(bytDataToHash)Dim bytKey(31) As ByteFor i As Integer = 0 To 31bytKey(i) = bytResult(i)NextReturn bytKeyEnd FunctionPrivate Function CreateIV(ByVal strPassword As String) As Byte()Dim chrData() As Char = strPassword.ToCharArrayDim intLength As Integer = chrData.GetUpperBound(0) Dim bytDataT oHash(intLength) As ByteFor i As Integer = 0 To chrData.GetUpperBound(0)bytDataToHash(i) = CByte(Asc(chrData(i)))NextDim SHA512 As New System.Security.Cryptography.SHA512Managed Dim bytResult As Byte() = puteHash(bytDataToHash)Dim bytIV(15) As ByteFor i As Integer = 32 To 47bytIV(i - 32) = bytResult(i)NextReturn bytIVEnd FunctionPublic Function EncryptString128Bit(ByVal vstrTextToBeEncrypted As String, ByVal vstrEncryptionKey AsByte(), ByVal vstrEncryptionVI As Byte()) As StringDim bytValue() As ByteDim bytEncoded() As ByteDim objMemoryStream As New MemoryStream()Dim objCryptoStream As CryptoStreamDim objRijndaelManaged As RijndaelManagedvstrTextToBeEncrypted = StripNullCharacters(vstrTextToBeEncrypted)bytValue = Encoding.ASCII.GetBytes(vstrTextT oBeEncrypted.ToCharArray) objRijndaelManaged = New RijndaelManaged()TryobjCryptoStream = New CryptoStream(objMemoryStream, _ objRijndaelManaged.CreateEncryptor(vstrEncryptionKey, vstrEncryptionVI), CryptoStreamMode.Write)objCryptoStream.Write(bytValue, 0, bytValue.Length)objCryptoStream.FlushFinalBlock()bytEncoded = objMemoryStream.T oArrayobjMemoryStream.Close()objCryptoStream.Close()CatchEnd TryReturn Convert.ToBase64String(bytEncoded)End FunctionPublic Function DecryptString128Bit(ByVal vstrStringToBeDecrypted As String, _ByVal vstrDecryptionKey As Byte(), ByVal vstrDecryptionVI As Byte()) As StringDim bytDataT oBeDecrypted() As ByteDim bytTemp() As ByteDim objRijndaelManaged As New RijndaelManaged()Dim objMemoryStream As MemoryStreamDim objCryptoStream As CryptoStreamDim strReturnString As String = String.EmptybytDataToBeDecrypted = Convert.FromBase64String(vstrStringToBeDecrypted) ReDim bytTemp(bytDataToBeDecrypted.Length)objMemoryStream = New MemoryStream(bytDataToBeDecrypted)TryobjCryptoStream = New CryptoStream(objMemoryStream, _ objRijndaelManaged.CreateDecryptor(vstrDecryptionKey, vstrDecryptionVI), CryptoStreamMode.Read)objCryptoStream.Read(bytTemp, 0, bytTemp.Length)objCryptoStream.FlushFinalBlock()objMemoryStream.Close()objCryptoStream.Close()CatchEnd TryReturnStripNullCharacters(Encoding.ASCII.GetString(bytTemp)) End FunctionPublic Function StripNullCharacters(ByVal vstrStringWithNulls As String) As StringDim intPosition As IntegerDim strStringWithOutNulls As StringintPosition = 1strStringWithOutNulls = vstrStringWithNullsDo While intPosition > 0intPosition = InStr(intPosition, vstrStringWithNulls,vbNullChar)If intPosition > 0 ThenstrStringWithOutNulls = Microsoft.VisualBasic.Left$(strStringWithOutNulls, intPosition - 1) & _Microsoft.VisualBasic.Right$(strStringWithOutNulls,Len(strStringWithOutNulls) - intPosition)End IfIf intPosition > strStringWithOutNulls.Length ThenExit DoEnd IfLoopReturn strStringWithOutNullsEnd FunctionPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickRESULTTB.Text = EncryptString128Bit(ORGTB.Text, CreateKey(keyTB.T ext), CreateIV(VITB.Text))DesTB.Text = DecryptString128Bit(RESULTTB.Text, CreateKey(keyTB.T ext), CreateIV(VITB.Text))End SubEnd Class----------------RSA算法:Imports System.TextImports System.Security.CryptographyPublic Class Form1Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadDim rsa1 As RSACryptoServiceProvider = NewRSACryptoServiceProviderDim rsa2 As RSACryptoServiceProvider = New RSACryptoServiceProviderDim publickey, privatekey As Stringpublickey = rsa1.ToXmlString(False)privatekey = rsa1.T oXmlString(True)TextBox1.Text = publickeyTextBox2.Text = privatekeyDim plaintext As Stringplaintext = "天幻网" & vbCrLf & "12345678" & vbCrLf & "211.95.72.224"TextBox3.Text &= "原始数据是:" & Microsoft.VisualBasic.Chr(10) & plaintextrsa2.FromXmlString(privatekey)Dim cipherbytes As Byte()cipherbytes = rsa2.Encrypt(Encoding.UTF8.GetBytes(plaintext), False) TextBox3.Text &= "加密后的数据是(" & cipherbytes.Length.ToString & "):"Dim i As Integer = 0While i < cipherbytes.LengthTextBox3.Text &= String.Format("{0:X2} ", cipherbytes(i))System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)End WhileDim plaintbytes As Byte()plaintbytes = rsa1.Decrypt(cipherbytes, False)TextBox3.Text &= "解密后的数据是:"TextBox3.Text &= Encoding.UTF8.GetString(plaintbytes)End SubEnd Class-----------------------DES算法:Imports System.Data.SqlClientImports System.SecurityImports System.Security.CryptographyImports System.TextPublic Class Form1Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadDim key, Str As Stringkey = TextBox1.TextStr = TextBox3.TextTextBox2.Text = Encrypt(Str, key)End Sub'DES加密方法Public Shared Function Encrypt(ByVal pToEncrypt As String, ByVal sKey As String) As StringDim des As New DESCryptoServiceProvider()Dim inputByteArray() As ByteinputByteArray = Encoding.Default.GetBytes(pT oEncrypt)'建立加密对象的密钥和偏移量'原文使用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 ByteFor Each b In ms.T oArray()ret.AppendFormat("{0:X2}", b)NextReturn ret.ToString()End Function'DES解密方法Public Shared Function Decrypt(ByVal pToDecrypt As String, ByVal sKey As String) As StringDim des As New DESCryptoServiceProvider()'把字符串放入byte数组Dim len As Integerlen = pT oDecrypt.Length / 2 - 1Dim inputByteArray(len) As ByteDim x, i As IntegerFor x = 0 To leni = Convert.T oInt32(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 FunctionEnd Class。
PHP里MD5加密的16位和32位实现代码
PHP里MD5加密的16位和32位实现代码,在网上一搜也有不少人有这方面的困惑,后来找到一个解决办法,是正确的,就记录下来复制代码代码如下:<?phpecho substr(md5("admin"),8,16); // 16位MD5加密echo "<hr>";echo md5("admin"); // 32位MD5加密?>16位的MD5加密用substr函数截取了字符得到实现....今天做了个php链接mssql数据库,数据库中的表中字段使用MD5十六加密的。
但是php 中的MD5默认是32位,导致登录程序没办法使用md5加密跟表中字段匹配,在网上一搜也有不少人有这方面的困惑,后来找到一个解决办法,是正确的,就记录下来。
使用substr函数截取:substr(md5("admin"),8,16); // 16位MD5加密md5("admin"); // 32位MD5加密经过脚本之家测试结果如下:我们以asp的几个md5后的结果比较附:如果遇到MD5加密文件,而又不知道的密码的,请在数据库中换上这组加密的数据。
admin---16位加密---7a57a5a743894a0eadmin---32位加密---21232f297a57a5a743894a0e4a801fc3admin---40位加密---7a57a5a743894a0e4a801fc343894a0e4a801fc3substr(md5("admin"),8,16); // 16位MD5加密正是上面的32为从第8个字符开始的16个字符。
所以大家不用考虑唯一性的问题。
本身就是正确的。
网上有人说php5支持复制代码代码如下:echo md5("admin",true);//返回16位,不过这是在PHP5里才有。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
If iShiftBits = 0 Then
LShift = lValue
Exit Function
ElseIf hiftBits = 31 Then
If lValue And 1 Then
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub md5_GG(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub md5_HH(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))
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
End If
Else
lResult = lResult Xor lX8 Xor lY8
End If
AddUnsigned = lResult
End Function
Private Function md5_F(x, y, z)
md5_F = (x And y) Or ((Not x) And z)
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
lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)
lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)
ConvertToWordArray = lWordArray
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
End Function
Private Function RotateLeft(lValue, iShiftBits)
RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits))
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)
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub md5_II(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))
lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition)
ReDim lWordArray(lNumberOfWords - 1)
lBytePosition = 0
lByteCount = 0
Do Until lByteCount >= lMessageLength
lWordCount = lByteCount \ BYTES_TO_A_WORD
LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000
Else
LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Function ConvertToWordArray(sMessage)
Dim lMessageLength
Dim lNumberOfWords
Dim lWordArray()
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)
End Function
Private Function AddUnsigned(lX, lY)
Dim lX4
Dim lY4
Dim lX8
Dim lY8
Dim lResult
lX8 = lX And &H80000000
lY8 = lY And &H80000000
End Function
Private Function md5_G(x, y, z)
md5_G = (x And z) Or (y And (Not z))
End Function
Private Function md5_H(x, y, z)
md5_H = (x Xor y Xor z)
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
WordToHex = WordToHex & Right("0" & Hex(lByte), 2)
Next
End Function
Public Function MD5(sMessage)
m_lOnBits(0) = CLng(1)
m_lOnBits(1) = CLng(3)
VB6.0中实现MD5加密算法代码
Private Const BITS_TO_A_BYTE = 8
Private Const BYTES_TO_A_WORD = 4
Private Const BITS_TO_A_WORD = 32
Private m_lOnBits(30)
Private m_l2Power(30)
End Function
Private Function md5_I(x, y, z)
md5_I = (y Xor (x Or (Not z)))
End Function
Private Sub md5_FF(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))
m_lOnBits(19) = CLng(1048575)
m_lOnBits(20) = CLng(2097151)
m_lOnBits(21) = CLng(4194303)
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)