报文摘要算法

2023-10-27

1 报文摘要算法

报文摘要算法是一种将任意长度报文转换成固定长度的报文摘要算法。它具有以下六个特点:能够作用于任意长度的报文;产生有限位数的标识信息;易于实现;具有单向性;具有抗碰撞性;具有高灵敏性。

1.1 MD5

1.1.1 添加填充位

将报文X添加首位为1,其余为0的填充位,填充位长度为Y,使得X与Y的和模512为448。最后加上表示报文长度的64位二进制数,共同组成数据序列。

1.1.2 分组操作

将数据序列分割成512位的数据段,对每一段数据段单独进行报文摘要运算,每一段数据段的输入是512的数据段和前一段进行报文摘要运算后的128位结果。

1.1.3 MD5运算过程

每一段的512位数据段,它包含4级运算,每一级运算过程进行16次迭代运算。512位数据段被分成16个32位的字,16次迭代运算,输出为32位。4级运算一共产生4*32位=128位结果。
在这里插入图片描述

初始运算有一个128位的初始向量,第一个数据段的运算过程的输入是初始向量和第一个数据段,其后数据段的运算过程的输入是512位的数据段和上一段运算的结果。
在这里插入图片描述

1.2 SHA-1

与MD5有相同的填充过程与分组操作。不同的是初始向量与每一段的运算结果是5个32位的字;所以每一级进行20次迭代运算,4级共80次运算。需要将16个32位数据段扩展为80个32位字并分别参加80次迭代运算,但每一级操作使用同一个常量,故常数只需4个。
二者比较来看,SHA-1的摘要长度是160位,MD5的摘要长度是128位,SHA-1的抗碰撞性更好,同时也使得其计算复杂性高。

1.3 消息鉴别码(Hashed Message Authentication)

对消息的报文摘要进行加密运算后得到的结果,用于实现消息完整性检测的附加信息。
密钥K需要扩充到与数据段长度b相同,变为密钥K+。然后K+与某字节1异或得到S1,K+与某字节2异或得到S0,将S1与报文P串接后进行报文摘要运算,并将运算后的结果扩展为b位并与S0串接,再进行报文摘要运算,最后得到的结果就是HMAC。

1.4 报文摘要应用

1.4.1 完整性检测

应用密钥对报文进行加密并生成附加信息,将附加信息与报文一起发送,接收端可以使用相同密钥进行解密以验证报文在运输过程中是否被修改。

1.4.2 消息鉴别

消息鉴别是验证消息M确实是X发送的过程。

1.4.3 口令安全存储

算法的单向性使得在知道报文摘要h的情况下,无法找到报文P使得h=MD§。

1.4.4 数字签名

数字签名是某个报文的附加信息,该附加消息能够证明签名者的真实性,也能证明签名者是对该报文的确认。

2 报文摘要算法代码(MD5)

# -*- coding: utf-8 -*-

import struct
import math
import binascii

lrot = lambda x,n: (x << n)|(x >> 32- n)  #循环左移的骚操作

#初始向量
A, B, C, D = (0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476)
# A, B, C, D = (0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210)

#循环左移的位移位数
r = [   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
        ]

#使用正弦函数产生的位随机数,也就是书本上的T[i]
T =  [int(math.floor(abs(math.sin(i + 1)) * (2 ** 32))) for i in range(64)]


def init_mess(message):
    global A
    global B
    global C
    global D
    A, B, C, D = (0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476)
    # A, B, C, D = (0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210)
    #将python值转为字节流      Q--Standard size=8  
    length = struct.pack('<Q', len(message)*8)  #原消息长度64位比特的添加格式,bytes类型
    
    while len(message) > 64:
        solve(message[:64])
        message = message[64:]

    #长度不足64位消息自行填充
    #因为python3对字符串和二进制数据流做了明确的区分,所以需要先将message的数据类型改为bytes
    message=bytes(message,'utf-8') # type convert to bytes
    message += b'\x80'
    message += b'\x00' * (56 - len(message) % 64)#len=56
    message += length  # len=64
    #print(binascii.b2a_hex(message))
    solve(message[:64])


