Android开发时涉及加密使用C++代码创建so库。

测试过程中发现相同字符串在MD5加密后值并不同,最后发现原来是原md5库中使用了typedef unsigned long int UINT4声明了32位类型,实际在64位手机中long int为64位,所以产生了差异。

解决办法也比较容易,将md5.h中的

typedef unsigned long int UINT4;

替换为:

typedef uint32_t UINT4;

同时添加include

#ifndef _MSC_VER
#include <stdint.h>
#else
#include "stdint.h"
#endif

附上修改后的md5.h和md5.cpp

md5.h:

#ifndef MD5_H
#define MD5_H#ifndef _MSC_VER
#include <stdint.h>
#else
#include "stdint.h"
#endif
/*
**********************************************************************
** md5.h -- Header file for implementation of MD5                   **
** RSA Data Security, Inc. MD5 Message Digest Algorithm             **
** Created: 2/17/90 RLR                                             **
** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version              **
** Revised (for MD5): RLR 4/27/91                                   **
**   -- G modified to have y&~z instead of y&z                      **
**   -- FF, GG, HH modified to add in last register done            **
**   -- Access pattern: round 2 works mod 5, round 3 works mod 3    **
**   -- distinct additive constant for each step                    **
**   -- round 4 added, working mod 7                                **
**********************************************************************
*//*
**********************************************************************
** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. **
**                                                                  **
** License to copy and use this software is granted provided that   **
** it is identified as the "RSA Data Security, Inc. MD5 Message     **
** Digest Algorithm" in all material mentioning or referencing this **
** software or this function.                                       **
**                                                                  **
** License is also granted to make and use derivative works         **
** provided that such works are identified as "derived from the RSA **
** Data Security, Inc. MD5 Message Digest Algorithm" in all         **
** material mentioning or referencing the derived work.             **
**                                                                  **
** RSA Data Security, Inc. makes no representations concerning      **
** either the merchantability of this software or the suitability   **
** of this software for any particular purpose.  It is provided "as **
** is" without express or implied warranty of any kind.             **
**                                                                  **
** These notices must be retained in any copies of any part of this **
** documentation and/or software.                                   **
**********************************************************************
*//* typedef a 32 bit type */
//typedef unsigned long int UINT4;
typedef uint32_t UINT4;/* Data structure for MD5 (Message Digest) computation */
typedef struct {UINT4 i[2];                   /* number of _bits_ handled mod 2^64 */UINT4 buf[4];                                    /* scratch buffer */unsigned char in[64];                              /* input buffer */unsigned char digest[16];     /* actual digest after MD5Final call */
} MD5_CTX;void MD5Init(MD5_CTX *mdContext);
void MD5Update(MD5_CTX *mdContext, unsigned char *inBuf, unsigned int inLen);
void MD5Final(MD5_CTX *mdContext);/*
**********************************************************************
** End of md5.h                                                     **
******************************* (cut) ********************************
*/
#endif

md5.cpp:


