关于extern和int main()的结构问题

本帖最后由 hashcat 于 2015-09-20 12:34:50 编辑

这是c实现md5加密的代码,报错部分是两处extern,其实也就是两处extern需要改动,但是试了半天,没搞懂要怎么改...

#include

#include

#define MD5_ROTL(a,b) (MD5_tmp=(a),((MD5_tmp>>(32-b))&(0x7fffffff>>(31-b)))|(MD5_tmp<

#define MD5_F(X,Y,Z) ((X&Y)|((~X)&Z))

#define MD5_G(X,Y,Z) ((X&Z)|(Y&(~Z)))

#define MD5_H(X,Y,Z) (X^Y^Z)

#define MD5_I(X,Y,Z) (Y^(X|(~Z)))

#define MD5_FF(a,b,c,d,Mj,s,ti) a=b+MD5_ROTL((a+MD5_F(b,c,d)+Mj+ti),s)

#define MD5_GG(a,b,c,d,Mj,s,ti) a=b+MD5_ROTL((a+MD5_G(b,c,d)+Mj+ti),s)

#define MD5_HH(a,b,c,d,Mj,s,ti) a=b+MD5_ROTL((a+MD5_H(b,c,d)+Mj+ti),s)

#define MD5_II(a,b,c,d,Mj,s,ti) a=b+MD5_ROTL((a+MD5_I(b,c,d)+Mj+ti),s)

#define MD5main \

{MD5_FF(a, b, c, d, M[0], 7, 0xd76aa478);\

MD5_FF(d, a, b, c, M[1], 12, 0xe8c7b756);\

MD5_FF(c, d, a, b, M[2], 17, 0x242070db);\

MD5_FF(b, c, d, a, M[3], 22, 0xc1bdceee);\

MD5_FF(a, b, c, d, M[4], 7, 0xf57c0faf);\

MD5_FF(d, a, b, c, M[5], 12, 0x4787c62a);\

MD5_FF(c, d, a, b, M[6], 17, 0xa8304613);\

MD5_FF(b, c, d, a, M[7], 22, 0xfd469501);\

MD5_FF(a, b, c, d, M[8], 7, 0x698098d8);\

MD5_FF(d, a, b, c, M[9], 12, 0x8b44f7af);\

MD5_FF(c, d, a, b, M[10], 17, 0xffff5bb1);\

MD5_FF(b, c, d, a, M[11], 22, 0x895cd7be);\

MD5_FF(a, b, c, d, M[12], 7, 0x6b901122);\

MD5_FF(d, a, b, c, M[13], 12, 0xfd987193);\

MD5_FF(c, d, a, b, M[14], 17, 0xa679438e);\

MD5_FF(b, c, d, a, M[15], 22, 0x49b40821);\

MD5_GG(a, b, c, d, M[1], 5, 0xf61e2562);\

MD5_GG(d, a, b, c, M[6], 9, 0xc040b340);\

MD5_GG(c, d, a, b, M[11], 14, 0x265e5a51);\

MD5_GG(b, c, d, a, M[0], 20, 0xe9b6c7aa);\

MD5_GG(a, b, c, d, M[5], 5, 0xd62f105d);\

MD5_GG(d, a, b, c, M[10], 9, 0x02441453);\

MD5_GG(c, d, a, b, M[15], 14, 0xd8a1e681);\

MD5_GG(b, c, d, a, M[4], 20, 0xe7d3fbc8);\

MD5_GG(a, b, c, d, M[9], 5, 0x21e1cde6);\

MD5_GG(d, a, b, c, M[14], 9, 0xc33707d6);\

MD5_GG(c, d, a, b, M[3], 14, 0xf4d50d87);\

MD5_GG(b, c, d, a, M[8], 20, 0x455a14ed);\

MD5_GG(a, b, c, d, M[13], 5, 0xa9e3e905);\

MD5_GG(d, a, b, c, M[2], 9, 0xfcefa3f8);\

MD5_GG(c, d, a, b, M[7], 14, 0x676f02d9);\

MD5_GG(b, c, d, a, M[12], 20, 0x8d2a4c8a);\

MD5_HH(a, b, c, d, M[5], 4, 0xfffa3942);\

MD5_HH(d, a, b, c, M[8], 11, 0x8771f681);\

MD5_HH(c, d, a, b, M[11], 16, 0x6d9d6122);\

MD5_HH(b, c, d, a, M[14], 23, 0xfde5380c);\

MD5_HH(a, b, c, d, M[1], 4, 0xa4beea44);\

MD5_HH(d, a, b, c, M[4], 11, 0x4bdecfa9);\

MD5_HH(c, d, a, b, M[7], 16, 0xf6bb4b60);\

MD5_HH(b, c, d, a, M[10], 23, 0xbebfbc70);\

MD5_HH(a, b, c, d, M[13], 4, 0x289b7ec6);\

MD5_HH(d, a, b, c, M[0], 11, 0xeaa127fa);\

MD5_HH(c, d, a, b, M[3], 16, 0xd4ef3085);\

MD5_HH(b, c, d, a, M[6], 23, 0x04881d05);\

MD5_HH(a, b, c, d, M[9], 4, 0xd9d4d039);\

MD5_HH(d, a, b, c, M[12], 11, 0xe6db99e5);\

MD5_HH(c, d, a, b, M[15], 16, 0x1fa27cf8);\

MD5_HH(b, c, d, a, M[2], 23, 0xc4ac5665);\

MD5_II(a, b, c, d, M[0], 6, 0xf4292244);\

MD5_II(d, a, b, c, M[7], 10, 0x432aff97);\

MD5_II(c, d, a, b, M[14], 15, 0xab9423a7);\

MD5_II(b, c, d, a, M[5], 21, 0xfc93a039);\

MD5_II(a, b, c, d, M[12], 6, 0x655b59c3);\

MD5_II(d, a, b, c, M[3], 10, 0x8f0ccc92);\

MD5_II(c, d, a, b, M[10], 15, 0xffeff47d);\

MD5_II(b, c, d, a, M[1], 21, 0x85845dd1);\

MD5_II(a, b, c, d, M[8], 6, 0x6fa87e4f);\

MD5_II(d, a, b, c, M[15], 10, 0xfe2ce6e0);\

MD5_II(c, d, a, b, M[6], 15, 0xa3014314);\

MD5_II(b, c, d, a, M[13], 21, 0x4e0811a1);\

MD5_II(a, b, c, d, M[4], 6, 0xf7537e82);\

MD5_II(d, a, b, c, M[11], 10, 0xbd3af235);\

MD5_II(c, d, a, b, M[2], 15, 0x2ad7d2bb);\

MD5_II(b, c, d, a, M[9], 21, 0xeb86d391);\

A = a += A, B = b += B, C = c += C, D = d += D;}

