#include<math.h>
#include<string.h>
#include<malloc.h>
#include<stdio.h>
#include<assert.h>
#define BLOCK_LEN 64
#define MAX_BLOCKS 9
#define MESSAGE_LEN (BLOCK_LEN*(MAX_BLOCKS-1))
#define RESULT_LEN 33
//MD5算法的上下文,保存一些状态,中间数据,结果
typedef struct md5_data {
char *Ms[MAX_BLOCKS];//保存块指针
int nblocks;//保存块数
long long len;//处理的数据的长度
long long bits;//处理的数据的位数
int H[4];/* 128-bit algorithm internal hashing state */
char *str;//待加密的字符串指针
char *result;//字符串结果指针
} md5_data;
typedef struct Encoder_data {
char message[MESSAGE_LEN];//待加密的字符串
char result[RESULT_LEN];//字符串结果指
}Encoder_data;
static inline int S(int x, int s) { //因为存储字符串用的是int类型,所以循环移位要考虑符号的问题
int temp1 = x << s;
int temp2 = x >> (32 - s);
int temp3 = 0;
for(int i = 0; i<s; i++) {
temp3 += temp2 & (1<<i);
}
return temp1 | temp3;
}
static inline int F1(int x ,int y, int z) {
return (x & y) | ((~x) & z);
}
static inline int F2(int x, int y, int z) {
return (x & z) | (y & (~z));
}
static inline int F3(int x, int y, int z) {
return x ^ y ^ z;
}
static inline int F4(int x, int y, int z) {
return y ^ (x | (~z));
}
static inline int F(int t,int x, int y, int z) {
switch(t/16){
case 0:// 0 <= t< 16
return F1(x , y, z);
case 1:// 16 <= t< 32
return
MD5加密算法C语言实现
最新推荐文章于 2024-09-28 14:29:16 发布