MD5算法实验报告(XDU物联网安全)

MD5加密算法总结                                                   MD5加密算法总结                                                        (一)概述     MD5的全称是message-digest algorithm 5(信息-摘要算法),在90年代初由MIT laboratory for comput 阅读详情

个人博客地址:https://travis1024.github.io/

MD5算法实验

一、实验目的

编程实现MD5算法,深入理解MD5加密解密原理

二、实验所用仪器(或实验环境)

计算机科学与技术学院实验中心,可接入Internet网台式机44台。

三、实验基本原理及要求

1.实验原理

第一步:添加填充位,如果输入明文的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的长度为N*512+448(bit)

第二步:填充长度,在第一步结果之后再填充上原消息的长度,可用来进行的存储长度为64位。如果消息长度大于2^64,则只使用其低64位的值,即(消息长度 对 2^64取模)。在此步骤进行完毕后,最终消息长度就是N x 512+448+64=(N+1) x 512。

第三步,初始化缓冲区, 一个128bit的缓冲区可用于保存hash函数中间和最终结果。可表示为4个32bit的寄存器(A,B,C,D). 其中A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16。如果在程序中定义应该是 A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L

第四步:循环处理数据

其中每一轮操作为

第五步,级联输出,给出MD5算法加密后的密文。

2.实验要求

明文自定义(例如,可以是一句英文名言名句),利用MD5算法对其加密,给出实验过程以及加密结果。

四、实验步骤及实验数据记录:(要有文字描述和必要截图)

1.算法说明

MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

2.代码结构
3.具体实现步骤

(1)我们第一步要做的就是填充,如果输入信息的长度(bit)对512求余的结果 不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的长度就为N*512+448(bit);代码如下图所示:

(2)将输入信息的原始长度b(bit)表示成一个64-bit的数字,把它添加到上一步的结果后面(在32位的机器上,这64位将用2个字来表示并且低位在前)。当遇到b大于2^64这种极少的情况时,b的高位被截去,仅使用b的低64位。经过上面两步,数据就被填补成长度为512(bit)的倍数。也就是说,此时的数据长度是16个字(32byte)的整数倍。代码如下图所示:

(3)装入标准的幻数(四个整数),用一个四个字的缓冲器(A,B,C,D)来计算报文摘要,A,B,C,D分别是32位的寄存器,初始化使用的是十六进制表示的数字,注意低字节在前:

​ word A: 01 23 45 67
​ word B: 89 ab cd ef
​ word C: fe dc ba 98
​ word D: 76 54 32 10

(4)四轮循环运算:循环的次数是分组的个数(N+1)

① 定义4个辅助函数,每个函数的输入是三个32位的字,输出是一个32位的字:(&是与,|是或,~是非,^是异或),代码如下图所示:

​ F(X,Y,Z)=(X&Y)|((~X)&Z)
​ G(X,Y,Z)=(X&Z)|(Y&(~Z))
​ H(X,Y,Z)=XYZ
​ I(X,Y,Z)=Y^(X|(~Z))

②设Mj表示消息的第j个子分组(从0到15):代码如下图所示:

​ FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<<s)
​ GG(a,b,c,d,Mj,s,ti)表示a=b+((a+G(b,c,d)+Mj+ti)<<<s)
​ HH(a,b,c,d,Mj,s,ti)表示a=b+((a+H(b,c,d)+Mj+ti)<<<s)
​ II(a,b,c,d,Mj,s,ti)表示a=b+((a+I(b,c,d)+Mj+ti)<<<s)

(5)每轮循环后,将A,B,C,D分别加上a,b,c,d,然后进入下一循环

五、实验结果分析

1.实验结果

开始我们传入的字符串为:“Embrace the glorious mess that you are”,最后得到的MD5值为“ADE90D3E14F9114D0EF4626971DE0BD0”。

2.实验总结

任何消息经过散列函数处理后,都会产生一个唯一的散列值,这个散列值可以用来验证消息的完整性,MD5也正是利用了这个特点,通过对MD5算法原理的学习及实验,我对散列函数压缩性、容易计算、抗修改性的特点有了更加深刻的体会,对于MD5算法的验证基本上只有借助计算机才可以进行,因为MD5算法在计算量上相对来说还是比较复杂的,通过计算机我们可以很简单的进行求和运算,当完成最后一个明文的分组运算时,A、B、C、D中的数值就是最后的结果(即散列函数值)。