#include "md5.h"/*
**********************************************************************
** md5.c                                                            **
** RSA Data Security, Inc. MD5 Message Digest Algorithm             **
** Created: 2/17/90 RLR                                             **
** Revised: 1/91 SRD,AJ,BSK,JT Reference C Version                  **
**********************************************************************
*//*
**********************************************************************
** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. **
**                                                                  **
** License to copy and use this software is granted provided that   **
** it is identified as the "RSA Data Security, Inc. MD5 Message     **
** Digest Algorithm" in all material mentioning or referencing this **
** software or this function.                                       **
**                                                                  **
** License is also granted to make and use derivative works         **
** provided that such works are identified as "derived from the RSA **
** Data Security, Inc. MD5 Message Digest Algorithm" in all         **
** material mentioning or referencing the derived work.             **
**                                                                  **
** RSA Data Security, Inc. makes no representations concerning      **
** either the merchantability of this software or the suitability   **
** of this software for any particular purpose.  It is provided "as **
** is" without express or implied warranty of any kind.             **
**                                                                  **
** These notices must be retained in any copies of any part of this **
** documentation and/or software.                                   **
**********************************************************************
*//* -- include the following line if the md5.h header file is separate -- */
/* #include "md5.h" *//* forward declaration */
static void Transform();
static void TransformMD5(UINT4 *buf, UINT4 *in);static unsigned char PADDING[64] = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};/* F, G and H are basic MD5 functions: selection, majority, parity */
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))/* ROTATE_LEFT rotates x left n bits */
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */
/* Rotation is separate from addition to prevent recomputation */
#define FF(a, b, c, d, x, s, ac) \{(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}
#define GG(a, b, c, d, x, s, ac) \{(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}
#define HH(a, b, c, d, x, s, ac) \{(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}
#define II(a, b, c, d, x, s, ac) \{(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}void MD5Init(MD5_CTX *mdContext)
{mdContext->i[0] = mdContext->i[1] = (UINT4)0;/* Load magic initialization constants.*/mdContext->buf[0] = (UINT4)0x67452301;mdContext->buf[1] = (UINT4)0xefcdab89;mdContext->buf[2] = (UINT4)0x98badcfe;mdContext->buf[3] = (UINT4)0x10325476;
}void MD5Update(MD5_CTX *mdContext, unsigned char *inBuf, unsigned int inLen)
{UINT4 in[16];int mdi;unsigned int i, ii;/* compute number of bytes mod 64 */mdi = (int)((mdContext->i[0] >> 3) & 0x3F);/* update number of bits */if ((mdContext->i[0] + ((UINT4)inLen << 3)) < mdContext->i[0])mdContext->i[1]++;mdContext->i[0] += ((UINT4)inLen << 3);mdContext->i[1] += ((UINT4)inLen >> 29);while (inLen--) {/* add new character to buffer, increment mdi */mdContext->in[mdi++] = *inBuf++;/* transform if necessary */if (mdi == 0x40) {for (i = 0, ii = 0; i < 16; i++, ii += 4)in[i] = (((UINT4)mdContext->in[ii + 3]) << 24) |(((UINT4)mdContext->in[ii + 2]) << 16) |(((UINT4)mdContext->in[ii + 1]) << 8) |((UINT4)mdContext->in[ii]);TransformMD5(mdContext->buf, in);mdi = 0;}}
}void MD5Final(MD5_CTX *mdContext){UINT4 in[16];int mdi;unsigned int i, ii;unsigned int padLen;/* save number of bits */in[14] = mdContext->i[0];in[15] = mdContext->i[1];/* compute number of bytes mod 64 */mdi = (int)((mdContext->i[0] >> 3) & 0x3F);/* pad out to 56 mod 64 */padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);MD5Update(mdContext, PADDING, padLen);/* append length in bits and transform */for (i = 0, ii = 0; i < 14; i++, ii += 4)in[i] = (((UINT4)mdContext->in[ii + 3]) << 24) |(((UINT4)mdContext->in[ii + 2]) << 16) |(((UINT4)mdContext->in[ii + 1]) << 8) |((UINT4)mdContext->in[ii]);TransformMD5(mdContext->buf, in);/* store buffer in digest */for (i = 0, ii = 0; i < 4; i++, ii += 4) {mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF);mdContext->digest[ii + 1] =(unsigned char)((mdContext->buf[i] >> 8) & 0xFF);mdContext->digest[ii + 2] =(unsigned char)((mdContext->buf[i] >> 16) & 0xFF);mdContext->digest[ii + 3] =(unsigned char)((mdContext->buf[i] >> 24) & 0xFF);}
}/* Basic MD5 step. Transform buf based on in.
*/
static void TransformMD5(UINT4 *buf, UINT4 *in)
{UINT4 a = buf[0], b = buf[1], c = buf[2], d = buf[3];/* Round 1 */
#define S11 7
#define S12 12
#define S13 17
#define S14 22FF(a, b, c, d, in[0], S11, 3614090360); /* 1 */FF(d, a, b, c, in[1], S12, 3905402710); /* 2 */FF(c, d, a, b, in[2], S13, 606105819); /* 3 */FF(b, c, d, a, in[3], S14, 3250441966); /* 4 */FF(a, b, c, d, in[4], S11, 4118548399); /* 5 */FF(d, a, b, c, in[5], S12, 1200080426); /* 6 */FF(c, d, a, b, in[6], S13, 2821735955); /* 7 */FF(b, c, d, a, in[7], S14, 4249261313); /* 8 */FF(a, b, c, d, in[8], S11, 1770035416); /* 9 */FF(d, a, b, c, in[9], S12, 2336552879); /* 10 */FF(c, d, a, b, in[10], S13, 4294925233); /* 11 */FF(b, c, d, a, in[11], S14, 2304563134); /* 12 */FF(a, b, c, d, in[12], S11, 1804603682); /* 13 */FF(d, a, b, c, in[13], S12, 4254626195); /* 14 */FF(c, d, a, b, in[14], S13, 2792965006); /* 15 */FF(b, c, d, a, in[15], S14, 1236535329); /* 16 *//* Round 2 */
#define S21 5
#define S22 9
#define S23 14
#define S24 20GG(a, b, c, d, in[1], S21, 4129170786); /* 17 */GG(d, a, b, c, in[6], S22, 3225465664); /* 18 */GG(c, d, a, b, in[11], S23, 643717713); /* 19 */GG(b, c, d, a, in[0], S24, 3921069994); /* 20 */GG(a, b, c, d, in[5], S21, 3593408605); /* 21 */GG(d, a, b, c, in[10], S22, 38016083); /* 22 */GG(c, d, a, b, in[15], S23, 3634488961); /* 23 */GG(b, c, d, a, in[4], S24, 3889429448); /* 24 */GG(a, b, c, d, in[9], S21, 568446438); /* 25 */GG(d, a, b, c, in[14], S22, 3275163606); /* 26 */GG(c, d, a, b, in[3], S23, 4107603335); /* 27 */GG(b, c, d, a, in[8], S24, 1163531501); /* 28 */GG(a, b, c, d, in[13], S21, 2850285829); /* 29 */GG(d, a, b, c, in[2], S22, 4243563512); /* 30 */GG(c, d, a, b, in[7], S23, 1735328473); /* 31 */GG(b, c, d, a, in[12], S24, 2368359562); /* 32 *//* Round 3 */
#define S31 4
#define S32 11
#define S33 16
#define S34 23HH(a, b, c, d, in[5], S31, 4294588738); /* 33 */HH(d, a, b, c, in[8], S32, 2272392833); /* 34 */HH(c, d, a, b, in[11], S33, 1839030562); /* 35 */HH(b, c, d, a, in[14], S34, 4259657740); /* 36 */HH(a, b, c, d, in[1], S31, 2763975236); /* 37 */HH(d, a, b, c, in[4], S32, 1272893353); /* 38 */HH(c, d, a, b, in[7], S33, 4139469664); /* 39 */HH(b, c, d, a, in[10], S34, 3200236656); /* 40 */HH(a, b, c, d, in[13], S31, 681279174); /* 41 */HH(d, a, b, c, in[0], S32, 3936430074); /* 42 */HH(c, d, a, b, in[3], S33, 3572445317); /* 43 */HH(b, c, d, a, in[6], S34, 76029189); /* 44 */HH(a, b, c, d, in[9], S31, 3654602809); /* 45 */HH(d, a, b, c, in[12], S32, 3873151461); /* 46 */HH(c, d, a, b, in[15], S33, 530742520); /* 47 */HH(b, c, d, a, in[2], S34, 3299628645); /* 48 *//* Round 4 */
#define S41 6
#define S42 10
#define S43 15
#define S44 21II(a, b, c, d, in[0], S41, 4096336452); /* 49 */II(d, a, b, c, in[7], S42, 1126891415); /* 50 */II(c, d, a, b, in[14], S43, 2878612391); /* 51 */II(b, c, d, a, in[5], S44, 4237533241); /* 52 */II(a, b, c, d, in[12], S41, 1700485571); /* 53 */II(d, a, b, c, in[3], S42, 2399980690); /* 54 */II(c, d, a, b, in[10], S43, 4293915773); /* 55 */II(b, c, d, a, in[1], S44, 2240044497); /* 56 */II(a, b, c, d, in[8], S41, 1873313359); /* 57 */II(d, a, b, c, in[15], S42, 4264355552); /* 58 */II(c, d, a, b, in[6], S43, 2734768916); /* 59 */II(b, c, d, a, in[13], S44, 1309151649); /* 60 */II(a, b, c, d, in[4], S41, 4149444226); /* 61 */II(d, a, b, c, in[11], S42, 3174756917); /* 62 */II(c, d, a, b, in[2], S43, 718787259); /* 63 */II(b, c, d, a, in[9], S44, 3951481745); /* 64 */buf[0] += a;buf[1] += b;buf[2] += c;buf[3] += d;
}
 

