从文件中截取字段并转换为MD5值

首先需要实现MD5,网上发现一个较好的实现:

1、md5.h

 1 #ifndef _MD5_H_
 2 #define _MD5_H_
 3 /*
 4  * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
 5  * MD5 Message-Digest Algorithm (RFC 1321).
 6  *
 7  * Homepage:
 8  * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
 9  *
10  * Author:
11  * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
12  *
13  * This software was written by Alexander Peslyak in 2001.  No copyright is
14  * claimed, and the software is hereby placed in the public domain.
15  * In case this attempt to disclaim copyright and place the software in the
16  * public domain is deemed null and void, then the software is
17  * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
18  * general public under the following terms:
19  *
20  * Redistribution and use in source and binary forms, with or without
21  * modification, are permitted.
22  *
23  * There‘s ABSOLUTELY NO WARRANTY, express or implied.
24  *
25  * See md5.c for more information.
26  */
27
28
29 /* Any 32-bit or wider unsigned integer data type will do */
30 typedef unsigned int MD5_u32plus;
31
32 typedef struct {
33     MD5_u32plus lo, hi;
34     MD5_u32plus a, b, c, d;
35     unsigned char buffer[64];
36     MD5_u32plus block[16];
37 } MD5_CTX;
38
39 extern void MD5_Init(MD5_CTX *ctx);
40 extern void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size);
41 extern void MD5_Final(unsigned char *result, MD5_CTX *ctx);
42
43
44 #endif // _MD5_H_

