如何变形一个 MD5 算法?Android 实现 + OLLVM 防护实战解析

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

MD5是一种哈希函数,用于将任意长度的数据映射为一个固定长度的哈希值。它由 Ron Rivest 在 1991 年设计,是继 MD4 之后的改进版本。

MD5 的基本特征:

  • 固定长度输出:将任意长度的数据转换为 128 位(16 字节) 的哈希值,通常以 32 位十六进制 字符串表示。

  • 不可逆性:无法从哈希值反推原始数据。

  • 雪崩效应:输入的微小变化会导致哈希值完全不同。

  • 抗碰撞性较弱:不同输入产生相同哈希值的概率较低,但已存在有效的碰撞攻击。

  • 计算速度快:采用简单的位运算,处理速度快,适合大数据量。

标准 MD5

标准 MD5 的 C++ 实现如下:

md5.h

#ifndef __MD5_INCLUDE__

/* typedef a 32-bit type */
#ifdef _LP64
typedef unsigned int UINT4;
typedef int          INT4;
#else
typedef unsigned long UINT4;
typedef long          INT4;
#endif
#define _UINT4_T

/* 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 MD5_Init (MD5_CTX *mdContext);
void MD5_Update (MD5_CTX *mdContext, unsigned char *inBuf, unsigned int inLen);
void MD5_Final (unsigned char hash[], MD5_CTX *mdContext);

#define __MD5_INCLUDE__
#endif /* __MD5_INCLUDE__ */

md5.cpp

#include <string>
#include "md5.h"


/* forward declaration */
static void Transform(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, H and I are basic MD5 functions */
#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); \
  }

#ifdef __STDC__
#define UL(x)    x##U
#else
#define UL(x)   x
#endif

/* The routine MD5_Init initializes the message-digest context
   mdContext. All fields are set to zero.
 */
void MD5_Init(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;
}

/* The routine MD5Update updates the message-digest context to
   account for the presence of each of the characters inBuf[0..inLen-1]
   in the message whose digest is being computed.
 */
void MD5_Update(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] &g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值