HTML如何引入md5算法,MD5算法实现
文件下载:
文件:
md5.rar
大小:
3KB
下载:
unit MD5;
{**************************************************************************
MD5 from rfc1231.txt
Copyright (C) 2002 Go Maeda <>
This work is derived from the RSA Data Security, Inc. MD5 Message-Digest
Algorithm.
author : Ayakawa,Marinosuke()
2000/11/17 1st. convert to delphi
2004/07/04 2nd. change param string to pbyte
2004/07/09 3rd. fixed for large size file(2G over)
**************************************************************************}
interface
uses
windows,sysutils,classes;
function CalcMD5(ASrc:PByte; ASize:integer):string;
function CalcFileMD5(AFilename:string):string;
implementation
type
UINT2 = WORD;
UINT4 = DWORD;
TARYUINT4 = array[0..3] of UINT4;
TARYBYTE64 = array[0..63] of byte;
TMD5_CTX = packed record
state : TARYUINT4;
count : array[0..1] of UINT4;
buffer : TARYBYTE64;
end;
const
S11=7;
S12=12;
S13=17;
S14=22;
S21=5;
S22=9;
S23=14;
S24=20;
S31=4;
S32=11;
S33=16;
S34=23;
S41=6;
S42=10;
S43=15;
S44=21;
PADDING = #$80#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 and I are basic MD5 functions.
function F(x,y,z:UINT4):UINT4;
begin
result:= (x AND y) OR ((NOT x) AND z);
end;
function G(x,y,z:UINT4):UINT4;
begin
result:= (x AND z) OR (y AND (NOT z));
end;
function H(x,y,z:UINT4):UINT4;
begin
result:=x XOR y XOR z;
end;
function I(x,y,z:UINT4):UINT4;
begin
result:=y XOR (x OR (NOT z));
end;
// ROTATE_LEFT rotates x left n bits.
function ROTATE_LEFT(x,n:DWORD):DWORD;
begin
result:= (x SHL n) OR (x SHR (32-n));
end;
// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
// Rotation is separate from addition to prevent recomputation.
procedure FF(var a:DWORD; b,c,d,x,s,ac:DWORD);
begin
a:=a+F(b,c,d)+x+ac;
a:=ROTATE_LEFT(a,s);
a:=a+b;
end;
procedure GG(var a:DWORD; b,c,d,x,s,ac:DWORD);
begin
a:=a+G(b,c,d)+x+ac;
a:=ROTATE_LEFT(a,s);
a:=a+b;
end;
procedure HH(var a:DWORD; b,c,d,x,s,ac:DWORD);
begin
a:=a+H(b,c,d)+x+ac;
a:=ROTATE_LEFT(a,s);
a:=a+b;
end;
procedure II(var a:DWORD; b,c,d,x,s,ac:DWORD);
begin
a:=a+I(b,c,d)+x+ac;
a:=ROTATE_LEFT(a,s);
a:=a+b;
end;
// for (i=0; ibuffer[bufidx+i]=src[srcidx+i]
procedure MD5_memcpy(var context:TMD5_CTX; bufidx:integer; src:PByte; srcidx:integer; cpylen:integer);
var
i : integer;
p : PByte;
begin
// srcidx 0-origin. but string is 1-origin => 1+srcidx+i
//FOR i:=0 TO cpylen-1 DO context.buffer[bufidx+i]:=BYTE(ord(src[1+srcidx+i]));
p:=src;
Inc(p,srcidx);
FOR i:=0 TO cpylen-1 DO BEGIN
context.buffer[bufidx+i]:=p^; Inc(p);
END;
end;
// MD5 basic transformation. Transforms state based on block.
procedure MD5Transform(var state:TARYUINT4; block:TARYBYTE64);
var
a,b,c,d : UINT4;
x : array[0..15] of UINT4;
procedure Decode;
var
i,j : integer;
begin
i:=0; j:=0;
WHILE j<64 DO BEGIN
x[i]:=block[j] OR (block[j+1] SHL 8) OR (block[j+2] SHL 16) OR (block[j+3] SHL 24);
INC(i); INC(j,4);
END;
end;
begin
a:=state[0]; b:=state[1]; c:=state[2]; d:=state[3];
Decode;
//* Round 1 */
FF (a, b, c, d, x[ 0], S11, $d76aa478); //* 1 */
FF (d, a, b, c, x[ 1], S12, $e8c7b756); //* 2 */
FF (c, d, a, b, x[ 2], S13, $242070db); //* 3 */
FF (b, c, d, a, x[ 3], S14, $c1bdceee); //* 4 */
FF (a, b, c, d, x[ 4], S11, $f57c0faf); //* 5 */
FF (d, a, b, c, x[ 5], S12, $4787c62a); //* 6 */
FF (c, d, a, b, x[ 6], S13, $a8304613); //* 7 */
FF (b, c, d, a, x[ 7], S14, $fd469501); //* 8 */
FF (a, b, c, d, x[ 8], S11, $698098d8); //* 9 */
FF (d, a, b, c, x[ 9], S12, $8b44f7af); //* 10 */
FF (c, d, a, b, x[10], S13, $ffff5bb1); //* 11 */
FF (b, c, d, a, x[11], S14, $895cd7be); //* 12 */
FF (a, b, c, d, x[12], S11, $6b901122); //* 13 */
FF (d, a, b, c, x[13], S12, $fd987193); //* 14 */
FF (c, d, a, b, x[14], S13, $a679438e); //* 15 */
FF (b, c, d, a, x[15], S14, $49b40821); //* 16 */
//* Round 2 */
GG (a, b, c, d, x[ 1], S21, $f61e2562); //* 17 */
GG (d, a, b, c, x[ 6], S22, $c040b340); //* 18 */
GG (c, d, a, b, x[11], S23, $265e5a51); //* 19 */
GG (b, c, d, a, x[ 0], S24, $e9b6c7aa); //* 20 */
GG (a, b, c, d, x[ 5], S21, $d62f105d); //* 21 */
GG (d, a, b, c, x[10], S22, $2441453); //* 22 */
GG (c, d, a, b, x[15], S23, $d8a1e681); //* 23 */
GG (b, c, d, a, x[ 4], S24, $e7d3fbc8); //* 24 */
GG (a, b, c, d, x[ 9], S21, $21e1cde6); //* 25 */
GG (d, a, b, c, x[14], S22, $c33707d6); //* 26 */
GG (c, d, a, b, x[ 3], S23, $f4d50d87); //* 27 */
GG (b, c, d, a, x[ 8], S24, $455a14ed); //* 28 */
GG (a, b, c, d, x[13], S21, $a9e3e905); //* 29 */
GG (d, a, b, c, x[ 2], S22, $fcefa3f8); //* 30 */
GG (c, d, a, b, x[ 7], S23, $676f02d9); //* 31 */
GG (b, c, d, a, x[12], S24, $8d2a4c8a); //* 32 */
//* Round 3 */
HH (a, b, c, d, x[ 5], S31, $fffa3942); //* 33 */
HH (d, a, b, c, x[ 8], S32, $8771f681); //* 34 */
HH (c, d, a, b, x[11], S33, $6d9d6122); //* 35 */
HH (b, c, d, a, x[14], S34, $fde5380c); //* 36 */
HH (a, b, c, d, x[ 1], S31, $a4beea44); //* 37 */
HH (d, a, b, c, x[ 4], S32, $4bdecfa9); //* 38 */
HH (c, d, a, b, x[ 7], S33, $f6bb4b60); //* 39 */
HH (b, c, d, a, x[10], S34, $bebfbc70); //* 40 */
HH (a, b, c, d, x[13], S31, $289b7ec6); //* 41 */
HH (d, a, b, c, x[ 0], S32, $eaa127fa); //* 42 */
HH (c, d, a, b, x[ 3], S33, $d4ef3085); //* 43 */
HH (b, c, d, a, x[ 6], S34, $4881d05); //* 44 */
HH (a, b, c, d, x[ 9], S31, $d9d4d039); //* 45 */
HH (d, a, b, c, x[12], S32, $e6db99e5); //* 46 */
HH (c, d, a, b, x[15], S33, $1fa27cf8); //* 47 */
HH (b, c, d, a, x[ 2], S34, $c4ac5665); //* 48 */
//* Round 4 */
II (a, b, c, d, x[ 0], S41, $f4292244); //* 49 */
II (d, a, b, c, x[ 7], S42, $432aff97); //* 50 */
II (c, d, a, b, x[14], S43, $ab9423a7); //* 51 */
II (b, c, d, a, x[ 5], S44, $fc93a039); //* 52 */
II (a, b, c, d, x[12], S41, $655b59c3); //* 53 */
II (d, a, b, c, x[ 3], S42, $8f0ccc92); //* 54 */
II (c, d, a, b, x[10], S43, $ffeff47d); //* 55 */
II (b, c, d, a, x[ 1], S44, $85845dd1); //* 56 */
II (a, b, c, d, x[ 8], S41, $6fa87e4f); //* 57 */
II (d, a, b, c, x[15], S42, $fe2ce6e0); //* 58 */
II (c, d, a, b, x[ 6], S43, $a3014314); //* 59 */
II (b, c, d, a, x[13], S44, $4e0811a1); //* 60 */
II (a, b, c, d, x[ 4], S41, $f7537e82); //* 61 */
II (d, a, b, c, x[11], S42, $bd3af235); //* 62 */
II (c, d, a, b, x[ 2], S43, $2ad7d2bb); //* 63 */
II (b, c, d, a, x[ 9], S44, $eb86d391); //* 64 */
INC(state[0],a);
INC(state[1],b);
INC(state[2],c);
INC(state[3],d);
// Zeroize sensitive information.
FillChar(x[0],sizeof(x),0); // MD5_memset
end;
///
//
// MD5 initialization. Begins an MD5 operation, writing a new context.
//
///
procedure MD5Init(var md5ctx:TMD5_CTX);
begin
WITH md5ctx DO BEGIN
count[0]:=0;
count[1]:=0;
// Load magic initialization constants.
state[0]:=$67452301;
state[1]:=$efcdab89;
state[2]:=$98badcfe;
state[3]:=$10325476;
END;
end;
procedure MD5Update(var context:TMD5_CTX; inputdata:PByte; inputlen:DWORD);
var
i,index,partLen : DWORD;
work : TARYBYTE64;
pB : PByte;
begin
// Compute number of bytes mod 64
index := (context.count[0] SHR 3) AND $3F;
// Update number of bits
INC(context.count[0],(inputlen SHL 3));
IF context.count[0] INC(context.count[1],(inputlen SHR 29));
partLen:=64-index;
// Transform as many times as possible
IF inputlen >= partLen THEN BEGIN
MD5_memcpy(context,index,inputdata,0,partLen);
MD5Transform(context.state,context.buffer);
i:=partlen;
WHILE (i+63)pB:=inputdata; Inc(pB,i);
Move(pB^,work[0],64);
MD5Transform(context.state,work);
INC(i,64);
END;
index:=0;
END ELSE
i:=0;
// Buffer remaining input
MD5_memcpy(context,index,inputdata,i,inputlen-i);
end;
function MD5Final(var context:TMD5_CTX):string;
var
bits : array[0..7] of BYTE;
work : string;
index,padlen : DWORD;
i,j : integer;
procedure Encode8;
begin
i:=0; j:=0;
WHILE j<8 DO BEGIN
bits[j]:=context.count[i] AND $FF;
bits[j+1]:=(context.count[i] SHR 8) AND $FF;
bits[j+2]:=(context.count[i] SHR 16) AND $FF;
bits[j+3]:=(context.count[i] SHR 24) AND $FF;
INC(i); INC(j,4);
END;
end;
function Encode16:string;
begin
result:='';
i:=0; j:=0;
WHILE j<16 DO BEGIN
result:=result+IntToHex(context.state[i] AND $FF,2);
result:=result+IntToHex((context.state[i] SHR 8) AND $FF,2);
result:=result+IntToHex((context.state[i] SHR 16) AND $FF,2);
result:=result+IntToHex((context.state[i] SHR 24) AND $FF,2);
INC(i); INC(j,4);
END;
result:=LowerCase(result);
end;
begin
// Save number of bits
Encode8;
// Pad out to 56 mod 64
index:=(context.count[0] SHR 3) AND $3F;
IF index<56 THEN padlen:=56-index ELSE padlen:=120-index;
MD5Update(context,PByte(@PADDING[1]),padlen);
// Append length (before padding)
work:=' '; // need 8byte
Move(bits[0],work[1],8);
MD5Update(context,pByte(@work[1]),8);
// Store state in digest
result:=Encode16;
// Zeroize sensitive information.
FillChar(context,sizeof(context),0);
end;
function CalcMD5(ASrc:PByte; ASize:integer):string;
var
context : TMD5_CTX;
begin
MD5Init(context);
MD5Update(context,ASrc,ASize);
result:=MD5Final(context);
end;
function CalcFileMD5(AFilename:string):string;
function GetFSize(h:THandle):int64;
var
dwLowSize,dwHighSize : DWORD;
cw0,cw1 : Int64;
begin
dwLowSize:=GetFileSize(h,@dwHighSize);
IF (dwLowSize=$FFFFFFFF) AND (GetLastError<>NO_ERROR) THEN
result:=-1
ELSE BEGIN
cw0:=dwLowSize;
cw1:=dwHighSize;
result:=cw0+cw1*$100000000;
END;
end;
const
BUFSIZE = 4096*2;
var
h : THANDLE;
sz : DWORD;
remain : INT64;
buf : array[0..BUFSIZE-1] of BYTE;
context : TMD5_CTX;
done : boolean;
begin
result:='';
h:=CreateFile(PChar(AFilename),GENERIC_READ,FILE_SHARE_READ,
nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
IF h=INVALID_HANDLE_VALUE THEN Exit;
try
remain:=GetFSize(h);
IF remain<>-1 THEN BEGIN
// 嵟弶
done:=true;
MD5Init(context);
// 撉傒崬傒!
WHILE remain>0 DO BEGIN
IF NOT ReadFile(h,buf[0],BUFSIZE,sz,nil) THEN BEGIN
done:=false; break;
END;
Dec(remain,sz);
MD5Update(context,@buf[0],sz);
END;
// 嵟屻
IF done THEN result:=MD5Final(context);
END;
finally
CloseHandle(h);
end;
end;
end.
HTML如何引入md5算法,MD5算法实现相关推荐
- 常见的加密和解密算法—MD5
转载:https://www.cnblogs.com/maohuidong/p/7967257.html 常见的加密和解密算法-MD5 一.MD5加密概述 Message Digest Algorit ...
- Shiro框架:Shiro简介、登陆认证入门程序、认证执行流程、使用自定义Realm进行登陆认证、Shiro的MD5散列算法
一.Shiro介绍: 1.什么是shiro: (1)shiro是apache的一个开源框架,是一个权限管理的框架,实现用户认证.用户授权. (2)spring中有spring security,是一个 ...
- ASP.NET中使用MD5和SHA1算法加密
你的主页或者你管理的网站有各种密码需要保护,把密码直接放在数据库或者文件中存在不少安全隐患,所以密码加密后存储是最常见的做法.在ASP.NET中实现加密非常容易..NET SDK中提供了CookieA ...
- ASP.NET中密码保护,MD5和SHA1算法的使用
ASP.NET中密码保护,MD5和SHA1算法的使用 你的主页或者你管理的网站有各种密码需要保护,把密码直接放在数据库或者文件中存在不少安全隐患,所以密码加密后存储是最常见的做法.在ASP.NET中实 ...
- Java实现密码学工具,集成了对称加密算法DES,AES,IDEA,公开加密算法RSA,ECC,散列算法MD5,SHA1,CRC32,以及RSA,DSA,ECDSA数字签名验证示例。
密码学综合工具 前言 git网址 项目结构 项目预览 String与byte[]互转 通过`String`类转换 通过`Base64`互转[jdk-8] 前言 我们网络信息安全的实验...要我们找各种 ...
- java编写md5加密解密算法
/** * @工程名称:cargo-apron * @程序包名:com.shenzhenair.ecargo.apron.support.util * @程序类名:DESUtil.java * ...
- MD5简介及其算法源码
MD5简介 (源码下载) (摘自百度http://baike.baidu.com/view/7636.htm) MD5的全称是Message-digest Algorithm 5(信息-摘要算法),在 ...
- 常见的哈希Hash算法 MD5 对称非对称加密 海明码
2019独角兽企业重金招聘Python工程师标准>>> 参考 Link 另外,这篇文章也提到了利用Hash碰撞而产生DOS攻击的案例: http://www.cnblogs.com/ ...
- md5和SHA-1算法的区别,哪种比较安全
MD5和SHA-1在计算机安全领域使用比较广泛的密码散列函数,也是数字签名和消息认证中普遍使用的两种算法.那么MD5和SHA-1算法有什么区别呢?很多朋友不是很了解这两种算法的区别,下面本文将针对这个 ...
- 摘要/哈希/散列算法MD5 SHA1 SHA256 SHA512的区别和MAC算法
目录 一.摘要算法大致都要经过以下步骤 1. 明文数据预处理 1.1 填充比特 1.2 附加消息长度 2. 摘要计算 2.1 常量初始化 2.2 分组及分组拓展和分组分段 2.3 轮函数(每段一轮,此 ...
最新文章
- 2018人工智能期末考试复习资料(一):学术篇
- MySQL批量插入数据的几种方法
- 计算机安全OSI安全框架
- 使用VS2019编写C语言程序,环境安装配置+代码调试
- dpdk18.11 收发包流程分析
- 阅读react-redux源码(六) - selectorFactory处理store更新
- 分布与并行计算—生产者消费者模型队列(Java)
- Android Studio笔记
- python操作数据库的几种方法_Python操作MySQL数据库的三种方法总结
- QQ浏览器文章评论的BUG:评论者错了
- 误Ghost数据恢复图文教程
- python:实现培根密码算法(附完整源码)
- Learning with Pseudo-Ensembles
- py知识(每日更新) 7.19
- matlab if嵌套函数,MATLAB嵌套函数的应用
- APP全栈工程师修炼之路(二)
- RX 6600XT vs RTX 2060Super 显卡对比
- PyTorch RuntimeError: Function ‘CudnnBatchNormBackward0‘ returned nan values in its 0th output. 解决方法
- 《CSDN Markdown简明教程》课程上线!
- RedHat6.5 安装OpenStack all in one-RDO方式
热门文章
- linux电脑开机慢,Ubuntu 启动速度慢的解决方法
- spring中AOP(面向切面编程)
- 起源地杯青年足球锦标赛
- open函数里的newline
- [附源码]Python计算机毕业设计Django校园运动会管理系统
- opencv读取视频有延迟解决方法
- centOS7 防火墙关闭 远程端口无法访问问题
- 百度云曲显平:AIOps时代下如何用运维数据系统性地解决运维问题?
- 法国 计算机金融 大学,法国金融专业大学排名(2020年USNEWS)_快飞留学
- aps是什么意思_aps画幅是什么意思