2、md5.c

  1 /*
  2  * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
  3  * MD5 Message-Digest Algorithm (RFC 1321).
  4  *
  5  * Homepage:
  6  * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
  7  *
  8  * Author:
  9  * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
 10  *
 11  * This software was written by Alexander Peslyak in 2001.  No copyright is
 12  * claimed, and the software is hereby placed in the public domain.
 13  * In case this attempt to disclaim copyright and place the software in the
 14  * public domain is deemed null and void, then the software is
 15  * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
 16  * general public under the following terms:
 17  *
 18  * Redistribution and use in source and binary forms, with or without
 19  * modification, are permitted.
 20  *
 21  * There‘s ABSOLUTELY NO WARRANTY, express or implied.
 22  *
 23  * (This is a heavily cut-down "BSD license".)
 24  *
 25  * This differs from Colin Plumb‘s older public domain implementation in that
 26  * no exactly 32-bit integer data type is required (any 32-bit or wider
 27  * unsigned integer data type will do), there‘s no compile-time endianness
 28  * configuration, and the function prototypes match OpenSSL‘s.  No code from
 29  * Colin Plumb‘s implementation has been reused; this comment merely compares
 30  * the properties of the two independent implementations.
 31  *
 32  * The primary goals of this implementation are portability and ease of use.
 33  * It is meant to be fast, but not as fast as possible.  Some known
 34  * optimizations are not included to reduce source code size and avoid
 35  * compile-time configuration.
 36  */
 37
 38 #include <string.h>
 39
 40 #include "md5.h"
 41
 42 /*
 43  * The basic MD5 functions.
 44  *
 45  * F and G are optimized compared to their RFC 1321 definitions for
 46  * architectures that lack an AND-NOT instruction, just like in Colin Plumb‘s
 47  * implementation.
 48  */
 49 #define F(x, y, z)            ((z) ^ ((x) & ((y) ^ (z))))
 50 #define G(x, y, z)            ((y) ^ ((z) & ((x) ^ (y))))
 51 #define H(x, y, z)            (((x) ^ (y)) ^ (z))
 52 #define H2(x, y, z)            ((x) ^ ((y) ^ (z)))
 53 #define I(x, y, z)            ((y) ^ ((x) | ~(z)))
 54
 55 /*
 56  * The MD5 transformation for all four rounds.
 57  */
 58 #define STEP(f, a, b, c, d, x, t, s)  59     (a) += f((b), (c), (d)) + (x) + (t);  60     (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s))));  61     (a) += (b);
 62
 63 /*
 64  * SET reads 4 input bytes in little-endian byte order and stores them
 65  * in a properly aligned word in host byte order.
 66  *
 67  * The check for little-endian architectures that tolerate unaligned
 68  * memory accesses is just an optimization.  Nothing will break if it
 69  * doesn‘t work.
 70  */
 71 #if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
 72 #define SET(n)  73     (*(MD5_u32plus *)&ptr[(n) * 4])
 74 #define GET(n)  75     SET(n)
 76 #else
 77 #define SET(n)  78     (ctx->block[(n)] =  79     (MD5_u32plus)ptr[(n) * 4] |  80     ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) |  81     ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) |  82     ((MD5_u32plus)ptr[(n) * 4 + 3] << 24))
 83 #define GET(n)  84     (ctx->block[(n)])
 85 #endif
 86
 87 /*
 88  * This processes one or more 64-byte data blocks, but does NOT update
 89  * the bit counters.  There are no alignment requirements.
 90  */
 91 static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
 92 {
 93     const unsigned char *ptr;
 94     MD5_u32plus a, b, c, d;
 95     MD5_u32plus saved_a, saved_b, saved_c, saved_d;
 96
 97     ptr = (const unsigned char *)data;
 98
 99     a = ctx->a;
100     b = ctx->b;
101     c = ctx->c;
102     d = ctx->d;
103
104     do {
105         saved_a = a;
106         saved_b = b;
107         saved_c = c;
108         saved_d = d;
109
110 /* Round 1 */
111         STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)
112         STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
113         STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
114         STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
115         STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
116         STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
117         STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
118         STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
119         STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
120         STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
121         STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
122         STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
123         STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
124         STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
125         STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
126         STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
127
128 /* Round 2 */
129         STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
130         STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
131         STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
132         STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
133         STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
134         STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
135         STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
136         STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
137         STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
138         STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
139         STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
140         STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
141         STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
142         STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
143         STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
144         STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
145
146 /* Round 3 */
147         STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
148         STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11)
149         STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
150         STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23)
151         STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
152         STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11)
153         STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
154         STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23)
155         STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
156         STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11)
157         STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
158         STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23)
159         STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
160         STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11)
161         STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
162         STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23)
163
164 /* Round 4 */
165         STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
166         STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
167         STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
168         STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
169         STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
170         STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
171         STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
172         STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
173         STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
174         STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
175         STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
176         STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
177         STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
178         STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
179         STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
180         STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
181
182         a += saved_a;
183         b += saved_b;
184         c += saved_c;
185         d += saved_d;
186
187         ptr += 64;
188     } while (size -= 64);
189
190     ctx->a = a;
191     ctx->b = b;
192     ctx->c = c;
193     ctx->d = d;
194
195     return ptr;
196 }
197
198 void MD5_Init(MD5_CTX *ctx)
199 {
200     ctx->a = 0x67452301;
201     ctx->b = 0xefcdab89;
202     ctx->c = 0x98badcfe;
203     ctx->d = 0x10325476;
204
205     ctx->lo = 0;
206     ctx->hi = 0;
207 }
208
209 void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size)
210 {
211     MD5_u32plus saved_lo;
212     unsigned long used, available;
213
214     saved_lo = ctx->lo;
215     if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
216         ctx->hi++;
217     ctx->hi += size >> 29;
218
219     used = saved_lo & 0x3f;
220
221     if (used) {
222         available = 64 - used;
223
224         if (size < available) {
225             memcpy(&ctx->buffer[used], data, size);
226             return;
227         }
228
229         memcpy(&ctx->buffer[used], data, available);
230         data = (const unsigned char *)data + available;
231         size -= available;
232         body(ctx, ctx->buffer, 64);
233     }
234
235     if (size >= 64) {
236         data = body(ctx, data, size & ~(unsigned long)0x3f);
237         size &= 0x3f;
238     }
239
240     memcpy(ctx->buffer, data, size);
241 }
242
243 void MD5_Final(unsigned char *result, MD5_CTX *ctx)
244 {
245     unsigned long used, available;
246
247     used = ctx->lo & 0x3f;
248
249     ctx->buffer[used++] = 0x80;
250
251     available = 64 - used;
252
253     if (available < 8) {
254         memset(&ctx->buffer[used], 0, available);
255         body(ctx, ctx->buffer, 64);
256         used = 0;
257         available = 64;
258     }
259
260     memset(&ctx->buffer[used], 0, available - 8);
261
262     ctx->lo <<= 3;
263     ctx->buffer[56] = ctx->lo;
264     ctx->buffer[57] = ctx->lo >> 8;
265     ctx->buffer[58] = ctx->lo >> 16;
266     ctx->buffer[59] = ctx->lo >> 24;
267     ctx->buffer[60] = ctx->hi;
268     ctx->buffer[61] = ctx->hi >> 8;
269     ctx->buffer[62] = ctx->hi >> 16;
270     ctx->buffer[63] = ctx->hi >> 24;
271
272     body(ctx, ctx->buffer, 64);
273
274     result[0] = ctx->a;
275     result[1] = ctx->a >> 8;
276     result[2] = ctx->a >> 16;
277     result[3] = ctx->a >> 24;
278     result[4] = ctx->b;
279     result[5] = ctx->b >> 8;
280     result[6] = ctx->b >> 16;
281     result[7] = ctx->b >> 24;
282     result[8] = ctx->c;
283     result[9] = ctx->c >> 8;
284     result[10] = ctx->c >> 16;
285     result[11] = ctx->c >> 24;
286     result[12] = ctx->d;
287     result[13] = ctx->d >> 8;
288     result[14] = ctx->d >> 16;
289     result[15] = ctx->d >> 24;
290
291     memset(ctx, 0, sizeof(*ctx));
292 }

