python源码 PBOCMaster MAC的计算函数及计算过程 2des

news2024/9/20 22:49:31

注意最后一步要用整个key加密

计算过程:

MAC: PBOC-MAC DES算法
密钥 长度16(0x10)字节
57 75 20 4D 69 61 6F 6A 75 6E 40 47 26 44 43 11
初始向量 长度8(0x08)字节
00 00 00 00 00 00 00 00
数据 长度74(0x4A)字节
43 48 45 4E 48 41 4F 2D 50 43 7C 42 46 45 42 46 42 46 46 30 30 30 33 30 36 43 33 7E 39 42 50 30 50 44 32 43 4E 37 30 31 36 33 36 36 49 30 30 34 33 7C 32 30 32 34 30 31 31 31 7C 32 30 32 35 30 31 30 31 7C 38 31 39 31 7C 30
结果 长度8(0x08)字节
40 89 81 9D 3D 99 1C C7

计算过程
强制补0x80再用0x00补齐8的倍数得到4348454E48414F2D50437C424645424642464630303033303643337E39425030504432434E3730313633363649303034337C32303234303131317C32303235303130317C383139317C30800000000000
后续步骤与X99/X9.19一样

0000000000000000异或4348454E48414F2D得到4348454E48414F2D

用5775204D69616F6A对4348454E48414F2D进行DES加密得到9E21A468008DB6B4

9E21A468008DB6B4异或50437C4246454246得到CE62D82A46C8F4F2

用5775204D69616F6A对CE62D82A46C8F4F2进行DES加密得到196C0FEDC9D24187

196C0FEDC9D24187异或4246463030303330得到5B2A49DDF9E272B7

用5775204D69616F6A对5B2A49DDF9E272B7进行DES加密得到C41CE10A60F953E1

C41CE10A60F953E1异或3643337E39425030得到F25FD27459BB03D1

用5775204D69616F6A对F25FD27459BB03D1进行DES加密得到A31ED80C9E6D58F7

A31ED80C9E6D58F7异或504432434E373031得到F35AEA4FD05A68C6

用5775204D69616F6A对F35AEA4FD05A68C6进行DES加密得到82024776C27DDC18

82024776C27DDC18异或3633363649303034得到B43171408B4DEC2C

用5775204D69616F6A对B43171408B4DEC2C进行DES加密得到788739F54CE3DEF2

788739F54CE3DEF2异或337C323032343031得到4BFB0BC57ED7EEC3

用5775204D69616F6A对4BFB0BC57ED7EEC3进行DES加密得到6A808D8F7991B2FC

6A808D8F7991B2FC异或31317C3230323530得到5BB1F1BD49A387CC

用5775204D69616F6A对5BB1F1BD49A387CC进行DES加密得到B7EFC86C359642EA

B7EFC86C359642EA异或3130317C38313931得到86DFF9100DA77BDB

用5775204D69616F6A对86DFF9100DA77BDB进行DES加密得到FEC7A7C308C3357E

FEC7A7C308C3357E异或7C30800000000000得到82F727C308C3357E

用5775204D69616F6A756E404726444311对82F727C308C3357E进行DES加密得到4089819D3D991CC7

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

from Crypto.Cipher import DES, DES3

def des_encrypt(data, key):
    """DES加密函数,返回加密后的字节数据。"""
    cipher = DES.new(key, DES.MODE_ECB)
    return cipher.encrypt(data)

def des3_encrypt(data, key):
    """双倍长密钥的DES3加密函数,返回加密后的字节数据。"""
    cipher = DES3.new(key, DES3.MODE_ECB)
    return cipher.encrypt(data)

def xor_bytes(a, b):
    """对两个字节序列进行异或操作,返回结果字节序列。"""
    return bytes(x ^ y for x, y in zip(a, b))

