md5加密

本文介绍了一个简单的MD5算法实现过程,包括填充函数、位移操作和核心迭代过程等关键技术细节。通过对输入字符串进行一系列变换得到固定长度的摘要,确保了数据的完整性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#include<iostream>
#include<string>
using namespace std;
#define shift(x, n) (((x) << (n)) | ((x) >> (32-(n))))//右移的时候,高位一定要补零,而不是补充符号位
#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)))
#define A 0x67452301
#define B 0xefcdab89
#define C 0x98badcfe
#define D 0x10325476
//strBaye的长度
unsigned int strlength;
//A,B,C,D的临时变量
unsigned int atemp;
unsigned int btemp;
unsigned int ctemp;
unsigned int dtemp;
//常量ti unsigned int(abs(sin(i+1))*(2pow32))
const unsigned int k[]={
        0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,
        0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,
        0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,
        0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,
        0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
        0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,
        0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,
        0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,
        0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,
        0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,
        0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,
        0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,
        0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391};
//向左位移数
const unsigned int s[]={7,12,17,22,7,12,17,22,7,12,17,22,7,
        12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,
        4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,
        15,21,6,10,15,21,6,10,15,21,6,10,15,21};
const char str16[]="0123456789abcdef";
void mainLoop(unsigned int M[])
{
    unsigned int f,g;
    unsigned int a=atemp;
    unsigned int b=btemp;
    unsigned int c=ctemp;
    unsigned int d=dtemp;
    for (unsigned int i = 0; i < 64; i++)
    {
        if(i<16){
            f=F(b,c,d);
            g=i;
        }else if (i<32)
        {
            f=G(b,c,d);
            g=(5*i+1)%16;
        }else if(i<48){
            f=H(b,c,d);
            g=(3*i+5)%16;
        }else{
            f=I(b,c,d);
            g=(7*i)%16;
        }
        unsigned int tmp=d;
        d=c;
        c=b;
        b=b+shift((a+f+k[i]+M[g]),s[i]);
        a=tmp;
    }
    atemp=a+atemp;
    btemp=b+btemp;
    ctemp=c+ctemp;
    dtemp=d+dtemp;
}
/*
*填充函数
*处理后应满足bits≡448(mod512),字节就是bytes≡56(mode64)
*填充方式为先加一个1,其它位补零
*最后加上64位的原来长度
*/
unsigned int* add(string str)
{
    unsigned int num=((str.length()+8)/64)+1;//以512位,64个字节为一组
    unsigned int *strByte=new unsigned int[num*16];    //64/4=16,所以有16个整数
    strlength=num*16;
    for (unsigned int i = 0; i < num*16; i++)
        strByte[i]=0;
    for (unsigned int i=0; i <str.length(); i++)
    {
        strByte[i>>2]|=(str[i])<<((i%4)*8);//一个整数存储四个字节,i>>2表示i/4 一个unsigned int对应4个字节,保存4个字符信息
    }
    strByte[str.length()>>2]|=0x80<<(((str.length()%4))*8);//尾部添加1 一个unsigned int保存4个字符信息,所以用128左移
    /*
    *添加原长度,长度指位的长度,所以要乘8,然后是小端序,所以放在倒数第二个,这里长度只用了32位
    */
    strByte[num*16-2]=str.length()*8;
    return strByte;
}
string changeHex(int a)
{
    int b;
    string str1;
    string str="";
    for(int i=0;i<4;i++)
    {
        str1="";
        b=((a>>i*8)%(1<<8))&0xff;   //逆序处理每个字节
        for (int j = 0; j < 2; j++)
        {
            str1.insert(0,1,str16[b%16]);
            b=b/16;
        }
        str+=str1;
    }
    return str;
}
string getMD5(string source)
{
    atemp=A;    //初始化
    btemp=B;
    ctemp=C;
    dtemp=D;
    unsigned int *strByte=add(source);
    for(unsigned int i=0;i<strlength/16;i+=16)
    {
        unsigned int num[16];
        for(unsigned int j=0;j<16;j++)
            num[j]=strByte[i*16+j];
        mainLoop(num);
    }
    return changeHex(atemp).append(changeHex(btemp)).append(changeHex(ctemp)).append(changeHex(dtemp));
}
unsigned int main()
{
    string ss;
    cin>>ss;
    string s=getMD5(ss);
    cout<<s;
 int i;
 cin>>i;
    return 0;
}
### 使用Python中的`hashlib`模块实现MD5加密 在Python中,可以利用内置的`hashlib`库轻松完成MD5加密操作。以下是具体的方法: #### 导入必要的模块 为了使用MD5加密功能,首先需要导入`hashlib`模块[^1]。 ```python import hashlib ``` #### 创建MD5对象并更新数据 通过调用`hashlib.md5()`创建一个MD5哈希对象,并使用`.update(data)`方法传入待加密的数据。注意,`data`必须是字节类型(bytes),因此如果输入的是字符串,则需先将其编码为字节串。 ```python data = "example_password".encode('utf-8') # 将字符串转换为字节类型 md5_hash = hashlib.md5() md5_hash.update(data) ``` #### 获取加密结果 可以通过`.hexdigest()`方法获取最终的十六进制表示形式的MD5值。 ```python encrypted_result = md5_hash.hexdigest() print(encrypted_result) # 输出:2346bc9edbf3f7dbe0dc9d3f8c0ddc7a ``` 完整的代码如下所示: ```python import hashlib def encrypt_md5(input_string): data = input_string.encode('utf-8') md5_hash = hashlib.md5() md5_hash.update(data) encrypted_result = md5_hash.hexdigest() return encrypted_result # 测试函数 password = "example_password" result = encrypt_md5(password) print(f"The MD5 hash of '{password}' is {result}") ``` 上述代码定义了一个名为`encrypt_md5`的函数,用于接收任意字符串作为参数,并返回该字符串对应的MD5散列值。 --- 关于加盐处理,可以在原始密码基础上附加一段随机字符后再进行MD5加密,从而增加安全性[^2]^。例如: ```python import hashlib import os def salt_encrypt_md5(input_string, salt=os.urandom(16).hex()): combined_data = (input_string + salt).encode('utf-8') md5_hash = hashlib.md5() md5_hash.update(combined_data) encrypted_result = md5_hash.hexdigest() return encrypted_result, salt # 测试带盐加密 password = "example_password" hashed_value, used_salt = salt_encrypt_md5(password) print(f"Salted Hash: {hashed_value}, Salt Used: {used_salt}") ``` 此脚本不仅完成了基本的MD5加密,还引入了动态生成的盐值以增强保护力度。 --- ### 注意事项 尽管MD5是一种广泛应用的摘要算法,但由于其存在碰撞风险,现已不推荐单独依赖它来进行敏感信息安全保障工作[^4]。对于现代应用而言,建议采用更安全的替代方案如SHA-256或其他强健型哈希技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值