3、简单测试

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include "md5.h"
 5
 6 // enter start position and end position
 7 unsigned char* getMD5InRange(const char* filename, long startpos, long endpos)
 8 {
 9     FILE* file = fopen(filename, "r");
10     fseek(file, startpos, SEEK_SET);     // redirect the file pointer to start position
11     char *buf = (char *)malloc(endpos-startpos+1);
12     fread(buf, sizeof(char), endpos-startpos+1, file);       // read the data to buffer
13
14     printf("buf: %s\n", buf);
15     unsigned char *decrypt = (unsigned char *)malloc(sizeof(unsigned char*)*16);
16     MD5_CTX md5;
17     MD5_Init(&md5);        // three steps to get md5
18     MD5_Update(&md5, buf, strlen(buf));
19     MD5_Final(decrypt, &md5);
20     fclose(file);
21     return decrypt;
22 }
23
24
25 int main(int argc, char* argv[])
26 {
27     int i, st, ed;
28     unsigned char *decrypt2;
29
30     while(~scanf("%d%d", &st, &ed))
31     {
32         decrypt2 = getMD5InRange("aaa.txt", st, ed);
33         for(i = 0; i < 16; i++)
34             printf("%02x", decrypt2[i]);
35         printf("\n");
36     }
37     return 0;
38 }

4、文本文件aaa.txt

shanghaisndacompanygrandcloudwww.grandcloud.com

5、Makefile

test: test.o md5.o
    cc -o test test.o md5.o
test.o : test.c md5.h
    cc -c test.c md5.c

6、运行结果(centos6.6,请在unix环境下编译运行)

时间: 2024-08-05 15:00:14

从文件中截取字段并转换为MD5值的相关文章

从视频文件中读入数据--&gt;将数据转换为灰度图--&gt;对图像做candy边缘检测

//从视频文件中读入数据-->将数据转换为灰度图-->对图像做candy边缘检测 //作者:sandy //时间:2015-10-10 #include <cv.h> #include <highgui.h> int main(int argc, char *argv[]){ //预备工作 CvCapture* capture=cvCreateFileCapture("E:\\Videos\\xx.avi");//让capture变量指向视频文件 i

Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值

Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值,去属性表中设置这时候会提示你去属性表中更改返回类型. 其实存储过程返回的也是一张表,只不过有时候存储过程有点复杂或者写法不规范的话不能自动生成映射文件. 不能自动生成那就自己写一张表跟存储过程返回的那张表一样就行.然后拖拽至dbml中,然后设置属性中返回类型为这张表就行了.

