RFC4493——AES-CMAC

文章目录

  • Abstract
  • 1 Introduction
  • 2 Specification of AES-CMAC
    • 2.1 Basic Definitions
    • 2.2 Overview
    • 2.3 Subkey Generation Algorithm
    • 2.4 MAC Generation Algorithm
    • 2.5 MAC Verification Algorithm
  • 3 Security Considerations
  • 4 Test Vectors
  • 5 测试代码
    • 5.1 C语言版本
    • 5.2 Python语言版本
  • 6 SM4-CMAC
    • 6.1 SM4算法库
    • 6.2 SM4算法测试向量
    • 6.3 SM4-CMAC算法测试向量
  • 参考资料

Abstract

This memo specifies an authentication algorithm based on CMAC with the 128-bit Advanced Encryption Standard (AES). This new authentication algorithm is named AES-CMAC.

1 Introduction

AES-CMAC可以检测有意图的,未鉴权的数据修改,也包括意外修改。
AES比hash函数更容易使用。

2 Specification of AES-CMAC

2.1 Basic Definitions

见原文。

2.2 Overview

Illustration of the two cases of AES-CMAC
如果Message的size是128bit的整数倍,最后一个block在AES_K运算之前要和K1进行XOR运算;否则,最后一个block会使用10^i填充到128bit,并且在AES_K运算之前和K2进行XOR运算。
AES_K:使用秘钥K的AES-128。
M:message,被切分成了M_1,M_2,……, M_n, M_i就表示第i个block。M_1到M_n-1的长度都是128bits。M_n 的长度是≤128bits。
K1和K2是子密钥生成算法生成的两个子密钥。

2.3 Subkey Generation Algorithm

子密钥生成算法的输入输出表示:(K1,K2) := Generate_Subkey(K),K就是AES-128的秘钥,K1和K2就是算法输出结果,两个子密钥。
Algorithm Generate_Subkey

2.4 MAC Generation Algorithm

MAC生成算法被表示为:T := AES-CMAC(K,M,len),K表示秘钥,M就是要保护的message,len是消息长度(单位为octets)。校验MAC可以确定消息的完整性(integrity)和鉴权(authenticity)。
Algorithm AES-CMAC
n就是block个数, flag就表示是否被整除了,true表示正好是128的整数倍,false表示反之。

2.5 MAC Verification Algorithm

Algorithm Verify_MAC

3 Security Considerations

由AES算法提供安全性保证。 AES或者其他加密算法的优势部分在于秘钥K和实现的正确性。密钥的生成方式应满足 RFC 4086的伪随机性要求,并应安全保存。 当且仅当正确使用 AES-CMAC 时,它才能提供满足当前消息身份验证最佳实践的身份验证和完整性。

4 Test Vectors

见原文:https://datatracker.ietf.org/doc/html/rfc4493

5 测试代码

5.1 C语言版本

见原文。

5.2 Python语言版本

from .abscipheralgo import AbsCipherAlgoclass CmacAlgo:byte_limit = 16bit_limit = 128const_rb = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87')const_zero = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')def xor_bit_limit(self, a:bytearray, b:bytearray) -> bytearray:assert len(a) == self.byte_limitassert len(b) == self.byte_limitout = bytearray(self.byte_limit)for i in range(self.byte_limit):out[i] = a[i] ^ b[i]return outdef left_shift_one_bit(self, input:bytearray) -> bytearray:assert len(input) == self.byte_limitoverflow = bytearray(1)output = bytearray(self.byte_limit)for i in reversed(range(self.byte_limit)):# make sure is a byteoutput[i] = (input[i] << 1) & 0xFFoutput[i] |= overflow[0]overflow[0] = 1 if (input[i] & 0x80) else 0return outputdef generate_subkey(self, key: bytearray, cipher_algo:AbsCipherAlgo):L = bytearray(self.byte_limit)Z = bytearray(self.byte_limit)tmp = bytearray(self.byte_limit)for i in range(self.byte_limit):Z[i] = 0L = cipher_algo.encrypt(key, Z)# If MSB(L) = 0, then K1 = L << 1if (L[0] & 0x80) == 0:K1 = self.left_shift_one_bit(L)else:tmp = self.left_shift_one_bit(L)K1 = self.xor_bit_limit(tmp, self.const_rb)if K1[0] & 0x80 == 0:K2 = self.left_shift_one_bit(K1)else:tmp = self.left_shift_one_bit(K1)K2 = self.xor_bit_limit(tmp, self.const_rb)return K1,K2"""将最后一个block以10^i的方式补齐"""def padding(self, last_block: bytearray):assert last_block is not Nonepad = bytearray(self.byte_limit)for j in range(self.byte_limit):if j < len(last_block):pad[j] = last_block[j]elif j == len(last_block):pad[j] = 0x80else:pad[j] = 0x00return paddef cmac(self, key: bytearray, input:bytearray, cipher_algo:AbsCipherAlgo) -> bytes:K1, K2 = self.generate_subkey(key, cipher_algo)# n is number of rounds# c语言直接除,因为int截断n = (len(input) + self.byte_limit - 1) // self.byte_limitif n == 0:n = 1# last block is not a complete blockflag = 0else:# last block is a complete blockif len(input) % self.byte_limit == 0:flag = 1else:flag = 0# 计算M_last# last block is completeif flag:M_last = self.xor_bit_limit(input[(n - 1) * self.byte_limit : ], K1)else:padded = self.padding(input[(n - 1) * self.byte_limit : ])M_last = self.xor_bit_limit(padded, K2)X = bytearray(self.byte_limit)for i in range(self.byte_limit):X[i] = 0for i in range(n-1):Y = self.xor_bit_limit(X, input[self.byte_limit * i : self.byte_limit * (i + 1)])X = cipher_algo.encrypt(key, Y)Y = self.xor_bit_limit(X, M_last)X = cipher_algo.encrypt(key, Y)mac = bytearray(self.byte_limit)for i in range(self.byte_limit):mac[i] = X[i]return mac
from .cmacalgo import CmacAlgoclass Cmac128Algo(CmacAlgo):const_rb = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87')const_zero = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')def __init__(self):self.byte_limit = 16self.bit_limit = 128self.const_rb = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87')self.const_zero = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
from .cmacalgo import CmacAlgoclass Cmac256Algo(CmacAlgo):const_rb = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87')const_zero = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')def __init__(self):self.byte_limit = 32self.bit_limit = 256const_rb = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87')const_zero = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

