md5sum.c, md5.c, md5.h
md5sum.c
#include <stdio.h> #include <stdlib.h> #include "md5.h" #pragma warning(disable:4996) #define BUFFER_SIZE 0x200000 void print_digest(const unsigned char* digest); void print_digest(const unsigned char* digest) { int i; ; i < ; i++ ) { printf("%02x", *digest++); } } int main(int argc, char* argv[]) { struct MD5Context md5; unsigned char* buffer; unsigned ]; size_t len; FILE* file; int i; // check the arguments. ) { printf("use this program as:\n md5sum file1 file2 file3...\n"); ); } // Get the memory as the buffer. buffer = (unsigned char*)malloc(BUFFER_SIZE); if ( buffer == NULL ) { printf("Have not enought memory to do this work!\n"); ); } // One by one. ; i < argc; i++ ) { MD5Init(&md5); // open the file. file = fopen(argv[i], "rb"); if ( file == NULL ) { printf("Can't open file: %s\n", argv[i]); continue; } // read the data from the file. , BUFFER_SIZE, file)) > ) { MD5Update(&md5, (const unsigned char*)buffer, (unsigned int)len); } // Finish and show it. MD5Final(digest, &md5); fclose(file); printf("%s: ", argv[i]); print_digest((const unsigned char*)digest); printf("\n"); } // Free the memory. free((void*)buffer); ); }
md5.c
/* * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was * written by Colin Plumb in 1993, no copyright is claimed. * This code is in the public domain; do with it what you wish. * * Equivalent code is available from RSA Data Security, Inc. * This code has been tested against that, and is equivalent, * except that you don't need to include two pages of legalese * with every copy. * * To compute the message digest of a chunk of bytes, declare an * MD5Context structure, pass it to MD5Init, call MD5Update as * needed on buffers full of bytes, and then call MD5Final, which * will fill a supplied 16-byte array with the digest. */ #include <string.h> /* for memcpy() */ #include "md5.h" #ifndef HIGHFIRST #define byteReverse(buf, len) /* Nothing */ #else void byteReverse(unsigned char *buf, unsigned longs); #ifndef ASM_MD5 /* * Note: this code is harmless on little-endian machines. */ void byteReverse(unsigned char *buf, unsigned longs) { unsigned long t; do { t = (unsigned ] << | buf[]) << | ((unsigned) buf[] << | buf[]); *(unsigned long *) buf = t; buf += ; } while (--longs); } #endif #endif /* * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious * initialization constants. */ void MD5Init(struct MD5Context *ctx) { ctx->buf[] = 0x67452301; ctx->buf[] = 0xefcdab89; ctx->buf[] = 0x98badcfe; ctx->buf[] = 0x10325476; ctx->bits[] = ; ctx->bits[] = ; } /* * Update context to reflect the concatenation of another buffer full * of bytes. */ void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) { unsigned long t; //Update bitcount t = ctx->bits[]; ] = t + ((unsigned )) < t) ctx->bits[]++; // Carry from low to high ctx->bits[] += len >> ; t = (t >> ) & 0x3f; // Bytes already in shsInfo->data //Handle any leading odd-sized chunks if (t) { unsigned char *p = (unsigned char *) ctx->in + t; t = - t; if (len < t) { memcpy(p, buf, len); return; } memcpy(p, buf, t); byteReverse(ctx->); MD5Transform(ctx->buf, (unsigned long *) ctx->in); buf += t; len -= t; } // Process data in 64-byte chunks ) { memcpy(ctx->); byteReverse(ctx->); MD5Transform(ctx->buf, (unsigned long *) ctx->in); buf += ; len -= ; } // Handle any remaining bytes of data. memcpy(ctx->in, buf, len); } /* * Final wrapup - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ ], struct MD5Context *ctx) { unsigned count; unsigned char *p; // Compute number of bytes mod 64 count = (ctx->bits[] >> ) & 0x3F; //Set the first char of padding to 0x80. This is safe since there is // always at least one byte free p = ctx->in + count; *p++ = 0x80; // Bytes of padding needed to make 64 bytes count = - - count; // Pad out to 56 mod 64 ) { // Two lots of padding: Pad the first block to 64 bytes memset(p, , count); byteReverse(ctx->); MD5Transform(ctx->buf, (unsigned long *) ctx->in); // Now fill the next block with 56 bytes memset(ctx->, ); } else { // Pad block to 56 bytes memset(p, , count - ); } byteReverse(ctx->); //Append length in bits and transform ((unsigned ] = ctx->bits[]; ((unsigned ] = ctx->bits[]; MD5Transform(ctx->buf, (unsigned long *) ctx->in); byteReverse((unsigned ); memcpy(digest, ctx->buf, ); memset(ctx, , sizeof(ctx)); // In case it's sensitive } #ifndef ASM_MD5 /* The four core functions - F1 is optimized somewhat */ /* #define F1(x, y, z) (x & y | ~x & z) */ #define F1(x, y, z) (z ^ (x & (y ^ z))) #define F2(x, y, z) F1(z, x, y) #define F3(x, y, z) (x ^ y ^ z) #define F4(x, y, z) (y ^ (x | ~z)) /* This is the central step in the MD5 algorithm. */ #define MD5STEP(f, w, x, y, z, data, s) \ ( w += f(x, y, z) + data, w = w<<s | w>>(-s), w += x ) /* * The core of the MD5 algorithm, this alters an existing MD5 hash to * reflect the addition of 16 longwords of new data. MD5Update blocks * the data and converts bytes into longwords for this routine. */ ], unsigned ]) { register unsigned long a, b, c, d; a = buf[]; b = buf[]; c = buf[]; d = buf[]; MD5STEP(F1, a, b, c, d, ] + ); MD5STEP(F1, d, a, b, c, ] + ); MD5STEP(F1, c, d, a, b, ] + ); MD5STEP(F1, b, c, d, a, ] + ); MD5STEP(F1, a, b, c, d, ] + ); MD5STEP(F1, d, a, b, c, ] + ); MD5STEP(F1, c, d, a, b, ] + ); MD5STEP(F1, b, c, d, a, ] + ); MD5STEP(F1, a, b, c, d, ] + ); MD5STEP(F1, d, a, b, c, ] + ); MD5STEP(F1, c, d, a, b, ] + ); MD5STEP(F1, b, c, d, a, ] + ); MD5STEP(F1, a, b, c, d, ] + ); MD5STEP(F1, d, a, b, c, ] + ); MD5STEP(F1, c, d, a, b, ] + ); MD5STEP(F1, b, c, d, a, ] + ); MD5STEP(F2, a, b, c, d, ] + ); MD5STEP(F2, d, a, b, c, ] + ); MD5STEP(F2, c, d, a, b, ] + ); MD5STEP(F2, b, c, d, a, ] + ); MD5STEP(F2, a, b, c, d, ] + ); MD5STEP(F2, d, a, b, c, ] + ); MD5STEP(F2, c, d, a, b, ] + ); MD5STEP(F2, b, c, d, a, ] + ); MD5STEP(F2, a, b, c, d, ] + ); MD5STEP(F2, d, a, b, c, ] + ); MD5STEP(F2, c, d, a, b, ] + ); MD5STEP(F2, b, c, d, a, ] + ); MD5STEP(F2, a, b, c, d, ] + ); MD5STEP(F2, d, a, b, c, ] + ); MD5STEP(F2, c, d, a, b, ] + ); MD5STEP(F2, b, c, d, a, ] + ); MD5STEP(F3, a, b, c, d, ] + ); MD5STEP(F3, d, a, b, c, ] + ); MD5STEP(F3, c, d, a, b, ] + ); MD5STEP(F3, b, c, d, a, ] + ); MD5STEP(F3, a, b, c, d, ] + ); MD5STEP(F3, d, a, b, c, ] + ); MD5STEP(F3, c, d, a, b, ] + ); MD5STEP(F3, b, c, d, a, ] + ); MD5STEP(F3, a, b, c, d, ] + ); MD5STEP(F3, d, a, b, c, ] + ); MD5STEP(F3, c, d, a, b, ] + ); MD5STEP(F3, b, c, d, a, ] + ); MD5STEP(F3, a, b, c, d, ] + ); MD5STEP(F3, d, a, b, c, ] + ); MD5STEP(F3, c, d, a, b, ] + ); MD5STEP(F3, b, c, d, a, ] + ); MD5STEP(F4, a, b, c, d, ] + ); MD5STEP(F4, d, a, b, c, ] + ); MD5STEP(F4, c, d, a, b, ] + ); MD5STEP(F4, b, c, d, a, ] + ); MD5STEP(F4, a, b, c, d, ] + ); MD5STEP(F4, d, a, b, c, ] + ); MD5STEP(F4, c, d, a, b, ] + ); MD5STEP(F4, b, c, d, a, ] + ); MD5STEP(F4, a, b, c, d, ] + ); MD5STEP(F4, d, a, b, c, ] + ); MD5STEP(F4, c, d, a, b, ] + ); MD5STEP(F4, b, c, d, a, ] + ); MD5STEP(F4, a, b, c, d, ] + ); MD5STEP(F4, d, a, b, c, ] + ); MD5STEP(F4, c, d, a, b, ] + ); MD5STEP(F4, b, c, d, a, ] + ); buf[] += a; buf[] += b; buf[] += c; buf[] += d; } #endif
md5.h
#ifndef MD5_H #define MD5_H #ifdef __alpha typedef unsigned int uint32; #else typedef unsigned long uint32; #endif struct MD5Context { uint32 buf[]; uint32 bits[]; unsigned ]; }; void MD5Init(struct MD5Context *context); void MD5Update(struct MD5Context *context, unsigned char const *buf, unsigned len); ], struct MD5Context *context); ], uint32 ]); /* * This is needed to make RSAREF happy on some MS-DOS compilers. */ typedef struct MD5Context MD5_CTX; #endif /* !MD5_H */
md5sum.c, md5.c, md5.h的更多相关文章
- python接口自动化测试二十七:密码MD5加密 ''' MD5加密 ''' # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待加密信息 str = 'asdas89799,.//plrmf' # 创建md5对象 hl = hashlib.md5() # Tips # 此处必须声明encode # 若写法为
python接口自动化测试二十七:密码MD5加密 ''' MD5加密 '''# 由于MD5模块在python3中被移除# 在python3中使用hashlib模块进行md5操作import has ...
- java 文件md5+字符串md5 实现
import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.digest.DigestUtils; impo ...
- How to get the MD5 checksum for a file: md5sum, digest, csum, fciv
LINUX: md5sum fileName In Linux, the md5sum utility can be used: aemtux1:/ % md5sum binary.file 0c46 ...
- linux下md5sum用法 (查看文件或字符串的md5值)
MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长 ...
- md5sum/opensll md5
http://m.blog.csdn.net/article/details?id=42041329 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5全称是报文摘要算法(Mess ...
- Linux下通过md5sum生成MD5文件&校验MD5
生成md5值 随便找个文件执行:md5sum file_name 即可生成该文件对应md5值. 也可以一次生成多个文件的md5值:md5sum file_name1 file_name2 file_ ...
- md5 加密算法和升级
在这里插一小节加密的吧,使用openssl库进行加密. 使用MD5加密 我们以一个字符串为例,新建一个文件filename.txt,在文件内写入hello ,然后在Linux下可以使用命令md5sum ...
- hashlib的md5计算
hashlib的md5计算 hashlib概述 涉及加密服务:Cryptographic Services 其中 hashlib是涉及 安全散列 和 消息摘要 ,提供多个不同的加密算法借口,如SHA1 ...
- md5命令
AIX 系统md5命令之csum #csum filename (默认使用md5算法) #csum -h SHA1 filename (使用sha1算法)Linux系统命令之md5sum 1. 背景 ...
随机推荐
- 【HDU1233】还是畅通工程(MST基础题)
无坑,裸题.直接敲就恩那个AC. #include <iostream> #include <cstring> #include <cstdio> #include ...
- Android应用开发学习之Toast消息提示框
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 本文我们来看Toast消息提示框的用法.使用Toast消息提示框一般有三个步骤: 1. 创建一个Toast对象.可 ...
- hdu 5642 King's Order(数位dp)
Problem Description After the king's speech , everyone is encouraged. But the war is not over. The k ...
- GCD 延时操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_ ...
- (2)入门指南——(3)为什么jquery工作的很好(Why jQuery works well)
With the resurgence of interest in dynamic HTML comes a proliferation of JavaScript frameworks. Some ...
- 该如何关闭thinkphp的缓存呢?有下面几种方法可参考:
该如何关闭thinkphp的缓存呢?有下面几种方法可参考: (1)在配置文件中关闭缓存 在你的配置文件config.php文件中加上如下两句: 复制代码代码如下: 'TMPL_CACHE_ON' ...
- Spring 反转控制(IOC) 依赖注入(DI)
简单的理解: 之前是我为了完成业务A 需要某个对象B的支持 那么我在这个业务A中就会创建一个对象B使用,说白了就是我根据需求来控制对象B, 而spring的ioc把对象B的控制权从业务A手中拿到自己手 ...
- 面试总结之html+css
最近面试了一些公司,和技术总监聊了一些前端技术方面的内容.回来之后我总结了一下,大致可以分为三个模块:第一.Html与css 方面:第二.浏览器解析方面:第三.js方面.打算,分为三篇博文,根据自己的 ...
- Sql语句不能识别Go的解决办法(动态创建表的触发器)
问题来源 用sqlserver直接打开sql文本,执行没问题,但是当用Sqlcommand类执行cmdtext命令文本时总是失败报错. 原因分析及解决 用数据库直接执行sql语句没问题,甚至还可以用G ...
- C# 4.0 并行计算部分
C# 4.0 并行计算部分 c#linq算法多线程list微软 目录(?)[-] C 40 并行计算部分 一简单使用 二 并行循环的中断和跳出 三并行循环中为数组集合添加项 四返回集合运算结果 ...