int main(){

long MD5_tmp;

extern char* StrMD5(const char* str, long length, char* md5){

/*

计算字符串MD5

参数说明:

str         字符串指针

length      字符串长度

md5         用于保存MD5的字符串指针

返回值为参数md5

*/

char *pp;

long l, i, *M, abcdtmp[4], A, B, C, D, a, b, c, d;

a = A = 0x67452301, b = B = 0xEFCDAB89, c = C = 0x98BADCFE, d = D = 0x10325476;

l = length + ((length % 64 > 56) ? (128 - length % 64) : (64 - length % 64));

if(!(pp = (char*)malloc((unsigned long)l))) return 0;

for (i = 0; i

for (pp[i++] = 128; i

*((long*)(pp + l - 8)) = length <

for (i = 0; i

M = (long*)pp;

MD5main

}

free(pp);

abcdtmp[0] = a, abcdtmp[1] = b, abcdtmp[2] = c, abcdtmp[3] = d;

for (pp = (char*)abcdtmp, i = 0; i

return md5;

}

extern char* FileMD5(const char* file, char* md5){

/*

计算文件MD5

参数说明:

file        文件路径字符串指针

md5         用于保存MD5的字符串指针

返回值为参数md5

*/

FILE* fh;

char* addlp;

long* temp;

long addlsize, j, M[16], abcdtmp[4], A, B, C, D, a, b, c, d;

long long length, i, cpys;

void *pp, *ppend;

fh = fopen(file, "rb");

fseek(fh, 0, SEEK_END);

length = _ftelli64(fh);

a = A = 0x67452301, b = B = 0xEFCDAB89, c = C = 0x98BADCFE, d = D = 0x10325476;

addlsize = (56 - length % 64 > 0) ? (64) : (128);

if (!(addlp = (char*)malloc(addlsize))) return 0;

cpys = ((length - (56 - length % 64)) > 0) ? (length - length % 64) : (0);

j = (long)(length - cpys);

fseek(fh, -j, SEEK_END);

fread(addlp, 1, j, fh);

for (addlp[j++] = 128; j

pp = addlp + addlsize - 8;

*((long long *)pp) = length <

for (rewind(fh); 16 == fread(M, 4, 16, fh);)

MD5main

for (temp = addlp, ppend = addlp + addlsize; temp

for (i = 0; i

MD5main

}

free(addlp);fclose(fh);

abcdtmp[0] = a, abcdtmp[1] = b, abcdtmp[2] = c, abcdtmp[3] = d;

for (addlp = (char*)abcdtmp, i = 0; i

return md5;

}

}

下面是报错。

\Untitled1.c|80|error: nested function 'StrMD5' declared 'extern'

\Untitled1.c|109|error: nested function 'FileMD5' declared 'extern'

------解决思路----------------------

去掉extern声明试试

c语言中entern int x y,关于extern和int main()的结构有关问题相关推荐

  1. 在c语言中把x和y互换怎么编译,已知int x=10,y=12;编程将x和y的值相互交换

    int main(){Intx=1,a=1;Do{ a+a+1; } While(x); Return 0;} 则语句& 书写有错.intx=1,a=1;do{a=a+1;}while(x); ...

  2. 在C语言中,double、long、unsigned、int、char类型数据所占字节数

    和机器字长及编译器有关系: 所以,int,long int,short int的宽度都可能随编译器而异.但有几条铁定的原则(ANSI/ISO制订的): 1 sizeof(short int)<= ...

  3. c语言unsigned占几字节,在C语言中,double、long、unsigned、int、char类型数据所占字节数(示例代码)...

    和机器字长及编译器有关系: 所以,int,long int,short int的宽度都可能随编译器而异.但有几条铁定的原则(ANSI/ISO制订的): 1 sizeof(short int)<= ...

  4. c语言unsigned占几字节,在C语言中,double、long、unsigned、int、char类型数据所占字节数...

    unsigned 是无符号的意思. 例如: 16位编译器 char :1个字节 char*(即指针变量): 2个字节 short int : 2个字节 int: 2个字节 unsigned int : ...

  5. c语言中的pow(x, y)的使用

    pow(10,2)用整形输出结果为0 用浮点数输出结果是100.0是什么情况 printf("%d",pow(10,2));输出是0 printf("%f",p ...

  6. python语句x 3 3执行_Python语言中,x=2,y=3,执行x,y=y,x之后,x和y的值分别是什么?...

    2021-01-30 02:27阅读 112 When my wife, who is a Spanish spent her first winter in London a few years a ...

  7. c语言is int number,C语言中NSInteger,NSNumber以及Int的区别

    NSInteger和NSNumber 首先:NSInteger,NSNumber并没有什么关系,更不要想当然的以为二者还有什么继承关系,甚至还有人问NSInteger是不是NSNumber的子类?答案 ...

  8. C语言int的字节数跟什么有关,C语言中int型字长和什么有关

    满意答案 momo猫万岁 2018.01.07 采纳率:50%    等级:8 已帮助:1710人 这个和操作系统有关,一般int的长度都会采用机器字长,比如win32系统,int占4字节,32位: ...

  9. c语言int作用,c语言中int的用法有哪些

    c语言中int的用法有哪些 C/C++编程语言中,int表示整型变量,是一种数据类型,用于定义一个整型变量,在不同编译环境有不同的大小,不同编译运行环境大小不同下面小编给大家整理了c语言中int的用法 ...

最新文章

  1. Jupyter官方神器:可视化 Debug 工具!
  2. 把 Bug 晾几天就能解决了!!! | 每日趣闻
  3. shell编程--流程控制for,do-while,if-then,break,continue,case等
  4. SpringBoot Bean配置
  5. php一对多聊天程序代码,微信小程序实现一对多发消息
  6. AcWing 1381. 阶乘
  7. javafx_JavaFX技巧4:总结
  8. 看!闲鱼又开源了一个 Flutter 开发利器
  9. Reaction to 构造之法 of Software Engineering From The First Chapter toThe Fifth Chapter
  10. 中国首台超级计算机“天河一号,我国首台超级计算机“天河一号”超负荷运行...
  11. centos离线安装docker-ce 18.03.0-ce
  12. 双机互联攻略之超强、完全篇!
  13. c语言乘法运算结果小数位数,如何用c语言计算小数点后位数
  14. 浅析ERP系统--质量
  15. 【基金研究】《公募权益类基金投资者盈利洞察报告》
  16. 同方台式计算机密码,清华同方的品牌机进bios需要密码,怎么清除它
  17. C++ 控制台创建窗口,加载png图片,实现悬浮窗
  18. 【读书笔记】-《工业互联网-技术与实践》
  19. 微信步数-小米运动步数霸榜教程
  20. 解决win10在安装Android-studio时提示HAXM无法安装问题

热门文章

  1. html5同心圆代码,HTML5/Canvas 鼠标跟随的同心圆
  2. 有关计算机组成原理知识的论文,关于计算机组成原理的论文_计算机组成原理_图灵机的组成...
  3. 《C语言深度解剖》中的.c/.h 程序模板及函数注释风格
  4. android 日历仿IOS,基于Android week view仿小米和iphone日历效果
  5. table每行自动触发ajax,table.ajax.reload()成功后未触发:function()
  6. ARM中断分析之四:WinCE的OAL层的中断分析
  7. 写在S3C2440A平台+winCE5.0+NAND +HIVE注册表的实现
  8. mybatis删除成功返回0_你还在用分页?试试 MyBatis 流式查询,真心强大!
  9. 【转】WPF XAML X名称空间详解
  10. Dynamics 365 CRM 开发架构简介