六、开源地址

实验报告及代码开源地址(Github)

七、源代码

class MD5{
    //初始化MD5参数
    static final int S11 = 7;
    static final int S12 = 12;
    static final int S13 = 17;
    static final int S14 = 22;
    static final int S21 = 5;
    static final int S22 = 9;
    static final int S23 = 14;
    static final int S24 = 20;
    static final int S31 = 4;
    static final int S32 = 11;
    static final int S33 = 16;
    static final int S34 = 23;
    static final int S41 = 6;
    static final int S42 = 10;
    static final int S43 = 15;
    static final int S44 = 21;
    //定义标准幻数
    private static final long A=0x67452301L;
    private static final long B=0xefcdab89L;
    private static final long C=0x98badcfeL;
    private static final long D=0x10325476L;
    
    private long [] result={A,B,C,D};  //存储结果
    static final String hexs[]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
    private String str;

    public MD5(String str) {
        this.str=str;
        String result=Main_process();
        System.out.println("| MD5---<"+str+">"+" | \nResult: "+result);
    }
    
    private String Main_process() {
        byte [] inputBytes=str.getBytes();
        int str_length=inputBytes.length;   //字符串字节长度
        int group_number=0;                 //分组个数,每组512位(64字节)
        group_number=str_length/64;         //字节长度/64字节
        long []groups=null;                 //每组按4字节继续细分

        for(int i=0;i<group_number;i++){  //处理分组,循环运算,循环次数位分组个数
            groups=Create_NewGroup(inputBytes,i*64);
            Transform(groups);                     //处理分组,核心算法
        }

        int rest=str_length%64;            //处理512位分组后的余数
        byte [] tempBytes=new byte[64];
        if(rest<=56){
            for(int i=0;i<rest;i++)
                tempBytes[i]=inputBytes[str_length-rest+i];
            if(rest<56){
                tempBytes[rest]=(byte)(1<<7);
                for(int i=1;i<56-rest;i++)
                    tempBytes[rest+i]=0;
            }
            long len=(long)(str_length<<3);
            for(int i=0;i<8;i++){
                tempBytes[56+i]=(byte)(len&0xFFL);
                len=len>>8;
            }
            groups=Create_NewGroup(tempBytes,0);
            Transform(groups);
        }else{
            for(int i=0;i<rest;i++)
                tempBytes[i]=inputBytes[str_length-rest+i];
            tempBytes[rest]=(byte)(1<<7);
            for(int i=rest+1;i<64;i++)
                tempBytes[i]=0;
            groups=Create_NewGroup(tempBytes,0);
            Transform(groups);

            for(int i=0;i<56;i++)
                tempBytes[i]=0;
            long len=(long)(str_length<<3);
            for(int i=0;i<8;i++){
                tempBytes[56+i]=(byte)(len&0xFFL);
                len=len>>8;
            }
            groups=Create_NewGroup(tempBytes,0);
            Transform(groups);
        }
        return ToHexString();
    }

