练习 md5sum

#include <stdio.h>
#include <string.h>
#include <stdint.h>

#define rol(x, n) ( ((x) << (n)) | ((x) >> (32-(n))) )

#define FF(b, c, d) (d ^ (b & (c ^ d)))
#define FG(b, c, d) FF (d, b, c)
#define FH(b, c, d) (b ^ c ^ d)
#define FI(b, c, d) (c ^ (b | ~d))

uint32_t cvt32(uint32_t i)
{
    union {
        uint32_t u;
        uint8_t c[4];
    } a, b;
    b.u = i;

    int n = 4;
    while(n--)
        a.c[n] = b.c[3-n];

    return a.u;
}

uint64_t cvt64(uint64_t i)
{
    union {
        uint64_t u;
        uint8_t c[8];
    } a, b;
    b.u = i;

    int n = 8;
    while(n--)
        a.c[n] = b.c[7-n];

    return a.u;
}

int is_big_endian;

void judge_endian()
{
    union {
        int i;
        char c;
    } u;

    u.i = 1;
    is_big_endian = (u.c == 0);
}

void md5_calc(uint32_t abcd[4], uint32_t data[16])
{
    uint32_t correct_words[16];

    int i;

    if(is_big_endian) {
        for(i = 0; i < 16; i++)
            correct_words[i] = cvt32(data[i]);
    } else {
        memcpy(correct_words, data, 64);
    }

    uint32_t * cwp = correct_words;

    uint32_t A = abcd[0];
    uint32_t B = abcd[1];
    uint32_t C = abcd[2];
    uint32_t D = abcd[3];

#define OP(a, b, c, d, s, T) do {          a += FF (b, c, d) + (*cwp++) + T;      a = rol(a, s);                         a += b;                            } while (0)

    /* Round 1.  */
    OP (A, B, C, D,  7, 0xd76aa478);
    OP (D, A, B, C, 12, 0xe8c7b756);
    OP (C, D, A, B, 17, 0x242070db);
    OP (B, C, D, A, 22, 0xc1bdceee);
    OP (A, B, C, D,  7, 0xf57c0faf);
    OP (D, A, B, C, 12, 0x4787c62a);
    OP (C, D, A, B, 17, 0xa8304613);
    OP (B, C, D, A, 22, 0xfd469501);
    OP (A, B, C, D,  7, 0x698098d8);
    OP (D, A, B, C, 12, 0x8b44f7af);
    OP (C, D, A, B, 17, 0xffff5bb1);
    OP (B, C, D, A, 22, 0x895cd7be);
    OP (A, B, C, D,  7, 0x6b901122);
    OP (D, A, B, C, 12, 0xfd987193);
    OP (C, D, A, B, 17, 0xa679438e);
    OP (B, C, D, A, 22, 0x49b40821);

#undef OP
#define OP(f, a, b, c, d, k, s, T) do {            a += f (b, c, d) + correct_words[k] + T;       a = rol(a, s);                                 a += b;                                    } while (0)

    /* Round 2.  */
    OP (FG, A, B, C, D,  1,  5, 0xf61e2562);
    OP (FG, D, A, B, C,  6,  9, 0xc040b340);
    OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
    OP (FG, B, C, D, A,  0, 20, 0xe9b6c7aa);
    OP (FG, A, B, C, D,  5,  5, 0xd62f105d);
    OP (FG, D, A, B, C, 10,  9, 0x02441453);
    OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
    OP (FG, B, C, D, A,  4, 20, 0xe7d3fbc8);
    OP (FG, A, B, C, D,  9,  5, 0x21e1cde6);
    OP (FG, D, A, B, C, 14,  9, 0xc33707d6);
    OP (FG, C, D, A, B,  3, 14, 0xf4d50d87);
    OP (FG, B, C, D, A,  8, 20, 0x455a14ed);
    OP (FG, A, B, C, D, 13,  5, 0xa9e3e905);
    OP (FG, D, A, B, C,  2,  9, 0xfcefa3f8);
    OP (FG, C, D, A, B,  7, 14, 0x676f02d9);
    OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);

    /* Round 3.  */
    OP (FH, A, B, C, D,  5,  4, 0xfffa3942);
    OP (FH, D, A, B, C,  8, 11, 0x8771f681);
    OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
    OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
    OP (FH, A, B, C, D,  1,  4, 0xa4beea44);
    OP (FH, D, A, B, C,  4, 11, 0x4bdecfa9);
    OP (FH, C, D, A, B,  7, 16, 0xf6bb4b60);
    OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
    OP (FH, A, B, C, D, 13,  4, 0x289b7ec6);
    OP (FH, D, A, B, C,  0, 11, 0xeaa127fa);
    OP (FH, C, D, A, B,  3, 16, 0xd4ef3085);
    OP (FH, B, C, D, A,  6, 23, 0x04881d05);
    OP (FH, A, B, C, D,  9,  4, 0xd9d4d039);
    OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
    OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
    OP (FH, B, C, D, A,  2, 23, 0xc4ac5665);

    /* Round 4.  */
    OP (FI, A, B, C, D,  0,  6, 0xf4292244);
    OP (FI, D, A, B, C,  7, 10, 0x432aff97);
    OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
    OP (FI, B, C, D, A,  5, 21, 0xfc93a039);
    OP (FI, A, B, C, D, 12,  6, 0x655b59c3);
    OP (FI, D, A, B, C,  3, 10, 0x8f0ccc92);
    OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
    OP (FI, B, C, D, A,  1, 21, 0x85845dd1);
    OP (FI, A, B, C, D,  8,  6, 0x6fa87e4f);
    OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
    OP (FI, C, D, A, B,  6, 15, 0xa3014314);
    OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
    OP (FI, A, B, C, D,  4,  6, 0xf7537e82);
    OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
    OP (FI, C, D, A, B,  2, 15, 0x2ad7d2bb);
    OP (FI, B, C, D, A,  9, 21, 0xeb86d391);

    abcd[0] += A;
    abcd[1] += B;
    abcd[2] += C;
    abcd[3] += D;
}