def solve(chunk):
    global A
    global B
    global C
    global D
    #将字节流转为python数据类型  I---Standard size=4  python type=integer
    M = list(struct.unpack('<' + 'I' * 16, chunk))  #分成16个组,I代表1组32位
    #print(M)
    a, b, c, d = A, B, C, D

    for i in range(64):  #64轮运算
        if i < 16:  #每一轮运算只用到了b,c,d三个
            f = ( b & c)|((~b) & d)
            flag  = i      #用于标识处于第几组信息
        elif i < 32:
            f = (b & d)|(c & (~d))
            flag = (5 * i +1) %16
        elif i < 48:
            f = (b ^ c ^ d)
            flag  = (3 * i + 5)% 16
        else:
            f = c ^(b |(~d))
            flag  = (7 * i ) % 16
        
        tmp = b + lrot((a + f + T[i] + M[flag])& 0xffffffff,r[i]) #&0xffffffff为了类型转换
        a, b, c, d = d, tmp & 0xffffffff, b, c
        #print(hex(a).replace("0x","").replace("L",""), hex(b).replace("0x","").replace("L","") , hex(c).replace("0x","").replace("L",""), hex(d).replace("0x","").replace("L",""))
    A = (A + a) & 0xffffffff
    B = (B + b) & 0xffffffff
    C = (C + c) & 0xffffffff
    D = (D + d) & 0xffffffff
 


def digest():#output长度为16*8=128
    global A
    global B
    global C
    global D
    print(type(struct.pack('<IIII',A,B,C,D)))
    return struct.pack('<IIII',A,B,C,D)

def hex_digest():
    #返回二进制表示的十六进制表示
    # decode()方法以 encoding 指定的编码格式解码字符串,默认为字符串编码
    return binascii.hexlify(digest()).decode()


if __name__ == '__main__':
    while True:
        mess = input("请输入你的信息:")
        init_mess(mess)
        out_put = hex_digest()
        print(out_put)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

报文摘要算法 的相关文章