6 SM4-CMAC

6.1 SM4算法库

Cryptography:https://blog.51cto.com/u_16175518/6765321
CryptSM4:https://cloud.tencent.com/developer/article/1751336?areaId=106001
https://github.com/yang3yen/pysm4

算法padding模式:PKCS7,None

6.2 SM4算法测试向量

明文:
0x40, 0x10, 0xFF, 0xEF, 0x00, 0x45, 0x93, 0x00, 0xAB, 0xCD, 0xEE, 0x00, 0xF0, 0xF4, 0x00, 0x88,
0xA2, 0x19, 0x09, 0x67, 0x87, 0x0C, 0xFF, 0x54, 0xF3, 0x12, 0x50, 0x33, 0xC7, 0xF9, 0x1F, 0xDF,
0x13, 0x73, 0x4F, 0x67, 0xD7, 0xEB, 0xCC, 0x44, 0xF1, 0x12, 0x90, 0x18, 0xA7, 0xA9, 0x1F, 0x03,
0x13, 0x88, 0x4F, 0x67, 0xD7, 0xEB, 0xCC, 0x44, 0xF1, 0x12, 0x46, 0x18, 0x64, 0xA9, 0x1F, 0xEE,

密钥:
0x23, 0x33, 0x41, 0x67, 0x87, 0xEB, 0xFF, 0x54, 0xF1, 0x12, 0x90, 0x11, 0xC7, 0xF9, 0x1F, 0x23

ECB密文:
0x92, 0x31, 0xc8, 0x55, 0xcb, 0x47, 0x0b, 0x07, 0x93, 0x1d, 0xff, 0xb8, 0x14, 0x23, 0x4c, 0x63,
0x06, 0xc9, 0x57, 0x3f, 0x37, 0x12, 0x3b, 0x54, 0xef, 0x61, 0xb6, 0x82, 0x18, 0x83, 0x1f, 0xa2,
0x8a, 0xb6, 0xa9, 0xcc, 0x02, 0xa7, 0xd3, 0x26, 0xeb, 0xeb, 0xe4, 0x5a, 0x48, 0xab, 0xb2, 0xe1,
0x5b, 0x38, 0x67, 0xe9, 0xb4, 0x16, 0x47, 0x6a, 0x0a, 0xf3, 0x9b, 0xef, 0x12, 0xb0, 0x28, 0xb5,

CBC密文:
0x0f, 0xa7, 0x44, 0xda, 0xba, 0x7c, 0x9d, 0xe3, 0xc3, 0xde, 0xab, 0xe7, 0x42, 0x4f, 0x29, 0x68,
0xa2, 0xdd, 0x8e, 0x21, 0x60, 0xd5, 0xbd, 0x5f, 0xf1, 0x63, 0x7e, 0xa7, 0xb2, 0xdf, 0x3f, 0x89,
0x73, 0xc9, 0x72, 0xe6, 0x69, 0x2d, 0xee, 0x23, 0xe5, 0x10, 0xd7, 0x57, 0x7d, 0xc2, 0x1f, 0x0b,
0x6f, 0x12, 0x51, 0x6d, 0xc3, 0x28, 0x2b, 0x07, 0xee, 0xd2, 0x56, 0x05, 0x22, 0x1e, 0x3d, 0xad,

