精华内容
下载资源
问答
  • 关于信息摘要函数
    千次阅读
    2017-06-20 10:51:35

    数字摘要和Hash函数(哈希函数)


    1、数字摘要

    数字摘要是将任意长度的消息变成固定长度的短消息,它类似于一个自变量是消息的函数,也就是Hash函数。数字摘要就是采用单项Hash函数将需要加密的明文“摘要”成一串固定长度(128位)的密文这一串密文又称为数字指纹,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致


    一般来说,非对称加密是用来处理短消息的,而相对于较长的消息则显得有些吃力。当然,可以将长的消息分成若干小段,然后再分别签名。不过,这样做非常麻烦,而且会带来数据完整性的问题。比较合理的做法是在数字签名前对消息先进行数字摘要。
    是将任意长度的消息变成固定长度的短消息,它类似于一个自变量是消息的函数,也就是Hash函数。
    数字摘要就是采用单项Hash函数将需要加密的明文“摘要”成一串固定长度(128位)的密文这一串密文又称为数字指纹,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。
    一个Hash函数的好坏是由发生碰撞的概率决定的。如果攻击者能够轻易地构造出两个消息具有相同的Hash值,那么这样的Hash函数是很危险的。一般来说,安全Hash标准的输出长度为160位,这样才能保证它足够的安全。 这一加密方法亦称安全Hash编码法(SHA:Secure Hash Algorithm)或MD5(MD Standards for Message Digest由Ron Rivest所设计)。该编码法采用单向Hash函数将需加密的明文“摘要”成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。这样这摘要便可成为验证明文是否是“真身”的“指纹”了。

    数字摘要使用:
    (1) 被发送文件用SHA编码加密产生128bit的数字摘要。
    (2) 发送方用自己的私用密钥对摘要再加密,这就形成了数字签名。
    (3) 将原文和加密的摘要同时传给对方。
    (4) 对方用发送方的公共密钥对摘要解密,同时对收到的文件用SHA编码加密产生又一摘要。
    (5) 将解密后的摘要和收到的文件在接收方重新加密产生的摘要相互对比。如两者一致,则说明传送过程中信息没有被破坏或篡改过。否则不然。

    2、Hash函数(哈希函数)

          Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
          一些著名的hash算法,MD5 和 SHA1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。
    这里简单说一下:
    1) MD4
    MD4(RFC 1320)是 MIT 的Ronald L. Rivest在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32位操作数的位操作来实现的。
    2) MD5
    MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好
    3) SHA1
    SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于2^64位的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。
    美国国家安全局(NationalSecurityAgency,简写为NSA)美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)


            HASH主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系。Hash算法在信息安全方面的应用主要体现在以下的3个方面:
    1)文件校验
    我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。
    MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。
    2)数字签名
    Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。
    3)鉴权协议
    如下的鉴权协议又被称作"挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。


    著作权声明:本文由http://my.csdn.net/Nathan1987_原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢
    更多相关内容
  • 信息摘要技术的实现

    2018-11-26 17:21:44
    (2)利用MD5实现函数,对特定文件(test-1.txt)进行信息摘要的计算,得到信息摘要M1;尝试改变特定文件中的内容(比如改变其中某个字母),再利用MD5计算一次信息摘要,看同之前得到的信息摘要是否相同;
  • 信息摘要函数的设计与验证 设计一个类似MD5、RSA的hash函数,构造出一个自己的信息摘要函数 信息摘要函数具有以下的特性: 信息摘要函数具有固定的输出数位 信息摘要函数满足不可求逆,不可伪造和在可行时间之内找...

    信息摘要函数的设计与验证

    设计一个类似MD5、RSA的hash函数,构造出一个自己的信息摘要函数

    信息摘要函数具有以下的特性:

    • 信息摘要函数具有固定的输出数位
    • 信息摘要函数满足不可求逆,不可伪造和在可行时间之内找不到碰撞等特性
    • 对信息摘要函数进行设计与Hash值的性质验证

    比如对于下面的明文信息设计合理的信息摘要函数进行Hash值产生:

    Once upon a time, there lived a monkey in the woods. The monkey climbed up the tree and looked down at the river everyday. One day, the monkey saw fishermen throw a net over the river. He watched how the fishermen caught fish. Sometime after, the fishermen left the net and went to have lunch. Then, the monkey climbed down from the tree and went to the riverside. The monkey was planning to throw the net like the fishermen did. The monkey was confident since he was good at imitating. Yet, the net wound around the monkey when he touched it. Tied up in the net, the monkey fell into the water.The monkey regretted his behavior, but it was too late. “I should have learned how to use the net before touching it. After believing my prowess and showing off, I am in a bad fix.” The monkey who did not behave carefully drowned in the water.

    要求是:

    1. 随机改变m的任意一位字符,产生新的Hash值,
    2. 如此实验10次,记新的Hash值为 H1,H2,…H10
    3. 设计函数计算H0和Hi 的相似度 i=1,2,…10

    我的主要思路:

        我们都知道在底层计算机之中,任何数据都是作为二进制流来存在的,我对于明文进行加密,从某一个角度上来看,就是对二进制流进行规定的操作,不同的文件或者明文的二进制流可能存在相似,因此,单纯的使用二进制流来进行信息摘要认证也不行,因为之前接触过python之中的random.seed函数,使用random函数来生成随机数的时候,每一次生成的数都是随机的,但是如果我们通过使用random.seed来设定好种子之后,那么它得到的随机数确实固定的,根据这一个思路,我们可以利用random来对得到的二进制流进行操作,这样得到的信息认证码在不同明文下有很高的概率保证是不同的,随意改变其中一个会使他的异很大。

        因此重点就是就将明文转为二进制流,再将二进制流打乱,在打乱的过程之中,通过random.seed来给每一次打乱设置定值,这样最后只要明文不变,最后得到的结果就是固定的结果。在这个过程之中我们选取明文的特定字符位置以及其两边的ascii码之和来作为随机种子打乱字符的排序。

        由md5的算法得到启发,在我自己设计的信息摘要函数之中,我将明文选择512来作为二进制明文的公约数,保证二进制长度为512的倍数,然后再打乱多次,其中,每组设定为16个字符,即是四个四位二进制数,然后求出每组四个二进制数的和来作为输出字符的ascii码,其他字符则对ascii码来进行相应的加减,使其符合大小写的字母或者数字。

    python程序设计思路:

    在这里插入图片描述

    python代码:

    # encode ano
    import math
    import random
    
    # change to bin
    import string
    
    def encode(s):
        return ''.join([bin(ord(c)).replace('0b', '') for c in s])
    
    
    def random_int_list(start, stop, length):
        start, stop = (int(start), int(stop)) if start <= stop else (int(stop), int(start))
        length = int(abs(length)) if length else 0
        random_list = []
        for i in range(length):
            random_list.append(random.randint(start, stop))
        return random_list
    
    
    def read_str(msg):
        '''
            首先计算输入明文信息的ascii码之和,然后根据这个进行
            随机种子设置,在这之中我们将明文转换为二进制,同时传
            为比特串,通过选取首个字符作为ab
        '''
        ascii_sum = 0
        # 计算 ascii 之和
        for char in msg:
            ascii_sum += ord(char)
        # ascii和 * 随机数
        random.seed(msg[0])
        value_1 = ascii_sum * random.random()
        random.seed(value_1)
        msg_list = list(msg)
        random.shuffle(msg_list)
        msg = "".join(msg_list)
        # 明文转为二进制
        b_msg = encode(msg)
    
        # 明文转为比特串
        by_msg = bytes(msg, encoding='utf-8')
    
        # 选明文首位字符作为ab
    
        a = ord(msg[0])
        b = ord(msg[-1])
    
        return a, b, value_1, msg
    
    
    def random_all(a, b, y, msg):
        # 椭圆方程
        x = int(math.sqrt(abs((1 - (math.pow(y, 2) / pow(b, 2))) * pow(a, 2))) * 12)
        random.seed(x)
    
        msg_list = list(msg)
        random.shuffle(msg_list)
        ascii_sum = 0
        for i in range(0, int(len(msg_list) / 2)):
            ascii_sum += ord(msg_list[i])
    
        random.seed(ascii_sum)
        random.shuffle(msg_list)
        msg = "".join(msg_list)
    
        return msg
    
    
    def operate(msg):
        # 将其补全位128位的
        b_msg = encode(msg)
        rst_mod = len(b_msg) % 512
        value = 512 - rst_mod
        random.seed(ord(msg[0]))
    
        if value != 0:
            r_l = random_int_list(0, 1, value)
            for i in range(0, len(r_l)):
                b_msg += str(r_l[i])
    
        b_msg = str(b_msg)
        b_msg_l = list(b_msg)
        random.shuffle(b_msg_l)
        b_msg = "".join(b_msg_l)
    
        times = int(len(b_msg) / 512)
    
        step = 16 * times
        b_32 = [b_msg[i:i + step] for i in range(0, len(b_msg), step)]
    
        rst_list = []
        # 将16位数转换得到为4个二进制位的
        for j in range(0, 32):
            for k in range(0, 16, 16):
                rst_1 = int(b_32[j][k]) * pow(2, 3) + int(b_32[j][k + 1]) * pow(2, 2) + int(b_32[j][k + 2]) * pow(2, 1) + \
                        int(b_32[j][k + 3]) * pow(2, 0)
                rst_2 = int(b_32[j][k + 4]) * pow(2, 3) + int(b_32[j][k + 5]) * pow(2, 2) + int(b_32[j][k + 6]) * pow(2, 1) + \
                        int(b_32[j][k + 7]) * pow(2, 0)
                rst_3 = int(b_32[j][k + 8]) * pow(2, 3) + int(b_32[j][k + 9]) * pow(2, 2) + int(b_32[j][k + 10]) * pow(2,1) + \
                        int(b_32[j][k + 11]) * pow(2, 0)
                rst_4 = int(b_32[j][k + 12]) * pow(2, 3) + int(b_32[j][k + 13]) * pow(2, 2) + int(b_32[j][k + 14]) * pow(2,1) + \
                        int(b_32[j][k + 15]) * pow(2, 0)
                rst = rst_1 + rst_2 + rst_3 + rst_4
                rst_list.append(rst)
        return rst_list
    
    
    def case_case(int_):
        str_ = ""
        if 0 <= int_ <= 9 or 17 <= int_ <= 40:
            str_ = chr(int_ + 48)
        elif 10 <= int_ <= 16:
            str_ = chr(int_ + 100)
        elif 41 <= int_ <= 47:
            str_ = chr(int_ + 56)
        elif 48 <= int_ <= 57 or 65 <= int_ <= 90 or 97 <= int_ <= 122:
            str_ = chr(int_)
        elif 123 <= int_ <= 181:
            str_ = chr(int_ - 58)
        elif 58 <= int_ <= 64:
            str_ = chr(int_ - 10)
    
        return str_
    
    
    def judge(rst):
        final_list = []
        for i in range(0, 32):
            fin_str = case_case(rst[i])
            final_list.append(fin_str)
    
        return final_list
    
    
    def hash_0_10(msg, i):
        random.seed(i)
        a = random.sample(string.ascii_letters + string.digits, 1)
        b = random.randint(0, len(msg))
        msg_l = list(msg)
        msg_l[b] = a
        msg = "".join(str(msg_l))
        return msg
    
    
    def Get(msg):
        text_rst = read_str(msg)
        msg_0 = random_all(text_rst[0], text_rst[1], text_rst[2], text_rst[3])
        rst = operate(msg_0)
        m = "".join(judge(rst))
        return m
    
    
    if __name__ == '__main__':
        msg = input("Input the information : \n")
        m1 = Get(msg)
        print("\n H1: ", m1)
    
    
        for i in range(2, 11):
            msg_0 = hash_0_10(msg, i)
            m1 = Get(msg_0)
            print(" H{}: ".format(i), m1) 
    

    加密得到结果:

    在这里插入图片描述

    与MD5信息摘要算法进行比较相似度:

    首先第一张为使用我设计的hash函数进行信息摘要得到结果进行对比的相似度:
    在这里插入图片描述
    下面这个为使用md5进行信息摘要得到的相似度:
    在这里插入图片描述
        从结果上来看,我设计的hash函数进行信息摘要得到的哈希值相似度还是比较低的,从修改明文中不同的一个字符得到10个不同的消息认证码来看,这10个消息认证码相似的程度是非常低的,因此,个人所设计的消息认证摘要算法算是比较成功了。
        经过比较,我可以发现我所设计的消息认证加密函数在该密文且10个不同的消息认证码的情况下比md5的算法要优越,这只是做一个小小的对比,具体算法的比较还需要在生成大量的消息认证码的情况下进行比较。

    进行碰撞实验:

    在这里插入图片描述
        使用我个人设计信息认证摘要函数进行碰撞计算,发现经过58万多次的计算暂时还未发现有重复的认证码产生。

    展开全文
  • string EncryptUtil::md5Hex(const string&... //首先更新md5中需要进行摘要的字符串 this->md5->update(text); //使用md5的方法生成对应的摘要后的字符串 return this->md5->toString(); }
  • MD5信息摘要算法详解

    千次阅读 2022-02-24 15:02:47
    MD5信息摘要算法,一种被广泛使用的密码散列函数,提供消息完整性,MD5的长度为128位(按照16进制编码,16字节,得到32个字符)是一个散列值(hash value)。 MD5由美国密码学家罗纳德·李维斯特(Ronald Linn ...

    MD5信息摘要算法详解

    01 MD5概要

    MD5信息摘要算法,一种被广泛使用的密码散列函数,提供消息完整性,MD5的长度为128位(按照16进制编码,16字节,得到32个字符)是一个散列值(hash value)。

    MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。
    1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。
    2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途[1]。

    02 MD5特性

    在这里插入图片描述

    1. 长度固定,任意长度的数据都会输出相同长度的md5值
    2. 不可逆
    3. 对原数据进行任何改动,改变一个字节输出数据也会有很大差异

    在这里插入图片描述

    1. 抗碰撞性,很少能碰到两个不同的数据具有相同的md5值

    在浏览各种博客的时候,发现很多很多评论都在指出各种文章中,作者定义md5为加密算法,在这里,我非常认同其中一篇[2]的观点:
    认为MD5属于加密算法的人觉得MD5与其他加密算法相似,都为将明文进行运算等各种操作得到与明文完全不相同的数据,而认为MD5不属于加密算法的人认为没有解密算法,无法称为加密算法,当然,第二种相比来说更加严谨,默认情况下不称为加密算法。

    03 MD5应用

    1. 密码保护,“如果直接将密码信息以明码方式保存在数据库中,不使用任何保密措施,系统管理员就很容易能得到原来的密码信息,这些信息一旦泄露, 密码也很容易被破译。”,利用MD5,在后台可以不记录密码本身,并且在后台进行校验密码
    2. 电子签名
      通过检查文件前后 MD5 值是否发生了改变,就可以知道源文件是否被改动。
    3. 在百科上还看到一个很有用的应用实例,就是筛选垃圾邮件,

    1)建立邮件MD5库,分别储存邮件的 MD5 值、允许出现的次数(假定为 3)和出现次数(初值为零)。
    2)对每一封收到的邮件进行MD5计算,并与MD5库中的值进行比较
    3)如未发现相同的 MD5 值,说明此邮件是第一次收到,将此 MD5 值存入资料库,并将出现次数置为1
    4)如发现相同的 MD5 值,说明收到过同样内容的邮件,将出现次数+1[3]

    04 MD5实现算法

    首先需要对信息进行填充,对输入数据进行按位(bit)数据填充,长度进行补齐使消息的长度 X 变成
    X = n*512+448

    也就是
    X mod 512=448

    在进行填充时,在消息后面进行填充,填充第一位为1,其余为0
    如果数据长度正好为n*512+448,我们也要对数据进行填充,变成(n+1)*512+448

    在这里插入图片描述

    之后的448为(448 = 512-64),64位用于填充原消息的长度。
    最终被用来处理的数据就为
    n512+448+64 = N512

    四个幻数在内存地址上从低到高为:
    A = 0×01234567
    B = 0×89ABCDEF
    C = 0xFEDCBA98
    D = 0×76543210

    大小为 4*4 = 16字节

    每个标准幻数的大小 与 md5输出大小一致

    在程序中,使用小端字节序,md5为四个标准幻数进行多轮哈希运算
    (小端模式:高字节在前,低字节在后)
    则在程序中应该为:
    A = 0x67452301
    B = 0xEFCDAB89
    C = 0x98BADCFE
    D = 0x10325476

    在这里插入图片描述

    在数据填充部分,我们知道,我们已经将原始数据填充为:N个512位(n个64字节)

    然后将每个64字节分成16份
    在这里插入图片描述

    每份4字节

    在这里插入图片描述

    分好后,定义4个函数
    FF(a,b,c,d,Mi,s,tj)
    GG(a,b,c,d,Mi,s,tj)
    HH(a,b,c,d,Mi,s,tj)
    II(a,b,c,d,Mi,s,tj)

    在这里插入图片描述

    其中,a,b,c,d表示4个标准幻数
    在这里插入图片描述

    第五个为每一份的四字节数据,也就是第i个子分组(一共有16个分组)

    在这里插入图片描述

    第六个和第七个表示为固定长度,用于执行逻辑与、或、非、异或运算、加法运算、移位运算

    也就是每个512位(64字节)的分组,划分成16份,每份都运行一次FF,GG,HH,II中的一个函数
    每个函数为一轮的话,要运行4*16=64次,每一次改变第一个参数的值

    比如在第一轮的第一次运算[3]:
    FF(a,b,c,d,M0,s,t1)
    a = a+(F(b,c,d)+M0+t1);
    a = (s<<a) | (s>>(32-a));
    a = a + b;

    在第一轮的第一次运算:
    FF(b,c,d,a,M1,s,t2)
    b = b+(F(c,d,a)+M1+t2);
    b = (s<<b) | (s>>(32-b));
    b = b + c;

    而我们运行的64次则为:
    第一轮

    FF(a,b,c,d,M0,7,0xd76aa478)
    FF(d,a,b,c,M1,12,0xe8c7b756)
    FF(c,d,a,b,M2,17,0×242070db)
    FF(b,c,d,a,M3,22,0xc1bdceee)
    FF(a,b,c,d,M4,7,0xf57c0faf)
    FF(d,a,b,c,M5,12,0×4787c62a)
    FF(c,d,a,b,M6,17,0xa8304613)
    FF(b,c,d,a,M7,22,0xfd469501)
    FF(a,b,c,d,M8,7,0×698098d8)
    FF(d,a,b,c,M9,12,0×8b44f7af)
    FF(c,d,a,b,M10,17,0xffff5bb1)
    FF(b,c,d,a,M11,22,0×895cd7be)
    FF(a,b,c,d,M12,7,0×6b901122)
    FF(d,a,b,c,M13,12,0xfd987193)
    FF(c,d,a,b,M14,17,0xa679438e)
    FF(b,c,d,a,M15,22,0×49b40821)

    第二轮

    GG(a,b,c,d,M1,5,0xf61e2562)
    GG(d,a,b,c,M6,9,0xc040b340)
    GG(c,d,a,b,M11,14,0×265e5a51)
    GG(b,c,d,a,M0,20,0xe9b6c7aa)
    GG(a,b,c,d,M5,5,0xd62f105d)
    GG(d,a,b,c,M10,9,0×02441453)
    GG(c,d,a,b,M15,14,0xd8a1e681)
    GG(b,c,d,a,M4,20,0xe7d3fbc8)
    GG(a,b,c,d,M9,5,0×21e1cde6)
    GG(d,a,b,c,M14,9,0xc33707d6)
    GG(c,d,a,b,M3,14,0xf4d50d87)
    GG(b,c,d,a,M8,20,0×455a14ed)
    GG(a,b,c,d,M13,5,0xa9e3e905)
    GG(d,a,b,c,M2,9,0xfcefa3f8)
    GG(c,d,a,b,M7,14,0×676f02d9)
    GG(b,c,d,a,M12,20,0×8d2a4c8a)

    第三轮

    HH(a,b,c,d,M5,4,0xfffa3942)
    HH(d,a,b,c,M8,11,0×8771f681)
    HH(c,d,a,b,M11,16,0×6d9d6122)
    HH(b,c,d,a,M14,23,0xfde5380c)
    HH(a,b,c,d,M1,4,0xa4beea44)
    HH(d,a,b,c,M4,11,0×4bdecfa9)
    HH(c,d,a,b,M7,16,0xf6bb4b60)
    HH(b,c,d,a,M10,23,0xbebfbc70)
    HH(a,b,c,d,M13,4,0×289b7ec6)
    HH(d,a,b,c,M0,11,0xeaa127fa)
    HH(c,d,a,b,M3,16,0xd4ef3085)
    HH(b,c,d,a,M6,23,0×04881d05)
    HH(a,b,c,d,M9,4,0xd9d4d039)
    HH(d,a,b,c,M12,11,0xe6db99e5)
    HH(c,d,a,b,M15,16,0×1fa27cf8)
    HH(b,c,d,a,M2,23,0xc4ac5665)

    第四轮

    II(a,b,c,d,M0,6,0xf4292244)
    II(d,a,b,c,M7,10,0×432aff97)
    II(c,d,a,b,M14,15,0xab9423a7)
    II(b,c,d,a,M5,21,0xfc93a039)
    II(a,b,c,d,M12,6,0×655b59c3)
    II(d,a,b,c,M3,10,0×8f0ccc92)
    II(c,d,a,b,M10,15,0xffeff47d)
    II(b,c,d,a,M1,21,0×85845dd1)
    II(a,b,c,d,M8,6,0×6fa87e4f)
    II(d,a,b,c,M15,10,0xfe2ce6e0)
    II(c,d,a,b,M6,15,0xa3014314)
    II(b,c,d,a,M13,21,0×4e0811a1)
    II(a,b,c,d,M4,6,0xf7537e82)
    II(d,a,b,c,M11,10,0xbd3af235)
    II(c,d,a,b,M2,15,0×2ad7d2bb)
    II(b,c,d,a,M9,21,0xeb86d39

    在这里插入图片描述

    4个函数都执行了16次

    然后再将计算得到的4个标准幻数的值与上一轮或开始值相加,然后作为第二轮输入,重复每一次

    最终得到的更新后的标准幻数,按顺序得出我们的md5值,这里再强调一下,前面也说了是小端排序,所以应该是这样的

    在这里插入图片描述

    当然了md5的c语言实现代码在之后进行详细补充,加密流程可以参考[4]是个非常详细的过程

    05 MD5在线网站

    https://www.cmd5.com/

    参考文章
    [1] https://baike.baidu.com/item/MD5/212708?fr=aladdin
    [2] https://blog.csdn.net/u012611878/article/details/54000607
    [3] https://blog.csdn.net/Oliver_xpl/article/details/90214896?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164493954316780269867160%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164493954316780269867160&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_ulrmf~default-2-90214896.pc_search_insert_ulrmf&utm_term=MD5&spm=1018.2226.3001.4187
    [4] https://www.bilibili.com/video/BV1u44y1z7t1?from=search&seid=18258260943716626789&spm_id_from=333.337.0.0

    展开全文
  • 散列函数、消息摘要与数字签名

    千次阅读 2018-08-23 17:37:00
    散列函数的返回值称为散列值、散列码,摘要或者简单散列。 也就是说散列函数能将任意长度的输入变换成固定长度的输出,该输出就是散列值。散列值空间通常远小于输入的空间。 散列函数的一些特性: 消息的长度不受...

    一, 散列函数(Hash function)

    散列函数:任何一种能将任意大小数据映射为固定大小数据的函数,都能被称为散列函数。散列函数的返回值称为散列值、散列码,摘要或者简单散列。
    也就是说散列函数能将任意长度的输入变换成固定长度的输出,该输出就是散列值。散列值空间通常远小于输入的空间。

    散列函数的一些特性:

    • 消息的长度不受限制
    • 确定性:对于相同的输入(根据同一函数),它必须始终生成相同的散列值,如果两个散列值是不相同的,那么这两个散列值的原始输入也是不相同的, 但是对于不同的输入可能会散列成相同的输出(哈希碰撞),所以不可能从散列值来确定唯一的输入值。
    • 均匀性:良好的散列函数应该输入尽可能均匀的映射到输出范围上。
    • 单向性:在加密应用程序中,通常期望散列函数实际上是不可逆的。

    二, 散列函数的应用

    1. 散列表

    散列函数通常与散列表(hash table)结合使用,使用散列表能够快速的按照关键字查找数据记录。具体地,散列函数会先将关键字映射到地址集合中的某一个位置,然后通过这个地址来查找数据记录(也就是将关键字通过散列函数转换的地址来查找表中的数据)

    2. 加密散列函数

    由于散列函数的多样性,它们经常是专门为某一应用而设计的,比如为加密验证信息完整性而设计的散列函数(又被称为单向散列函数、杂凑函数或者消息摘要函数),这种散列函数是一个“单向”操作:对于给定的散列值,没有实用的方法可以计算出一个原始输入,也就是说很难伪造,比如 MD5 这种散列函数,被广泛用作检测文件的完整性。

    2.1 验证消息的完整性

    安全hash的一个重要应用就是验证消息的完整性:发送者将原文与摘要一起发送给接受者,然后接收者用同一个hash函数对收到的原文产生一个摘要,与发送者的摘要信息对比,如果相同,则说明收到的信息是完整的。
    验证流程如下:
    662236-20181004123054461-2117655575.png

    在上述流程中,信息收发双发在通信前已经商定了具体的散列算法,并且该算法是公开的,如果消息在传递过程中被篡改,则该消息不能与已获得的数字指纹相匹配。

    2.2 单向散列函数(杂凑函数/消息摘要算法)

    单向散列函数是一种特殊的散列函数,它是一种将任意长度的输入转换为固定长度的输出,但难以由输出转换成输入的散列函数。这个输出就被称为该消息(输入)的散列值,或者消息摘要。
    就像前文所提到的,单向散列函数所保证的不是机密性,而是完整性。完整性指的是“数据是正牌的而不是伪造的”这一性质,使用单向散列函数,就可以检测出数据是否被篡改过。
    (ps:一般地,把对一个消息的摘要称为该消息的指纹或者数字签名,它是一个唯一对应一消息或文本的固定长度的值,它由一个单向哈希函数对消息进行作用而产生。)

    单向散列函数又称消息摘要算法,其核心在于散列函数的单向性。即通过散列函数可获得对应的散列值,但不可通过该散列值反推其原始信息。这是消息摘要算法的安全性的根本所在。

    消息摘要算法的特征:
    消息摘要算法就是前面所说的单向散列函数,它的主要特征就是加密过程中不需要密钥,并且经过加密的数据无法被破解,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密钥的管理与分发问题。

    消息摘要算法能够验证消息的完整性(具体验证完整性的流程在上面已经介绍了),它主要应用在“数字签名”领域,作为对明文的摘要算法。

    2.3 小结:

    • 消息摘要算法是一种特殊的散列函数,因为具有单向性(即一个消息通过散列函数可获得其对应的散列值,但不可通过该散列值反推其原始信息),所以消息摘要算法也被称为单向散列函数。
    • 消息摘要算法是验证数据完整性的算法
    • 消息摘要算法返回的散列值通常也被称为 摘要 或者 数字签名。

    3 数字签名

    前面已经介绍了通过散列函数可以确保数据内容的完整性,但这还远远不够。此外,还需要确保数据来源的可认证性(身份识别)和数据发送行为的不可否认性(防止抵赖行为)。即完整性、可认证性和不可否认性。这些正是数字签名的主要特征。
    任何一个公钥密码体制都可以单独作为一种数字签名方案使用,比如使用 RSA 作为数字签名方法使用时的流程如下:
    662236-20180823173238402-2085730366.png

    这种数字签名的流程是:发送方使用私钥对消息原文做签名(加密)处理,生成出消息原文的“数字签名”,然后将消息原文连同它的数字签名(即加密后的消息密文)一起发送给接收方。然后接收方使用公钥对接收到的消息密文做解密处理,并将公钥解密后的消息与原来的消息进行比较。
    数字签名满足了以下的要求:

    • 完整性:当使用公钥解密后的消息与消息原文相同,则说明消息是完整的,否则消息不完整
    • 不可否认性和可认证性:当消息原文和加密后的消息密文一起被 A 发送给 接收方B 后,接收方B 可以确信信息确实是发送方A 发送的,同时 发送方A 也不能否认发送过该信息,因为除了 A 本人之外,其他任何人都无法由消息原文产生正确的消息密文,所以 RSA 数字签名方案是可行的。

    但是这种方案是存在问题的,这种方案需要对所有信息原文进行加密操作,这在消息的长度比较大时,效率是非常低的,主要原因在于公钥体质的加解密过程的低效性,所以这种方案通常不可取。

    3.1 更有效的数字签名算法

    这种数字签名算法可以看做是一种带有密钥的消息摘要算法,并且这种密钥包含了公钥和私钥,也就是说,数字签名算法是非对称加密算法和消息摘要算法的结合体。
    具体流程如下:

    1. 发送方先用摘要算法对消息进行摘要(digest),加密后的密文被称作摘要。
    2. 发送方把摘要用私钥进行加密,生成“数字签名”(signature)
    3. 发送方将 数字签名 和消息原文 一起发送给接收方
    4. 接收方使用相同的散列函数从接收到的消息原文中计算出摘要1
    5. 接收方使用公钥对数字签名进行解密得到摘要2。
    6. 比较摘要1和摘要2是否相等,如果相等,则就能确定消息的完整性以及消息的来源确实是发送方

    几乎所有的数字签名方法都要和快速高效的摘要算法(hash函数)一起使用,当非对称加密算法和消息摘要算法结合起来使用,便构成了一种有效地数字签名方案。比如当经典的非对称加密算法和数字签名算法——RSA 算法与消息摘要算法 MD5 结合之后就形成了MD5withRSA 算法。

    参考:
    百度百科: https://baike.baidu.com/item/%E6%95%B0%E5%AD%97%E7%AD%BE%E5%90%8D
    wiki百科: https://en.wikipedia.org/wiki/Hash_function
    Java加密与解密的艺术

    转载于:https://www.cnblogs.com/liyutian/p/9525173.html

    展开全文
  • 来自 RFC 1321 的解释 – MD5 报文摘要算法: MD5 报文摘要算法将任意长度的信息作为输入值,并将其换算成一个 128 位长度的”指纹信息”或”报文摘要”值来代表这个输入值,并以换算后的值作为结果。MD5 算法主要是...
  • 信息摘要 区别于对称加密和非对称加密,信息摘要算数是一种不可逆的操作,无论输入数据的大小输出的数据长度是固定的 信息摘要算数对输入很敏感,即使数据变化很细微,输出的结果会出现很大的差异 从不同输入得到...
  • 在这里我们讨论的散列函数用于在计算机中将根据作为输入消息或者数据文件生成其对应的信息摘要。消息或数据文件通常被作为是位字符串。消息的长度是消息中的比特数(空消息的长度为0)。如果消息中的比特数是8的倍数,...
  • 信息安全与密码学3-数字摘要和Hash函数(哈希函数) 1、数字摘要 数字摘要是将任意长度的消息变成固定长度的短消息,它类似于一个自变量是消息的函数,也就是Hash函数。数字摘要就是采用单项Hash函数将需要加密...
  • 通过函数图像介绍信息熵的概念

    千次阅读 2018-12-26 21:25:13
    本文通过函数图像介绍信息熵的概念. 相关 系列文章索引 : https://blog.csdn.net/oBrightLamp/article/details/85067981 正文 信息熵:信息的基本作用就是消除人们对事物的不确定性. 信息熵是不确定程度的度量, 一个...
  • 自动生成文章摘要[JavaScript 版本]。 我们在写BLOG这样的程序时经常需要显示文章前一部分的,但是又怕不恰当...如果客户端意图更改正常的摘要信息的话,一般都是BLOG的主 人才有这个权力,那么他使得摘要和原文的一致
  • 单向散列函数或者安全散列函数之所以重要,不仅在于消息认证(消息摘要,数据指纹),还有数字签名(加强版的消息认证)和验证数据的完整性。常见的单向散列函数有MD5和SHA 散列函数的要求  散列函数的目的是文件、...
  • 然后从相关性和多样性等方面评估新闻语句集合,该评估函数由多个单调子模函数和一个评估语句不相似度的非子模函数组成;最后设计贪心算法生成最终摘要。在NLPCC2015数据集上的实验结果表明,该方法能有效提高面向...
  • 信息安全概论:Hash函数概念与性质

    千次阅读 2020-04-02 18:20:39
    Hash函数可以将“任意长度“的输入经过变换以后得到固定长度的输出,也称为消息摘要。 消息摘要能有用于完成消息的认证功能,消息认证是保证信息完整性的重要措施。 Hash函数也成散列函数、哈希函数、杂凑函数等,是...
  • 信息摘要与数字签名

    千次阅读 热门讨论 2015-10-25 15:42:53
    在做软考试题的时候,在信息摘要与数字签名这丢了好几次分,于是自己回顾了一遍视频,从新学习一下信息摘要和数字... 1、信息摘要定义:信息摘要算法实际上是一个单向散列函数。(单向散列函数就是不可逆的过程,比如
  • HASH函数

    千次阅读 2022-04-09 22:31:42
    散列函数代表除了对称和非对称加密之外的第三种加密类型,我们可以称之为无密钥加密。hash函数就是把任意长的输入位(或字节)变化成固定长的输出字符串的一种函数。输出字符串的长度称为hash函数的位数。 哈希不...
  • Caché 函数大全

    千次阅读 2020-12-25 07:06:00
    Caché 函数大全 Caché ObjectScript函数 第一章 Caché 函数大全 $ASCII 函数☆☆☆☆☆ 第二章 Caché 函数大全 $BIT 函数☆☆☆ 第三章 Caché 函数大全 $BITCOUNT 函数☆☆☆ 第四章 Caché 函数大全 $BITFIND ...
  • 散列函数,又称消息摘要函数、哈希函数、杂凑函数或单向函数。  它的主要作用不是用于加密与解密,而是用于验证信息的完整性。使用散列函数,为信息创建“数字指纹”,用于鉴别信息的身份。消息摘要算法也是数字...
  • 信息摘要的原理是加密哈希函数。这种散列函数的输入数据通常被称为消息,输出结果被称为消息摘要。经过特定的算法得到一小段验证信息,用来检查某段消息的完整性是否被篡改等。 消息摘要算法分为三类: MD...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 117,092
精华内容 46,836
热门标签
关键字:

关于信息摘要函数