国密消息鉴别码学习笔记 ——含GB/T 15852和HMAC(第2章 基于分组密码的MAC)

2023-10-28 18:58

本文主要是介绍国密消息鉴别码学习笔记 ——含GB/T 15852和HMAC(第2章 基于分组密码的MAC),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

国密消息鉴别码学习笔记 

——含GB/T 15852和HMAC

摘要:本文档对我国标准规定的消息鉴别码的生成算法进行了简要介绍,包括算法生成步骤,注意事项等。我国的相关标准包括GB/T 15852.1-2008、GB/T 15852.2-2012、GB/T15852.3(目前为草稿)。

关键词:消息鉴别码,MAC,HMAC,杂凑算法,哈希算法,HASH,分组密码,消息填充。

2. 基于分组密码的MAC

2.1 整体架构

基于分组密码的MAC算法共六种,都按以下几个流程执行(流程图如下)。

图2.1基于分组密码的MAC算法流程

1)      数据填充(三种方案);

2)      第一个块的处理,也叫初始变换(两种方案);

3)      中间块的处理(CBC-MAC);

4)      MAC输出,也叫输出变换(三种方案);

基于分组密码的MAC有六种算法。

l  六种算法的数据填充方式未做硬性规定,可选择三种中的任意一种。

l  算法1—算法4是初始变换与输出变换的组合。

l  算法5(算法6)分别是两个并行的算法1(算法4)的MAC值做异或。当然并行MAC必须用不同的KEY。

l  其中某些算法可能涉及密钥派生,但标准未对密钥派生算法做硬性规定。

l  若需截断,则截获高位数据。

标准描述道:“算法4提供了一种改进的增加密钥长度的方法,强烈建议用户采用这个MAC算法4和填充方式3。”六种算法的详细配置如下表。

表2.1基于分组密码的MAC算法的配置情况

MAC算法

(六种方案)

数据填充

(三种方案)

初始变换

(两种方案)

中间块处理

(一种方案)

输出变换

(三种方案)

算法1

任选

初始1

CBC-MAC

输出1

算法2

任选

初始1

CBC-MAC

输出2

算法3

任选

初始1

CBC-MAC

输出3

算法4

任选

初始2

CBC-MAC

输出2

算法5

任选

两个算法1的MAC结果异或

算法6

任选

两个算法4的MAC结果异或

2.2 数据填充

以下三种方案都是保证填充后的长度为分组长度n的整数倍。

填充后的数据按分组长度分割为多个块。

2.2.1 数据填充方案1

l  消息右侧填充比特零(可以不添加)。

l  空串需添加n个0。

l  对简单伪造攻击不安全。

填充数据:padding=0...00

填充后的消息:MSG|| 0...00

2.2.2 数据填充方案2

l  消息右侧先填充一个比特1,再填充比特0(可以不添加比特0)。

填充数据:padding=10...00

填充后的消息:MSG|| 10...00

2.2.3 数据填充方案3

先在消息右侧填充比特0(可以不添加比特0),保证填0后的长度为分组长度n的整数倍,

再在消息左侧添加消息长度MSG_LENn比特,大端表示)。

填充数据:左侧为MSG_LEN,右侧为0...00

填充后的消息:MSG_LEN|| MSG || 10...00

注:如果在计算MAC前不能知道完整消息的长度,则填充方案3不可用。

2.3 初始变换

初始变化对分割得到的第一个块进行处理,其结果类似后续CBC_MAC的IV。如果没后续块,则不做CBC_MAC。

2.3.1 初始变换方案1

输入:D1(第一个块)、K(密钥)

输出:H1= ENCK(D1)

2.3.2 初始变换方案2

输入:D1(第一个块)、K(密钥)、K**(另一个密钥)

输出:H1= ENCK**( ENCK(D1) )

【注:需要两个密钥】

2.4 输出变换

2.4.1 输出变换方案1

输入:Hq(最后一个块的MAC)

输出:H= Hq(恒等变换)

【注:无需密钥】

2.4.2 输出变换方案2

输入:Hq(最后一个块的MAC)、K*(密钥)

输出:H1= ENCK*(Hq)

【注:密钥是K*】

2.4.3 输出变换方案3

输入:Hq(最后一个块的MAC)、K(密钥)、K*(另一个密钥)

输出:H1= ENCK (DECK*(Hq) )

【注:先用K*解密,然后用K加密】

2.5 六种算法

标准描述道:“算法4提供了一种改进的增加密钥长度的方法,强烈建议用户采用这个MAC算法4和填充方式3。”

六种算法的详细配置表如下。

表2.2基于分组密码的MAC算法的配置情况

MAC算法

(六种方案)

数据填充

(三种方案)

初始变换

(两种方案)

中间块处理

(一种方案)

输出变换

(三种方案)

算法1

任选

初始1

CBC-MAC

输出1

算法2

任选

初始1

CBC-MAC

输出2

算法3

任选

初始1

CBC-MAC

输出3

算法4

任选

初始2

CBC-MAC

输出2

算法5

任选

两个算法1的MAC结果异或

算法6

任选

两个算法4的MAC结果异或

2.5.1 算法1

输入密钥:K

诱导密钥:

执行步骤:

CBC-MAC,IV为全零。

2.5.2 算法2

输入密钥:K

诱导密钥:K**,一种生成方式K** = SKDF(K)(见2.5.7 一种密钥衍生算法

执行步骤:

先对所有块做CBC-MAC(密钥K),

然后再对结果加密(密钥K**)。

注意事项:KK**,否则存在异或伪造攻击

2.5.3 算法3

输入密钥:KK*KK*

诱导密钥:

执行步骤:

1. 先对所有块做CBC-MAC(密钥K),

2. 然后再对结果解密(密钥K*)后加密(密钥K)。

注意事项:KK*,否则算法3退化成算法1

2.5.4 算法4

输入密钥:KK*

诱导密钥:K**,一种生成方式为K**=SKDF(K*)(见章节2.5.7)。

执行步骤:

1. 先对第一个块做两次加密(先KK**),

2. 其结果作为IV和后续块(第二个块开始)做CBC-MAC(密钥K),    

3. 然后再对结果加密(密钥K*)。

注意事项:填充后的消息至少是两个块才可用。

2.5.5 算法5

输入密钥:K

诱导密钥:K1K2,由K生成。

                   生成方式可以是K1=KK2=SKDF(K)(见章节2.5.7)。

执行步骤: 1. 用密钥K1K2分别对数据各做一次CBC-MAC(即算法1);

                   2. 然后将MAC值异或。

注意事项:保证K1≠K2

2.5.6 算法6

输入密钥:KK*

诱导密钥:(K1, K1*)(K2, K2*)KK*生成。

                   生成方式可为(K1,K1*)=(K,K*)(K2,K2*)≠(SKDF(K), SKDF(K*))

执行步骤: 1.用密钥(K1, K1*)(K2, K2*)分别对数据各做一次算法4

                   2. 然后将MAC值异或。

注意事项: 1. 保证K1≠K1*K2≠K2*(K1, K1*)≠(K2, K2*)

                   2. 建议算法66个密钥各不相同(算法4实际使用3个密钥)。

2.5.7 一种密钥衍生算法

算法:简单密钥衍生算法SKDF(K)

输入:一个密钥K

输出:衍生的另一个密钥K*

步骤:从K的第一个4比特组开始,每隔4比特交替取补和不变生成K*。

2.6 测试向量

参见GB/T15852.1-2008的附录A。

这篇关于国密消息鉴别码学习笔记 ——含GB/T 15852和HMAC(第2章 基于分组密码的MAC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295262

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个