国密消息鉴别码学习笔记 

——含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

诱导密钥:K1和K2,由K生成。

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

执行步骤: 1. 用密钥K1和K2分别对数据各做一次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. 建议算法6的6个密钥各不相同(算法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)相关推荐

  1. RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?

    RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 文章目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目 ...

  2. 二维码学习笔记(二) | 数据分析与数据编码

    唠唠闲话 二维码笔记系列(原文地址): 『二维码学习笔记(一) | 二维码概述』 『二维码学习笔记(二) | 数据分析与数据编码』 『二维码学习笔记(三) | 纠错编码』 『二维码学习笔记(四) | ...

  3. Java多线程之JUC包:Semaphore源码学习笔记

    若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/go2sea/p/5625536.html Semaphore是JUC ...

  4. 密码学归约证明——基于伪随机函数的消息鉴别码方案

    1. 消息鉴别码实验 运行得到密钥,即. 敌手获得输入,且能够访问预言机,最终输出,其中为消息的鉴别码.设为敌手访问预言机的问询集合. 当且仅当且,实验输出1.其中是鉴别码方案的验证方法. 如果一个消 ...

  5. Vuex 4源码学习笔记 - 通过Vuex源码学习E2E测试(十一)

    在上一篇笔记中:Vuex 4源码学习笔记 - 做好changelog更新日志很重要(十) 我们学到了通过conventional-changelog来生成项目的Changelog更新日志,通过更新日志 ...

  6. 《Python编程从入门到实践》袁国忠 译 P1~P200学习笔记

    <Python编程从入门到实践>袁国忠 译 P1~P200 学习笔记 <Python编程从入门到实践>袁国忠 译 P1~P200之前两天在学习时做的笔记总结,在这里也记录一下, ...

  7. Vuex 4源码学习笔记 - Vuex是怎么与Vue结合?(三)

    在上一篇笔记中:Vuex源码学习笔记 - Vuex开发运行流程(二) 我们通过运行npm run dev命令来启动webpack,来开发Vuex,并在Vuex的createStore函数中添加了第一个 ...

  8. jquery源码学习笔记三:jQuery工厂剖析

    jquery源码学习笔记二:jQuery工厂 jquery源码学习笔记一:总体结构 上两篇说过,query的核心是一个jQuery工厂.其代码如下 function( window, noGlobal ...

  9. 雷神FFMpeg源码学习笔记

    雷神FFMpeg源码学习笔记 文章目录 雷神FFMpeg源码学习笔记 读取编码并依据编码初始化内容结构 每一帧的视频解码处理 读取编码并依据编码初始化内容结构 在开始编解码视频的时候首先第一步需要注册 ...

最新文章

  1. 《Doing It - Management 3.0 Experiences》作者访谈
  2. idea不自动检查语法_idea自动检查失效-目录中类名下的红色波浪线没有自动消除问题...
  3. idea中git打tag(亲测)
  4. 为什么objc_msgSend必须用汇编实现
  5. ReportViewer教程(1)-新建工程,添加Form和报表浏览器
  6. anaconda中自带的qtdesigner做界面
  7. python 结构体嵌套_Python 3不更新嵌套包中的变量(使用“递归”相对导入)
  8. 牛皮啊!竟然可以为Dubbo接口生成文档了!
  9. ./configure 出错Your intltool is too old. You need intltool 0.35
  10. vscode自动整理代码_再见了, VS Code!
  11. 脑洞大开!华为云桌面和无纸化会议系统结合会怎样?
  12. hexo yilia 文章浏览量统计
  13. Java API在HDFS上实现文件的上传、下载到本地、创建文件夹、删除文件和重命名文件
  14. 数据可视化ECharts:饼形图2 地区分布模块制作(南丁格尔玫瑰图)
  15. 显著性检测——GR模型
  16. 关于医疗AI产品的商业模式的思考
  17. 前端性能自动化执行机服务开发
  18. 移动硬盘插入无显示,不用格式化-修复方法
  19. jav 通过HttpClient实现调用外部接口两种请求方式(get/post)
  20. 上海交通大学2021计算机录取,2021年上海交通大学高考录取结果什么时候出来及查询系统入口...

热门文章

  1. DNF体验服辅助/稳定/脚本/搬砖/
  2. 苏州新导RFID仓库管理系统解决方案,黄河水电与新能源的仓库管理
  3. freeswitch延迟呼叫
  4. Python——Crypto库实现公钥加密私钥解密
  5. 深度盘点:PyTorch常用代码段合集
  6. BZOJ1084洛谷P2331 [SCOI2005]最大子矩阵
  7. Wi-Fi 电源管理
  8. ffmpeg命令分析-segment
  9. 关于Java中数据报套接字DatagramSocket中connet()方法说明
  10. kodi android 卡顿,分享n1 kodi 播放局域视频卡顿的案例 - 数字家庭 - DigiHome - 水木社区...