C/C++解决MD5加密库,在32和64位平台下计算不同的问题。相关推荐

  1. 32位与64位机器下各数据类型长度对比

    64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂):可以访问大型数据库.本文介绍的是64位下C语言开发程序注意事项. 1 32 位和 64 ...

  2. php dll是下32还是64位,windows下关于boost 64位和32位库的编译详细介绍

    常用编译命令: cd E:\OpenSource\boost_1_63_0\boost_1_63_0 编译32位库: x86环境下编译得先从开始菜单启动Visual Studio的Visual Stu ...

  3. 如何在32、64位Windows7下玩英雄无敌3

    最近突然怀旧了,听老歌玩老游戏,特别怀念英雄无敌3.虽然以后还出了好多版本,也做的漂亮了很多,但是真正好玩的还是3代,其他的都外表华丽,但内容和玩法华而不实. 以前都是在XP上完的,换了新的WIN7( ...

  4. c 语言测量字节数,用C/C++测试编译器中关键字占多少个字节?以及16/32/64位平台下的字节数...

    转自这位大佬:https://blog.csdn.net/cherrydreamsover/article/details/81410364 https://blog.csdn.net/cherryd ...

  5. 32位与64位下各类型长度对比

    64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂):可以访问大型数据库.本文介绍的是64位下C语言开发程序注意事项. 1. 32 位和 64 ...

  6. java 32位兼容_Java 32位与64位兼容性

    问题 Java代码是否可以在32位JDK中构建和编译成32位字节代码,在64位JVM中工作?或者64位JVM是否需要64位字节代码? 为了提供更多细节,我的代码在运行32位JVM的Solaris环境中 ...

  7. 基于windriver开发驱动,64位平台和32位平台一次解决

    一: 在基于windriver开发驱动来说,对于个人并不喜欢这种东西,但是效率需求,需要使用这种中间件.但是在创建工程的时候往往是创建一个64位的工程,因为我们当前电脑64位,在里面我们可能直接发布出 ...

  8. 在64位linux下编译32位程序

    一般情况下我们最好是在一个平台上编译本平台的二进制程序,比如在32位平台上编译32位程序而在64位平台上编译64位程序. 现在64位的系统(这里主要指x86_64系统,包括AMD64和Intel的EM ...

  9. 转载】将32位代码向64位平台移植的注意事项

    转载]将32位代码向64位平台移植的注意事项 新近的64位平台在二进制上与32位应用程序兼容,这意味着可以非常简单地移植现有的程序.许多目前在32位平台上运行良好的程序也许不必移植,除非程序有以下要求 ...