    private String ToHexString(){  //Hash值转换成十六进制的字符串
        String resStr="";
        long temp=0;
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                temp=result[i]&0x0FL;
                String a=hexs[(int)(temp)];
                result[i]=result[i]>>4;
                temp=result[i]&0x0FL;
                resStr+=hexs[(int)(temp)]+a;
                result[i]=result[i]>>4;
            }
        }
        return resStr;
    }
    private void Transform(long[] groups) {  //对分组进行处理,每个分组64字节
        long a = result[0], b = result[1], c = result[2], d = result[3];
        //第一轮
        a = FF(a, b, c, d, groups[0], S11, 0xd76aa478L);
        d = FF(d, a, b, c, groups[1], S12, 0xe8c7b756L);
        c = FF(c, d, a, b, groups[2], S13, 0x242070dbL);
        b = FF(b, c, d, a, groups[3], S14, 0xc1bdceeeL);
        a = FF(a, b, c, d, groups[4], S11, 0xf57c0fafL);
        d = FF(d, a, b, c, groups[5], S12, 0x4787c62aL);
        c = FF(c, d, a, b, groups[6], S13, 0xa8304613L);
        b = FF(b, c, d, a, groups[7], S14, 0xfd469501L);
        a = FF(a, b, c, d, groups[8], S11, 0x698098d8L);
        d = FF(d, a, b, c, groups[9], S12, 0x8b44f7afL);
        c = FF(c, d, a, b, groups[10], S13, 0xffff5bb1L);
        b = FF(b, c, d, a, groups[11], S14, 0x895cd7beL);
        a = FF(a, b, c, d, groups[12], S11, 0x6b901122L);
        d = FF(d, a, b, c, groups[13], S12, 0xfd987193L);
        c = FF(c, d, a, b, groups[14], S13, 0xa679438eL);
        b = FF(b, c, d, a, groups[15], S14, 0x49b40821L);
        //第二轮
        a = GG(a, b, c, d, groups[1], S21, 0xf61e2562L);
        d = GG(d, a, b, c, groups[6], S22, 0xc040b340L);
        c = GG(c, d, a, b, groups[11], S23, 0x265e5a51L);
        b = GG(b, c, d, a, groups[0], S24, 0xe9b6c7aaL);
        a = GG(a, b, c, d, groups[5], S21, 0xd62f105dL);
        d = GG(d, a, b, c, groups[10], S22, 0x2441453L);
        c = GG(c, d, a, b, groups[15], S23, 0xd8a1e681L);
        b = GG(b, c, d, a, groups[4], S24, 0xe7d3fbc8L);
        a = GG(a, b, c, d, groups[9], S21, 0x21e1cde6L);
        d = GG(d, a, b, c, groups[14], S22, 0xc33707d6L);
        c = GG(c, d, a, b, groups[3], S23, 0xf4d50d87L);
        b = GG(b, c, d, a, groups[8], S24, 0x455a14edL);
        a = GG(a, b, c, d, groups[13], S21, 0xa9e3e905L);
        d = GG(d, a, b, c, groups[2], S22, 0xfcefa3f8L);
        c = GG(c, d, a, b, groups[7], S23, 0x676f02d9L);
        b = GG(b, c, d, a, groups[12], S24, 0x8d2a4c8aL);
        //第三轮
        a = HH(a, b, c, d, groups[5], S31, 0xfffa3942L);
        d = HH(d, a, b, c, groups[8], S32, 0x8771f681L);
        c = HH(c, d, a, b, groups[11], S33, 0x6d9d6122L);
        b = HH(b, c, d, a, groups[14], S34, 0xfde5380cL);
        a = HH(a, b, c, d, groups[1], S31, 0xa4beea44L);
        d = HH(d, a, b, c, groups[4], S32, 0x4bdecfa9L);
        c = HH(c, d, a, b, groups[7], S33, 0xf6bb4b60L);
        b = HH(b, c, d, a, groups[10], S34, 0xbebfbc70L);
        a = HH(a, b, c, d, groups[13], S31, 0x289b7ec6L);
        d = HH(d, a, b, c, groups[0], S32, 0xeaa127faL);
        c = HH(c, d, a, b, groups[3], S33, 0xd4ef3085L);
        b = HH(b, c, d, a, groups[6], S34, 0x4881d05L);
        a = HH(a, b, c, d, groups[9], S31, 0xd9d4d039L);
        d = HH(d, a, b, c, groups[12], S32, 0xe6db99e5L);
        c = HH(c, d, a, b, groups[15], S33, 0x1fa27cf8L);
        b = HH(b, c, d, a, groups[2], S34, 0xc4ac5665L);
        //第四轮
        a = II(a, b, c, d, groups[0], S41, 0xf4292244L);
        d = II(d, a, b, c, groups[7], S42, 0x432aff97L);
        c = II(c, d, a, b, groups[14], S43, 0xab9423a7L);
        b = II(b, c, d, a, groups[5], S44, 0xfc93a039L);
        a = II(a, b, c, d, groups[12], S41, 0x655b59c3L);
        d = II(d, a, b, c, groups[3], S42, 0x8f0ccc92L);
        c = II(c, d, a, b, groups[10], S43, 0xffeff47dL);
        b = II(b, c, d, a, groups[1], S44, 0x85845dd1L);
        a = II(a, b, c, d, groups[8], S41, 0x6fa87e4fL);
        d = II(d, a, b, c, groups[15], S42, 0xfe2ce6e0L);
        c = II(c, d, a, b, groups[6], S43, 0xa3014314L);
        b = II(b, c, d, a, groups[13], S44, 0x4e0811a1L);
        a = II(a, b, c, d, groups[4], S41, 0xf7537e82L);
        d = II(d, a, b, c, groups[11], S42, 0xbd3af235L);
        c = II(c, d, a, b, groups[2], S43, 0x2ad7d2bbL);
        b = II(b, c, d, a, groups[9], S44, 0xeb86d391L);

        result[0] += a; //加到先前计算结果中
        result[1] += b;
        result[2] += c;
        result[3] += d;
        result[0]=result[0]&0xFFFFFFFFL;
        result[1]=result[1]&0xFFFFFFFFL;
        result[2]=result[2]&0xFFFFFFFFL;
        result[3]=result[3]&0xFFFFFFFFL;
    }
    private long DealHi(byte b){                   //需要对符号位进行处理
        return b < 0 ? b & 0x7F + 128 : b;
    }
    private long[] Create_NewGroup(byte[] inputBytes,int index){
        long [] temp=new long[16];                 //将每一个512位的分组再细分成16个小组,每个小组64位(8个字节)
        for(int i=0;i<16;i++){
            temp[i]=DealHi(inputBytes[4*i+index])|
                    (DealHi(inputBytes[4*i+1+index]))<<8|
                    (DealHi(inputBytes[4*i+2+index]))<<16|
                    (DealHi(inputBytes[4*i+3+index]))<<24;
        }
        return temp;
    }
    private long F(long x, long y, long z) {
        return (x & y) | ((~x) & z);
    }
    private long G(long x, long y, long z) {
        return (x & z) | (y & (~z));
    }
    private static long H(long x, long y, long z) {
        return x ^ y ^ z;
    }
    private long I(long x, long y, long z) {
        return y ^ (x | (~z));
    }
    private long FF(long a, long b, long c, long d, long x, long s,
                           long ac) {
        a += (F(b, c, d)&0xFFFFFFFFL) + x + ac;
        a = ((a&0xFFFFFFFFL)<< s) | ((a&0xFFFFFFFFL) >>> (32 - s));
        a += b;
        return (a&0xFFFFFFFFL);
    }
    private long GG(long a, long b, long c, long d, long x, long s,
                           long ac) {
        a += (G(b, c, d)&0xFFFFFFFFL) + x + ac;
        a = ((a&0xFFFFFFFFL) << s) | ((a&0xFFFFFFFFL) >>> (32 - s));
        a += b;
        return (a&0xFFFFFFFFL);
    }
    private long HH(long a, long b, long c, long d, long x, long s,
                           long ac) {
        a += (H(b, c, d)&0xFFFFFFFFL) + x + ac;
        a = ((a&0xFFFFFFFFL) << s) | ((a&0xFFFFFFFFL) >>> (32 - s));
        a += b;
        return (a&0xFFFFFFFFL);
    }
    private long II(long a, long b, long c, long d, long x, long s,
                           long ac) {
        a += (I(b, c, d)&0xFFFFFFFFL) + x + ac;
        a = ((a&0xFFFFFFFFL) << s) | ((a&0xFFFFFFFFL) >>> (32 - s));
        a += b;
        return (a&0xFFFFFFFFL);
    }
}
public class IOT_md5 {
    public static void main(String []args){
        String str="Embrace the glorious mess that you are";
        MD5 md=new MD5(str);
    }
}