linux:srot进行对文件中的字段排序

sort对文件中的指定行进行排序,并将结果写到标准的输出.如果File参数指定了多个文件,那么sort命令将这些文件连接起来,当作一个文件进行排序. sort语法: sort[-fbMnrtuk] [file] 选项参数: -f忽略大小写差异. -b忽略最前面的空格. -r反向排序 -M以月份的名字来排序 -n使用纯数字进行排序 -u相同的数字仅出现一次 -t分隔符,默认是tab -k以哪个field来进行排序 sort默认是以第一个数据进行排序的,默认以字符串的形式排序,数字拍在字母前. so

JAVA中如何将文件中的内容读出并将值赋给相应变量

声明:文章为个人学习心得,也是个人主观总结,内容仅供参考. 将文件中的内容读出并赋值给变量,这个过程主要有如下几步: 1.将文件读入内存 2.将内存中的信息输出给相应的变量 只要理解了这个过程,代码实现起来就很简单了,我们需要一个文件输入流(FileInputStream),内存缓冲区,内存输出流(ByteArrayOutputStream).因此,我们将按照如下步骤进行程序的书写: 1.创建文件输入流 2.创建文件输入缓冲区 3.将文件读入到缓冲区中 4.创建内存输出流 5.将内存存放的信息输

Systemd Unit文件中PrivateTmp字段详解-Jason.Zhi

如下图,在开发调试的时候会遇到这么一个问题. file_put_contents时,$tmp_file显示的目标文件是/tmp/xxx.而这个文件实际放在linux的目录却是/tmp/systemd-private-xxxxx-php-fpm.service/xxx(见图二) 为什么会出现这种情况? 只要使用Systemd这个进程作为启动进程的linux系统,其子进程都会有PrivateTmp这么一个属性,用于设置是否使用私有的tmp目录. 那么只要设置使用这个属性的service,都会使用私有

psd文件中截取固定大小的图片

1.选择需要操作的图层 使用选框工具, 设置固定大小和固定大小的值,在图层上拉取选区 2.使用移动工具  使用垂直.水平居中 使选择的icon在选区块中间 3.再选择好块区域调整好位置后 使用截取工具 回车 可得到想要的块

pdf文件中截取eps图片并压缩

最近遇到了一个问题,需要从pdf裁剪出其中部分的矢量图格式的图片,并保存为eps格式,方便使用. 最简单的方法就是先用acrobat pro将pdf进行页面抽取,并裁剪,剩下所需要的图片部分,然后另存为eps格式. 然而,原始的pdf文件4.06MB,抽取并裁剪后的子页面2.12MB,另存为的eps文件确有4.13MB. 为了将得到的eps文件进行压缩试了很多方法都不奏效,要么图片模糊了,要么就失败了,要么文件变得更大了.最后采用以下骚操作解决了: 把该eps文件用acrobat pdf重新打开

计算文件或一段内容的md5值

// 计算text内容MD5 QByteArray gAppTextChecksum(const QString& text) { QCryptographicHash crypto(QCryptographicHash::Md5); crypto.addData(text.toLocal8Bit()); return crypto.result().toHex(); } // 计算文件MD5 QByteArray gAppFileChecksum(const QString& fileP

接口自动化(Python)-利用正则表达式从返回的HTML文本中截取自己想要的值

例如一个功能接口的返回值 是一个HTML文本: 例如我们要取上图中标识的id的值,并且这个值是动态的,这是我们就需要用到正则表达式进行匹配. 如下是正则匹配的方法(代码中都有注释): 我们在真正使用的时候可以调用这个方法,然后对其中的一些值进行传参. 注意:当要去的值是动态值时,我们需要先将这个动态值定义成一个变量,如下: 再在具体的用例中给issueid赋值.