def pboc_mac(data, key, iv):
    """
    PBOC MAC计算函数
    :param data: 原始数据,字节序列
    :param key: 加密密钥,字节序列,长度必须为16字节
    :param iv: 初始向量,字节序列,长度为8字节
    :return: 计算出的MAC值,字节序列
    """
    # 确保密钥长度为16字节,切分成两个8字节的密钥
    key1, key2 = key[:8], key[8:]

    # 强制补0x80再用0x00补齐8的倍数
    data += b'\x80'
    data += b'\x00' * ((8 - len(data) % 8) % 8)
    print(f"补齐后的数据: {data.hex().upper()}")

    # 逐步进行异或和DES加密操作
    block = iv
    print(f"初始向量: {block.hex().upper()}")
    final_mac=  b''
    for i in range(0, len(data), 8):
        block = xor_bytes(block, data[i:i + 8])
        print(f"异或后第{i // 8 + 1}块: {block.hex().upper()}")
        if i//8+1 != len(data)//8:        
            block = des_encrypt(block, key1)
            print(f"加密后第{i // 8 + 1}块: {block.hex().upper()}")
        else:
            # 最后一步用key1-key2双倍长密钥对结果进行DES-EDE加密
            print("block=",block.hex().upper())
            print("key=",(key).hex().upper())
            final_mac = des3_encrypt(block, key)
            print(f"最终加密结果: {final_mac.hex().upper()}")
    return final_mac

# 示例数据
key = bytes.fromhex('5775204D69616F6A756E404726444311')
iv = bytes.fromhex('0000000000000000')
data = bytes.fromhex('1148454E48414F2D50437C424645424642464630303033303643337E39425030504432434E3730313633363649303034337C32303234303131317C32303235303130317C383139317C30')

# 计算MAC
mac = pboc_mac(data, key, iv)

# 打印结果
print("计算的MAC:", mac.hex().upper())

# 验证结果是否正确
expected_mac = bytes.fromhex('B519448B9A29F920')
print("计算是否正确:", mac == expected_mac)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2094905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何成为一个飞控算法工程师?

兄弟,这个问题问得好,但也别想着靠看几本书就能一步登天。飞控算法这玩意儿,真要干好了,不是简简单单几个公式几个库就能搞定的。你本科电子专业有点基础,玩过四轴飞行器也算是入门了,但要搞真算法&#xf…

做克隆虚拟机的basic

新建一台虚拟机(之前写的有这一步) 虚拟机里操作 vi /etc/hostname 改称basic (可改可不改) vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic DEFROUTEyes IPV4_FAILURE_FATALno IP…

★ 算法OJ题 ★ 力扣 LCR179 - 和为 s 的两个数字

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;小诗歌剧将和大家一起做一道双指针算法题--和为 s 的两个数字~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 …

静态工厂模式(简单工厂模式)与动态工厂模式(工厂方法模式)

1. 简单工厂模式 核心是定义一个创建对象的接口&#xff0c;将对象的创建和本身的业务逻辑分离&#xff0c;降低系统的耦合度&#xff0c;使得两个修改起来相对容易些&#xff0c;当以后实现改变时&#xff0c;只需要修改工厂类即可。该模式对对象创建管理方式最为简单&#x…

list的使用与迭代器的模拟实现

前面学习了string&#xff0c;vector类的使用及模拟&#xff0c;但是它们有一个统一的特点就是底层的内存是连续的&#xff0c;因此迭代器的实现也很简单。现在我们开始学习list类的使用&#xff0c;模拟实现&#xff0c;来看看这个底层内存不是连续的有什么特别之处&#xff0…

2024 SEKAI-CTF(nolibc speedpwn life_simulator_2)

文章目录 nolibcexp speedpwnexp life_simulator_2委托构造函数委托构造函数的语法解释 std:remove和std:erase代码解释原理内存管理注意事项 思路1. 背景2. 示例代码3. 解释 vector插入逻辑1. 函数参数2. 本地变量3. 逻辑分析4. 扩容逻辑5. 直接插入逻辑6. 返回结果 exp nolib…

集成电路学习:什么是FPGA现场可编程门阵列

一、FPGA&#xff1a;现场可编程门阵列 FPGA&#xff0c;全称Field Programmable Gate Array&#xff0c;即现场可编程门阵列&#xff0c;是一种超大规模可编程逻辑器件。它由可编程逻辑资源、可编程互连资源和可编程输入输出资源组成&#xff0c;主要用于实现以状态机为主要特…

【计算机组成原理】七、输入/输出系统:2.I/O接口、I/O控制方式