6.3 SM4-CMAC算法测试向量

明文:
0x40, 0x10, 0xFF, 0xEF, 0x00, 0x45, 0x93, 0x00, 0xAB, 0xCD, 0xEE, 0x00, 0xF0, 0xF4, 0x00, 0x88,
0xA2, 0x19, 0x09, 0x67, 0x87, 0x0C, 0xFF, 0x54, 0xF3, 0x12, 0x50, 0x33, 0xC7, 0xF9, 0x1F, 0xDF,
0x13, 0x73, 0x4F, 0x67, 0xD7, 0xEB, 0xCC, 0x44, 0xF1, 0x12, 0x90, 0x18, 0xA7, 0xA9, 0x1F, 0x03,
0x13, 0x88, 0x4F, 0x67, 0xD7, 0xEB, 0xCC, 0x44, 0xF1, 0x12, 0x46, 0x18, 0x64, 0xA9, 0x1F, 0xEE,

密钥:
0x23, 0x33, 0x41, 0x67, 0x87, 0xEB, 0xFF, 0x54, 0xF1, 0x12, 0x90, 0x11, 0xC7, 0xF9, 0x1F, 0x23

CMAC密文:
0xb0, 0xeb, 0x38, 0x61, 0xe6, 0xc5, 0xc1, 0x09, 0x89, 0x61, 0x30, 0x7d, 0x49, 0xb1, 0x7a, 0x7d

参考资料

[1] https://datatracker.ietf.org/doc/html/rfc4493
[2]

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

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

相关文章

阿里健康再得阿里巴巴资产注入 实现“自营+佣金+营销”多轮驱动

11月28日晚间&#xff0c;阿里健康发布公告宣布&#xff0c;正式与阿里巴巴集团签署股权认购协议&#xff0c;以135.12亿港元对价&#xff0c;获得阿里妈妈医疗健康类目的独家营销审核权及附属权利。交易完成后&#xff0c;阿里巴巴集团在阿里健康的持股比例将从56.99%上升到63…

鸿蒙原生应用/元服务开发-AGC分发如何下载管理Profile

一、收到通知 尊敬的开发者&#xff1a; 您好&#xff0c;为支撑鸿蒙生态发展&#xff0c;HUAWEI AppGallery Connect已于X月XX日完成存量HarmonyOS应用/元服务的Profile文件更新&#xff0c;更新后Profile文件中已扩展App ID信息&#xff1b;后续上架流程会检测API9以上Harm…

RHCE第五次作业

目录 1.算数运算命令有哪几种&#xff1f; 1.&#xff08;&#xff08;&#xff09;&#xff09; 2&#xff0c;let 3.[] 4.declare -i 5.expr 6.bc 7.awk 总结&#xff1a; 2..定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/10356881…

springboot集成springsecurity

转载自&#xff1a;www.javaman.cn 1、整合springsecurity 添加pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>2、springsecurity认证授权流程…

OpenCV | 模版匹配

import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline 模版匹配 模版匹配和卷积原理很像&#xff0c;模版在原图像上从原点开始滑动&#xff0c;计算模版与&#xff08;图像被模版覆盖的地方&#xff…

go标准库

golang标准库io包 input output io操作是一个很庞大的工程&#xff0c;被封装到了许多包中以供使用 先来讲最基本的io接口 Go语言中最基本的I/O接口是io.Reader和io.Writer。这些接口定义了读取和写入数据的通用方法&#xff0c;为不同类型的数据源和数据目标提供了统一的接…

同旺科技 USB 转 RS-485 适配器 -- 隔离型(定制款)

内附链接 1、USB 转 RS-485 适配器 隔离版主要特性有&#xff1a; ● 支持USB 2.0/3.0接口&#xff0c;并兼容USB 1.1接口&#xff1b; ● 支持USB总线供电&#xff1b; ● 支持Windows系统驱动&#xff0c;包含WIN10 / WIN11 系统32 / 64位&#xff1b; ● 支持Windows …

一文例说嵌入式 C 程序的内聚和耦合

1 - 原理篇 低耦合&#xff0c;是指模块之间尽可能的使其独立存在&#xff0c;模块之间不产生联系不可能&#xff0c;但模块与模块之间的接口应该尽量少而简单。这样&#xff0c;高内聚从整个程序中每一个模块的内部特征角度&#xff0c;低耦合从程序中各个模块之间的关联关系…

多个加速度计/麦克风连接指引