MD5算法及解密方法探究 编程学习 然而,由于MD5算法的设计存在一些漏洞,使得可以通过预先计算一系列可能的输入,并与目标哈希值进行比较来进行解密尝试。尽管MD5算法存在一些漏洞,使得可以进行解密尝试,但在实际应用中,我们应该使用更强大和安全的哈希算法来保护数据的完整性和安全性。本文将详细介绍MD5算法及其常见解密方法,并提供相关的源代码示例,旨在帮助读者深入了解MD5算法和相关编程实践。需要注意的是,MD5算法已经被证明不是安全的,因此在实际应用中,建议使用更强大的哈希算法,如SHA-256等。最后,我们打印出计算得到的MD5值。 阅读详情

相关推荐

Hash算法MD5实验报告材料.doc

Hash算法MD5实验报告材料.doc

MD5算法的学习与总结

MD5简介 MD5算法描述 0x1 0x2 拓展: 汇编指令—ROL和ROR指令 0x3 0x4 MD5简介 消息摘要算法第五版(Message-Digest Algorithm 5,缩写MD5),是当前计算机领域用于确保信息传输完整一致而使用的散列算法之一(又译哈希算法,摘要算法),将数据运算变为另一固定长度值,是散列算法的基础原理; MD5的前身有MD2、M...