int main(int argc, char * argv[])
{
    judge_endian();

    if(argc != 2)
        return 1;

    FILE * f = fopen(argv[1], "rb");
    if(!f)
        return 2;

    uint32_t abcd[4] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 };

    uint64_t bit_sum = 0;

    for(;;) {
        char buf[128];
        size_t n = fread(buf, 1, 64, f);
        bit_sum += n * 8;

        if(n == 64) {
            md5_calc(abcd, (void *)buf);
        } else {
            memset(buf + n, 0, 128 - n);
            buf[n] = 0x80;

            uint64_t * end = (void *)( n < 56  ? &buf[64] : &buf[128]);
            end[-1] = is_big_endian ? cvt64(bit_sum) : bit_sum;

            md5_calc(abcd, (void *)buf);
            if(n >= 56)
                md5_calc(abcd, (void *)&buf[64]);

            break;
        }
    }

    fclose(f);

    int i;
    for(i = 0; i < 4; i++)
        printf("%08x", cvt32(abcd[i]));
    printf("\n");

    return 0;
}
时间: 2024-08-19 13:14:22

练习 md5sum的相关文章

shell echo -n md5sum使用方法

#!/bin/bash MYSQL='mysql -u*** -p*** -hws5 account' tmp="tmp" resultsource="resultsource" resultdest="resultdest" echo "select user_id,phone_num,email from user_accounts where length(user_id) = 11 limit 1"|${MYSQL}

shell脚本,如何破解字符串对应的md5sum前的RANDOM对应数字?

已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字?[[email protected] md5]# cat zifuchuang 21029299 00205d1c a3da1677 1f6d12dd 890684b [[email protected] md5]# cat shuzi.sh #!/bin/bash for i in `seq 1 65535` do a=`echo $i|md5s

md5sum校验文件完整性

1.简介 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改. MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的“指纹”(或称“报文摘要”),不同的文件产生相 同的报文摘要的可能性是非常非常之小的. 在linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序.一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行

Linux命令之乐--md5sum

md5sum命令用于生成和校验文件的md5值.它会逐位对文件的内容进行校验,它是常用与检查文件的完整性. 读取文件的MD5值 [[email protected] ~]# md5sum /usr/local/sbin/* >>file.md5 [[email protected] ~]# cat file.md5 74fd7e1f2730b5f8353d7a5f417747ef /usr/local/sbin/demo.sh 8bd8f8743b02a33882bca8fcb2234261 /

linux命令详解:md5sum命令

前言 在网络传输.设备之间转存.复制大文件等时,可能会出现传输前后数据不一致的情况.这种情况在网络这种相对更不稳定的环境中,容易出现.那么校验文件的完整性,也是势在必行的. 使用说明 md5sum命令用于生成和校验文件的md5值.它会逐位对文件的内容进行校验.是文件的内容,与文件名无关,也就是文件内容相同,其md5值相同.md5值是一个128位的二进制数据,转换成16进制则是32(128/4)位的进制值. md5校验,有很小的概率不同的文件生成的md5可能相同.比md5更安全的校验算法还有SHA

文件中用md5sum加密

从毕业工作已经很快过去三个月了,这期间一直用python编程,其中接触了好多很好用的命令,md5sum就是其中一个,它用来给文件加密,这里说的是文件当然文件夹不可以,对于常用python的朋友,我感觉他对os模块一定非常熟悉我这里就不多说了,你在shell命令栏里执行md5sum命令会直接输出结果没有返回如下: [email protected]:~# md5sum 文件名 cd548c93316211184c06e6f2f6f609ba  文件名       #其中那串16进制编码是随机产生的

md5sum命令的使用

在fedora中拷贝文件,再来解压,居然报错.拷贝N次再解压都是同样问题,然后尝试用md5sum来解决: 在服务器上下用md5sum来产生指纹(报文摘要): md5sum  Boe_lcd_driver.tgz   >  Boe_lcd_driver.md5 md5sum  Boe_lcd_driver.md5 输出:80a58edeab15943ed2917aaeafd0d890    Boe_lcd_driver.md5 然后拷贝文件Boe_lcd_driver.tgz 与该文件的Boe_l

md5sum

[[email protected] index]# ls index(13)(10).html index(13)(7).html index(13)(9).html index(13)(6).html index(13)(8).html [[email protected] index]# md5sum *.html > html.md5 [[email protected] index]# tail html.md5 bd34aed02df40946c5eb1e4ac298bea2 ind

shell md5sum

md5sum  out.a echo "fd_limit=$(ulimit -n), fd_used=$(ll /proc/4741/fd | wc -l)"   需找句柄,及fd使用情况

md5sum校验命令

MD5是message-digest algorithm 5(信息-摘要算法)的缩写,被广泛用于加密和解密技术上,它可以说是文件的"数字指纹".任何一个文件,无论是可执行程序.图像文件.临时文件或者其他任何类型的文件,也不管它体积多大,都有且只有一个独一无二的MD5信息值,并且如果这个文件被修改过,它的MD5值也将随之改变.因此,我们可以通过对比同一文件的MD5值,来校验这个文件是否被"篡改"过. MD5到底有什么用 当我们下载了文件后,如果想知道下载的这个文件和网