随机推荐

  • R语言之函数调用

    处理数据对象的实用函数 函 数 功 能 length object 显示对象中元素 成分的数量 dim object 显示对象的维度 str object 显示对象的结构 class object 显示对象的类型 mode object 显
  • 还在为数据清洗抓狂?这里有一个简单实用的清洗代码集

    选自towardsdatascience 作者 Admond Lee 机器之心编译 参与 Geek AI 张倩 数据清洗是数据科学家逃不掉的一份苦差事 为了让这项工作不那么痛苦 本文作者分享了自己的数据清洗代码集 现实世界中的数据通常质量不
  • 听说你还不知道什么是 python?带你深入理解什么是 python

    文章目录 前言 什么是python python的由来 我们为什么要学习python 帮助python学习的网站 前言 各位朋友们 大家好 在之后的时间里 我将陆续为大家分享我在python学习过程中学习到的知识点 如果你也对python感
  • 【随机过程】 17 -离散时间马氏链典型应用

    离散时间马尔科夫链的典型应用 文章目录 离散时间马尔科夫链的典型应用 0 概述 1 Page Rank 1 1 背景 1 2 模型建立 1 3 模型求解 2 MCMC 2 1 概述 2 2 实现思路 2 3 具体实现 2 3 1 第一步 细
  • Qt基础之五:使用invokeMethod异步调用函数

    在主线程中如果执行比较耗时的任务 但是又不想单独开子线程来处理 不妨试试Qt中提供QMetaObject invokeMethod方法 该方法支持函数的异步调用 这样就会在界面显示后去执行 而不会卡主主界面 QMetaObject invo
  • [linux-sd-webui]图生文,blip/deepbooru

    GitHub pharmapsychotic clip interrogator Image to prompt with BLIP and CLIPImage to prompt with BLIP and CLIP Contribute
  • 【hadoop学习之路】Spark-SQL 实验报告 RDD转DataFrame

    1 Spark SQL 基本操作 1 1 需求 将下列JSON格式数据复制到Linux系统中 并保存命名为employee json id 1 name Ella age 36 id 2 name Bob age 29 id 3 name
  • Pandas处理日期数据

    一 pandaas日期处理的作用 将2018 01 01 1 1 2018等多种日期格式映射成统一的格式对象 在该对象上提供强大的功能支持 几个概念 1 pd to datetime pandas的一个函数 能将字符串 列表 series变
  • 数据结构——个人学习笔记

    系列目录 数据结构第一章绪论 数据结构第二章线性表 文章目录 系列目录 2 1线性表的定义和特点 2 2线性表的操作定义 2 3线性表的顺序表示和实现 线性表的重要基本操作 1 初始化线性表 参数用指针 2 插入 新增 3 取值 4 查找
  • easy modbus tcp

    public static void Main string args ModbusClient modbusClient new ModbusClient 190 201 100 100 502 Ip Address and Port o
  • Android组件化和插件化的概念,android快速开发框架

    开发单个模块时可以共享资源和工具类 可以针对单个模块测试 开发调试时不需要对整个项目进行编译 多人合作时可以只关注自己的业务模块 把某一业务当成单一项目来开发 可以灵活的对业务模块进行组装和拆分 4 组件化开发的主要思路 就是将一个Modu
  • c++求行列式的值(全排列法)

    用全排列的方式求行列式的值 递归体现在全排列中 上代码 f函数是求行列式的值 include
  • flink中通过jdbc查询结果集使用 flink table api 创建临时视图

    1 maven依赖
  • [转]QNX_HMI_crank工程的系统移植

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 开发软件 Cr
  • python如何输出多个星号_如何使用python输出连续星号?

    小编依稀记得 自己初学编程时候 第一节课 老师就给我们演示了输出连续星号内容 那时候真感叹python的神奇 重温一遍这个内容 入门小伙伴们可以来看下啦 有关语法 用嵌套打印小星星 需求 在控制台连续输出五行 每一行星号的数量依次递增 使用
  • 如何从配置文件中获取属性

    在项目中添加了一个腾讯云的短信业务 领导说要我把这个项目整合到原本的业务中去 业务那么多 怎么搞 继续询问后得知 是整合到原本的短信业务中 原本用的短信业务是短信猫来发短信 问 需要前端加传的参数吗 答 不允许 继续询问得知 是要在配置文件
  • [转]Tangram框架应用开发的一般模式

    框架其实就是一种开发模式 用tangram框架开发应用程序意味着选择一种面向接口 模块化的开发方式 这和传统的Delphi应用程序开发方式有一定区别 对于刚刚接触框架的童鞋可能不知道如何下手 因此有必要把框架的一般开发方式说明一下 不过框架
  • 深入分析HBase Compaction机制

    Compaction介绍 Compaction是buffer gt flush gt merge的Log Structured Merge Tree模型的关键操作 主要起到如下几个作用 1 合并文件 2 清除删除 过期 多余版本的数据 3
  • 二叉树算法

    每日一句 少年就是少年 他们看春风不喜 看夏蝉不烦 看秋风不悲 看冬雪不叹 看满身富贵懒察觉 看不公不允敢面对 只因他们是少年 目录 用递归和非递归两种方式实现二叉树的先序 中序 后序遍历 递归方法 非递归方法 如何完成二叉树的宽度优先遍历
  • 报文摘要算法

    1 报文摘要算法 报文摘要算法是一种将任意长度报文转换成固定长度的报文摘要算法 它具有以下六个特点 能够作用于任意长度的报文 产生有限位数的标识信息 易于实现 具有单向性 具有抗碰撞性 具有高灵敏性 1 1 MD5 1 1 1 添加填充位