richard1230的博客 2618

Coding Plan:程序员真实工作的可执行编码决策框架

Coding Plan 是一种面向工程实践的编码决策方法论,它超越传统学习路径,聚焦于代码在真实业务系统中的上下文对齐、影响控制与可演进性保障。其核心在于将模糊的开发直觉转化为可度量、可验证、可协作的日常动作,涵盖目标对齐、上下文锁定、验证闭环、协作契约和演进预留五大锚点。结合2026年AI辅助编码新范式,它强调将大模型作为‘上下文翻译器’而非代码生成器,并通过分钟级工作块、技术债主动发行、可观测性前置等机制,显著提升交付确定性与系统长期健康度。本文详解该框架的底层逻辑与落地实践。

weixin_33326218的博客 438

MD5加密的优缺点

4、可用于数字签名,防止抵赖,一旦用户的文件被第三方MD5加密,如果以后甲方说这个文件不是他写的,那么当用文件MD5后获得的签名一致,就可以确认;3、很多人使用的密码是常见的组合,攻击者将这些密码的常见组合进行单向哈希,得到一个摘要组合,然后与数据库中的摘要进行比对即可获得对应的密码。(1)因为用户习惯用容易记住的密码,比如手机号、生日,不法分子容易获取这类密码,这也就是要加盐的原因。(2)直接MD5存入数据库,如果数据库被盗,通过MD5反查会查到密码,需要随机盐值的配合。2、MD5的安全性。

m0_73876302的博客 586

在MacBook上直接跑Windows Server 2022:一个开发者的真实踩坑与配置全记录

本文详细记录了在MacBook上原生运行Windows Server 2022的完整流程与优化技巧。通过Boot Camp实现非虚拟机安装,开发者可以充分利用Mac硬件性能,搭建高效的本地开发环境,特别适合需要测试跨平台应用和服务器功能的场景。文章涵盖驱动处理、分区策略、Docker配置等关键步骤,为技术极客提供实用指南。

weixin_42620913的博客 245

避坑指南:Cursor AI生成Flutter代码时最容易翻车的5个配置细节

本文深入剖析了使用Cursor AI生成Flutter代码时,因.cursorrules配置文件不当而导致的五大常见问题。重点探讨了如何通过制定清晰、具体的规则,避免状态管理混乱、设计图输入低效、项目架构脱节、性能隐患及规则维护缺失等陷阱,从而将AI转化为高效、可靠的开发伙伴,提升代码质量和团队协作效率。

wdx0123456的博客 415

MD5密码实验——Python实现(完整解析版)

前言 实验目的 1)初步了解哈希算法 2)掌握哈希算法MD5的实现 提示:以下是本篇文章正文内容,下面案例可供参考 实验环境 计算机语言:Python 开发环境:Pycharm 实验内容 编程实现MD5算法。 实验操作步骤 暂略 实验结果 1.明文:12345678 密文:25d55ad23a80aa4f464c76d713c07ad 与在线.

有时候,想要一块二向箔 2万+

Datalog语言详解

Datalog是一种声明式逻辑编程语言,起源于数据库理论和逻辑编程领域。作为Prolog的子集,它专注于递归查询和推理,通过定义事实和规则来描述数据关系而非计算步骤。Datalog的关键特性包括规则安全、递归、分层否定和扩展聚合功能,保证了程序的终止性和高效性。相较于SQL,Datalog更擅长处理递归查询;相比Prolog,它更注重数据库友好性。Datalog在程序分析、知识图谱、网络安全等领域有广泛应用,其声明式特性使代码简洁易维护,但同时也面临生态系统小、性能调试难等挑战。现代工具如Soufflé、D

bulita great world 1843

网络安全实验七 Hash算法MD5分析

对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。SHA-1可将一个最大 2的64次方位 的讯息,转换成一串 160位 的讯息摘要,而后四个算法生成的摘要长度为它们名字 后面的数字,如SHA-256算法,它生成的摘要长度为256位,因此它的抗穷举(brute-force)性比MD更好。所有这些完成之后,将A、B、C、D分别加上a、b、c、d。

qq_64314976的博客 1040

告别软件轮询!用STM32G474的COMP比较器实现纳秒级硬件过压保护(CubeMX配置详解)