座舱内的振动投诉&#xff1a;如乘客/驾驶员在车厢内感受到传动轴、方向盘抖动剧烈 图1.三轴模式下的单个加速度计 图2.软件设置界面 如果您只有一个加速度计&#xff0c;可以在三轴模式下使用一个加速度计找出客户投诉车厢内振动最强烈的区域。例如将加速度计连接到驾驶员座椅…

对接电商平台高效获取各大电商平台数据,商品详情数据代码示例

电商可以通过使用API接口获取商品信息数据。API是应用程序编程接口的缩写&#xff0c;它允许程序之间进行通信和数据传输。为了获取商品信息数据&#xff0c;电商可以利用API接口向商品供应商的数据库发送请求&#xff0c;然后接收并解析返回的数据。 具体来说&#xff0c;电商…

​ 数据库开发海外服务器选择:一篇教程看懂Amazon EC2开发环境搭建

大家的数据库之类的开发环境都是安装在哪的呢&#xff1f;平时开发用的数据库有时候回家还想要用一下&#xff0c;就需要远程到公司的电脑把数据库导出来&#xff0c;然后将文件下载到家里的电脑并导入家里电脑的数据库里&#xff0c;着实麻烦&#xff0c;或者选择内网穿透或虚…

解决api-ms-win-crt-runtime-l1-1-0.dll丢失的问题,全是干货分享

今天我的电脑中突然出现关于“api-ms-win-crt-runtime-l1-1-0.dll”的错误提示&#xff0c;关闭提示后再次打开程序依然不能正常打开&#xff0c;出现这样的问题突然不知道是因为什么&#xff0c;于是就去了解了关于出现api-ms-win-crt-runtime-l1-1-0.dll错误的问题&#xff0…

去北京医院预约,需要医保卡号,但是社保卡不在身边,北京的医保卡号咋网上查询

目录 1 问题2 查询 1 问题 要去北京某一个医院预约挂号&#xff0c;预约的时候选择的医保&#xff0c;需要写医保卡号&#xff0c;但是自己的社保卡不在身边&#xff0c;怎么办 记住&#xff0c;医保卡号不是社保卡号&#xff0c;是不一样的 北京医保卡号是12位 2 查询 登陆这…

LeetCode2514.统计同位异构字符串数目

题目简单&#xff0c;关键是灵茶山艾府的代码写起来太优美&#xff0c;不得不记录一下 const int Mod 1e97; using ll long long; ll qmi(ll a,ll b,ll mod){ll res 1;while(b){if(b&1)res res*a%mod;aa*a%mod;b>>1;}return res; }class Solution { public:int c…

XMind思维导图:掌握思维之翼,激发无限创造力

在当今快速发展的信息时代&#xff0c;高效地表达和梳理思维显得尤为重要。在这个背景下&#xff0c;XMind作为一款思维导图软件&#xff0c;以其独特的优势脱颖而出。它不仅在Mac和Windows平台上均可使用&#xff0c;还以其人性化的设计和强大的功能&#xff0c;成为了思维导图…

2023亚马逊云科技re:Invent,在开发者板块探究如何利用技术重塑业务

美国当地时间11月27日&#xff0c;一年一度的亚马逊云科技re:Invent大会在美国拉斯维加斯盛大开幕。这场全球云计算领域的前沿盛会&#xff0c;已连续12年成为引领行业的风向标。那么本次2023亚马逊云科技re:Invent大会又有哪些可玩、可看的新项目&#xff0c;下面就一起来瞧一…

【AIGC】关于Prompt你必须知道的特性

代码和数据:https://github.com/tonyzhaozh/few-shot-learning 一、实践验证的大模型的特性 1. 大模型的偏差 示例&#xff1a;&#xff08;文本的情感分析&#xff1a;一句话->P(积极&#xff09;或者N&#xff08;消极) Input: I hate this movie. Sentiment: Negativ…

查看mysql 或SQL server 的连接数,mysql超时、最大连接数配置

1、mysql 的连接数 1.1、最大可连接数 show variables like max_connections; 1.2、运行中连接数 show status like Threads_connected; 1.3、配置最大连接数&#xff0c; mysql版本不同可配置的最大连接数不同&#xff0c;mysql8.0的版本默认151个连接数&#xff0c;…

java ssh 二手车交易管理系统eclipse开发mysql数据库MVC模式java编程网页设计

一、源码特点 JSP ssh 二手车交易管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT…

“2024年国考公共科目”趣谈

黄金的熔点仅为1064.43C&#xff0c;不锈钢、耐高温钢所需的冶炼温度也仅需2000℃以上&#xff0c;因此与正在进行中的“2024年国考公共科目笔试”的“报名人数首破300万&#xff0c;平均约77人竞争一岗位”相比&#xff0c;炼金炼钢温度全都败落下风。 网络图片 其中宁夏的一…