I/O接口、I/O控制方式 2. I/O接口 文章目录 I/O接口、I/O控制方式2. I/O接口2.1 I/O接口的作用2.2 结构2.3 工作原理2.4 I/O端口2.5 分类 3. I/O控制方式3.1程序查询方式3.2程序中断方式3.2.1中断系统3.2.2工作流程3.2.3多重中断与中断屏蔽技术3.2.4程序中断方式 3.3DMA控制方…

Excel技巧(二)

函数 SUMIFS函数 用于计算其满足多个条件的全部参数的总量 语法&#xff1a;SUMIFS(sum_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...) COUNTIFS函数 计算多个区域中满足给定条件的单元格的个数 语法&#xff1a;countifs(criteria_range1,crit…

【Python报错已解决】`ModuleNotFoundError: No module named ‘graphviz‘`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 在开发过程中&#xff0c;你是否遇到过尝试导入graphviz模块时遇到了ModuleNotFoundError: No module named …

突发:Runway删库跑路,备受瞩目的Stable Diffusion v1.5不见了!

Runway AI, Inc.创立于2018年&#xff0c;总部位于美国纽约州New York&#xff0c;Runway 是一家应用人工智能研究公司。Runway在谷歌领投的D轮融资中募集到约一亿美元。Runway不仅是投资界的新星&#xff0c;其产品Runway ML参与制作的《瞬息全宇宙》更是斩获了奥斯卡最佳女主…

Mysql基础练习题 1084.销售分析 (力扣)

编写解决方案&#xff0c;报告 2019年春季 才售出的产品。即 仅 在 2019-01-01 &#xff08;含&#xff09;至 2019-03-31 &#xff08;含&#xff09;之间出售的商品 题目链接&#xff1a; https://leetcode.cn/problems/sales-analysis-iii/description/ 建表插入数据&…

【超音速 专利 CN116109587A】一种复杂环境下密封钉焊缝质量检测方法

申请号CN202310066309.X公开号&#xff08;公开&#xff09;CN116109587A申请日2023.01.12申请人&#xff08;公开&#xff09;超音速人工智能科技股份有限公司(833753)发明人&#xff08;公开&#xff09;张俊峰(总); 陈炯标 原文摘要 本发明公开了一种复杂环境下密封钉焊缝…

Javascript常见面试手写题

Javascript常见面试手写题 欢迎Star ⭐️ github 通过自动化脚本&#xff0c;每次push会自动跑单测 100%单测通过,每一个方法都使用jest单元测试进行了验证 后续会持续更新 单测报告 每次push自动生成测试报告 覆盖率单测概览 函数 题目描述1.防抖2.节流5.深浅拷贝6.发…

计算机毕业设计选题推荐-客栈管理系统-酒店预订-民宿管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Unity编辑器扩展之Scene视图扩展

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity编辑器扩展之Scene视图扩展 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01; …

农产品智慧物流系统论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#x…

【比较】数据字节串/字串比较指令 (CMPSB/CMPSW),数据字节串/字串检索指令(SCASB/SCASW)的区别

&#x1f31f; 嗨&#xff0c;我是命运之光&#xff01; &#x1f30d; 2024&#xff0c;每日百字&#xff0c;记录时光&#xff0c;感谢有你一路同行。 &#x1f680; 携手启航&#xff0c;探索未知&#xff0c;激发潜能&#xff0c;每一步都意义非凡。 数据字节串/字串比较…

【卡码网C++基础课 14.链表的基础操作2】

目录 题目描述与分析代码编写 题目描述与分析 题目描述&#xff1a; 请编写一个程序&#xff0c;实现以下操作&#xff1a; 构建一个单向链表&#xff0c;链表中包含一组整数数据&#xff0c;输出链表中的第 m 个元素&#xff08;m 从 1 开始计数&#xff09;。 要求&#xf…

python-数组距离

题目描述 已知元素从小到大排列的两个数组 x[] 和 y[]&#xff0c;请写出一个程序算出两个数组彼此之间差的绝对值中最小的一个&#xff0c;这叫做数组的距离。输入格式&#xff1a; 输入共 3 行。 第一行为两个整数 m,n&#xff0c;分别代表数组 f[],g[] 的长度。 第二行有 m …