最新文章

  1. Elasticsearch之数据建模
  2. 全国首套中小学生人工智能教材在沪亮相
  3. [转] asp.net core Introducing View Components
  4. HTML全面深入学习-select的optgroup分组
  5. 坚果云下载的文件夹在哪_坚果云文件夹在哪?如何直接访问坚果云文件夹?
  6. 巧用组策略技术禁用办公室QQ聊天
  7. Xshell的一些实用技巧
  8. Linux学习:第一章-Linux简介
  9. weakhashmap_Java WeakHashMap entrySet()方法与示例
  10. 简单51单片机c语言编程流水灯,51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析...
  11. 【转】对 Rust 语言的分析
  12. 未来10年,将被人工智能/机器学习/大数据颠覆的三大行业
  13. 如何用 Lua 查询青云的主机
  14. reactbootstrap php,什么是React-Bootstrap
  15. 一个废物大学生对于视频爬取的小小的总结
  16. Java 中status意思_struts2中iterator里属性status=stat什么意思
  17. 一周信创舆情观察(1.10~1.16)
  18. H: Yet Another Crosses Problem
  19. asuswrt 单臂路由_Padavan(老毛子) 最简单臂路由组网 VLAN 设置
  20. iphone上下左右手势判断代码

热门文章

  1. 极客日报第6期:天猫京东双十一总交易额7697亿元,你贡献了多少?.NET 5.0 正式版发布!
  2. 智能家居市场回暖,小米、雄迈等品牌双十一交易额创新高
  3. 多项式回归 Polynomial Regression
  4. H.266/VVC视频编解码标准
  5. 统计学真的有那么可怕吗?这儿有可以手算的效能分析
  6. Cty的Linux学习笔记(十五——wget)
  7. 关于公众号跳转小程序的签名问题
  8. Centos7.5 搭建Prometheus实时监控平台,配合Grafana图表展示,详细过程
  9. 2020全球C++及系统软件技术大会成功落下帷幕
  10. 微信小程序腾讯位置服务城市选择器