本文详细介绍了如何利用STM32G474的COMP比较器实现纳秒级硬件过压保护,通过CubeMX配置详解,展示了硬件比较器相比传统软件轮询方案在响应时间、CPU占用和可靠性等方面的显著优势。文章还提供了实战配置流程和优化技巧,帮助工程师快速构建高效的硬件保护系统。

weixin_28683689的博客 351

ANSYS APDL齿轮建模实战:从渐开线方程到完整3D模型的保姆级教程

本文详细介绍了使用ANSYS APDL进行齿轮建模的全过程,从渐开线方程的数学基础到完整3D模型的创建。通过参数化命令流实现高精度齿轮建模,特别适合机械设计和仿真分析需求。教程包含关键参数计算、APDL环境配置、单齿齿廓建模以及全齿轮阵列复制等实用技巧,帮助工程师快速掌握ANSYS APDL在齿轮建模中的应用。

lg888的博客 446

embARC 机器学习库的使用

embARC MLI(机器学习库)用于ARC 物联网开发套件 (IoTDK)机器学习部分的开发 。目前,embARC 机器学习库已经发布到了2.0版本,但是官方说2.0建议只为 VPX 和 x86 仿真使用,可以将 MLI 1.1 用于 EM/HS 目标。但是MLI1.1需要使用MetaWare 开发工具进行构建,MetaWare 学校里有一套,去年因为环境问题没用起来。所以还是使用ARC GNU 工具链构建的版本embarc_osp的emba

加盐 3130

AI Agent开发实战:100个真实场景题库解析

AI Agent开发涉及复杂的需求理解、架构设计及安全防护等关键技术环节。在工程实践中,开发者常面临需求偏差、系统崩溃等挑战,特别是在金融、医疗等高要求场景下。通过真实案例题库,开发者能系统性地掌握需求分析、架构决策树建模(如向量数据库选型)、安全攻防策略(如提示词注入防御)等核心技能。这些实战经验不仅能提升Agent的可用性和安全性,还能优化其在电商客服、智能家居等场景中的表现。题库采用动态难度系统,覆盖从基础到高级的开发挑战,是AI工程化落地的重要参考。

weixin_29057695的博客 343

MD5学习总结

1. MD5简介 MD5,即消息摘要算法第五版,是一种被广泛使用的密码散列函数。散列算法的基本原理是:进行数据(如一段文字)运算,将原始数据变为另一段固定长度的值。 MD5 可以产生出一个 128位(16字节)的散列值(hash value),用于确保传输信息的完整性。 MD5 由美国密码学家 Ronald Linn Rivest 设计,于 1992 年公开,用以取代 MD4 算法。 2. MD5原理 MD5将整个文件当做一个大文本信息,通过不可逆的字符串变换算法,产生一个唯一的MD5信息摘要。文件的MD5

weixin_45004203的博客 1051

【图像超分】论文复现:Pytorch实现SRCNN!保姆级复现教程!提供完整代码和最优权重模型(x2、x3、x4)!科研级论文曲线图!计算平均PSNR和SSIM!代码Windows和Linux都可用!

由于很多同学反应没用过jupyter notebook,更习惯用pycharm项目的形式跑代码。于是,本文将用pycharm项目的形式,重新复现SRCNN!【图像超分】论文复现:新手入门!Pytorch实现SRCNN,数据预处理、模型训练、测试、评估全流程详解,注释详细,简单修改就可以训练你自己的图像数据,有训练好的模型下载地址,随取随用。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 4703

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

加密之单向MD5,SHA,HMAC

文章目录1 Java加密概述1.1 Java的安全体系架构介绍2 公私钥2.1 引言2.2 实际操作2.2.1 加签验签2.2.1.1 私钥加签2.2.1.2 公钥验签2.2.2 加密解密2.2.2.1 生成公私钥2.2.2.2 获取公私钥2.2.2.3 加密解密3 MD5加密3.1 概述3.2 算法原理3.3 实际操作3.3.1 加密3.3.2 MD5处理后转大写十六进制3.3.3 MD5验密4 SHA加密4.1 概述4.2 原理4.3 实际操作4.4 SHA和MD5比较 1 Java加密概述 1.1 J

上善若泪 3159

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

散列算法 MD5 的应用

MD5散列算法的实现

qq_62760217的博客 469

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

关于MD5加密算法的总结

MD5算法由于其本身的不可逆性,在行业内用的很普遍。一般为了保证用户的密码安全,在service层会对用户的密码进行MD5算法加密,防止数据库数据丢失造成用户的损失。在此做一个简单的小结。1.MD5算法需要用到JDK中的MessageDigest类 2.对加密后的数据再次进行处理import java.security.MessageDigest;/* * 负责给字符串数据进行加密 */

AaronWang0920的博客 1021

MD5加密算法

MD5在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个。MD5的典型应用是对一段信息串 (Message)产生所谓的指纹 (fingerprint),以防止被“篡改”。

gghhb12的博客 3111

MD5算法研究

作者:王可   综述  MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格

sunbn的专栏 1859

MD5算法使用心得

最近了解了下MD5算法,以前觉得可能很复杂,一直没敢去学习了解,这次学习使用之后,认为这是一个很常用的东东,故总结下我使用的一些步骤,以示记录。   1,加密准则:只要文件的内容一致,使用加密算法所得加密密钥都会一致,否则不同。, 2,一般使用的步骤(以xml操作为例)如下:     第一步:根据xml的操作,读取除加密秘钥之外的所有xml内容,我记录为csMyXmlContent;

lv_yjie2011的专栏 8100

md5算法总结

md5算法是信息摘要算法,而不是无损压缩算法,因此不可能从密文推测出原文。 但由于生成的128 位(16 字节)的散列值是有数量范围,而原文是无限的,因此必然会产生碰撞,也就是俗称的破解: 即两个不同的原文生成了同一个md值。 常用破解法: 穷举法,耗时较长 字典法,将原文和md5值存储到哈希表中,查询快但占用空间大 彩虹链表法 时间和空间的均衡,将原文经k次H(x)和R(x)连续运算,得到包含原文在内的2K+1个节点的链表, 取此链表的头尾节点(即原文和最后一次的R(x)运算结果)存储到哈希表

Zerore的博客 482

MD5破解实验与个人的MD5暴破程序介绍

最近在和同事讨论个人密码的安全性时,就对6位的数字及大小写字母组合的密码的安全性存在一定疑问。然后索性就写了个程序,实际来求证一下,于是就有了这篇文章和我写的实用的MD5破解程序。 一般的系统,存储用户密码时,都是将密码明文进行MD5之后进行保存的,因MD5算法的不可逆性,就算知道了存储的MD5结果字符串,也不能正常计算出密码原文。当然,可以进行穷举,将密码明文的所有可能都进行MD5运算,然后将结果与密文对比,如果相符即找到了密码原文。 还有互联网上提供了更直接的办法,就是可以在某些网站上可以直接根据M

shaowl111的专栏 1889

常见的加密算法原理与实现:MD5加密

系列三:MD5加密一、基本介绍二、加密原理2.1、处理原文2.2、设置初始值2.3、循环加工2.4、拼接结果 一、基本介绍 MD5加密算法,其全称是Message-Digest Algorithm 5,通常被称为信息摘要算法,所谓的信息摘要就是把明文内容按一定规则生成一段哈希(hash)值,即得到这段明文内容的信息摘要。利用MD5可以基于任意长度的明文字符串生成128位的哈希值,结果唯一且不可逆,因此MD5经常被用于防止信息被篡改、数字签名、以及对明文进行加密等场景。 二、加密原理 MD5算法加密的过程分为

仙路尽头谁为峰 1万+

MD5加密算法详细分析_C实现

MD5加密算法本文为原创作品,转载请注明出处:http://write.blog.youkuaiyun.com/postedit/51736426——开心!维基百科对其描述:MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由罗纳德·李维斯特设计...

zz861126的专栏 648

MD5密码的简单分析与代码实现

MD5算法是一种Hash函数的加密算法,输入的序列长度小于2^64比特,输出的长度则为固定的128比特,是一种单向加密。是通过直接构造复制的非线性关系实现单向性。大体的流程如下图所示: 算法的具体过程如下: 1. 附加填充位 在明文(二进制序列)的后面填充一个1和若干个0使得消息的长度模512与448同余。若原来的明文长度大于模512大于448,则填充的下一个512分组。例如原来的消息长度为50...

paradise3011的博客 1835
上一篇: ACL配置实验报告(XDU物联网安全)
travis_cloud
博客等级 码龄5年 31粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值