国密(3)- 预主密钥/主密钥计算和Finished消息的加解密

article/2025/11/8 8:44:00

本文给的例子是ECC-SM3-SM4-CBC;

GBT-38636-2020(传输层密码协议TLCP) 定义了pre-master key 和 master key;

Pre- master Key 48字节长度,version 2字节,随机数46字节,由客户端产生。采用SM2加密后的密文放在client key exchange 里发送;

 pre-master key:
0101  版本号

E582AAC5064CF164DCAC7A14BFEC7BF30AF646558DC7DC63CBC77265EDE6E7721D2161FA098EF3EC41FECBFEF107    46字节随机数

Master key 计算公式:

下面是标准的master key的计算方法;

如果客户端和服务端在hello消息都携带了extended_master_secret扩展项的话,将会采用扩展方法进行master key的计算,这个方法在RFC7627里定义。不在本国密规范定义;

  master_secret = PRF(pre_master_secret, "extended master secret", session_hash)[0..47];

A0 = seed = 6d617374657220736563726574B20653C9B35996333D8079CF401FE28791704502700584C4C6A0F04894597DE1D76E6BC156B1BA2A5CEA6C251B6C2038E00CBD8194132BC33452E22E0F324F2D
A1 = 45 AC 10 55 74 46 2C 6A 68 41 6C 93 22 94 F2 8F 88 C7 1C 76 EC 22 E9 09 29 D3 D1 ED 3A B3 41 2A 
A2 = FE 2A 0D B1 BD 8B F7 12 D4 54 B4 5E 6E 54 29 59 10 52 1B 20 0C E8 33 30 E0 68 61 20 78 50 1E 20 

HMAC(A1+Seed) = E6 4A 62 8E CE E2 F1 F1 E2 A3 E1 AD FB A7 E4 AE E7 35 81 77 21 25 94 F2 72 F9 75 92 B7 09 F0 DB 
HMAC(A2+Seed) = 65 99 5D 25 B1 16 FA E2 96 89 0B A1 A8 4F 6B FB 79 80 81 0D 0F 47 4F 42 56 7B 83 8F 00 E8 4E 73

取HMAC(A1+Seed) + HMAC(A2+Seed) 的前48字节,产生

master key = E6 4A 62 8E CE E2 F1 F1 E2 A3 E1 AD FB A7 E4 AE E7 35 81 77 21 25 94 F2 72 F9 75 92 B7 09 F0 DB  65 99 5D 25 B1 16 FA E2 96 89 0B A1 A8 4F 6B FB 79 80 81 0D 0F 47 4F 42 56 7B 83 8F 00 E8 4E 73 

工作密钥:最终用于加密和生成校验码的密码是通过对master key再推导出来的。 

本规范还定义了PRF函数:

Master key :E64A628ECEE2F1F1E2A3E1ADFBA7E4AEE7358177212594F272F97592B709F0DB65995D25B116FAE296890BA1A84F6BFB

A0=seed = 6b657920657870616e73696f6eD76E6BC156B1BA2A5CEA6C251B6C2038E00CBD8194132BC33452E22E0F324F2DB20653C9B35996333D8079CF401FE28791704502700584C4C6A0F04894597DE1

A1 = 0B 52 D1 CF 1A BF 3B 6F C6 5C 80 8B E1 7C 22 93 B5 CE A4 18 C2 DC 14 8B 1C 3B 02 6C 09 98 19 51 

A2 = 22 7C 0A D1 C5 0E F6 4A 33 35 24 0F 07 D5 8D 7B 4F 03 F9 54 AA 80 A0 38 EA 07 0C 2A EC 0A 11 25 

A3 = 0D E2 4D AC 1A A1 8F 45 9E 90 67 33 D5 A1 83 53 FD C0 BA 28 F6 70 3C 1A 49 DA 94 1C AA 61 0F 94 

client_write_MAC_secret(32字节):
HMAC(A1+Seed) = B1 8D 1B 2B 67 7E A3 AB 5C 08 1B 6B F2 81 05 9E C3 25 E9 ED 2A FA 64 A9 C9 BE 87 F0 92 5F A6 0E 
server_write_MAC_secret(32字节)
HMAC(A2+Seed) = E4 50 F3 DC 28 68 B9 63 DA B2 01 03 C4 05 93 45 F8 F8 A9 E7 B0 11 8F EE 48 A9 33 BC 88 36 64 EB 

HMAC(A3+Seed) =
client_write_key  (16字节)
E5 F8 54 2F 7B 23 01 C6 A3 BF 39 DA D8 15 E9 C8
server_write_key (16字节)
0F 31 84 20 AD 79 5B BE 66 DA 75 03 95 C8 1C 48 

Finshed 消息(即 encrpted handshake message):

Finished 消息加密后长度80字节(16字节IV+ciphered(16字节finished消息明文+32字节MAC+16字节的padding)),在wireshark里面显示为Encrypted handshake message,解密后可以显示为Finished消息

IV(16字节)
52f5403d3ea71482c81986ae42433c2e

Ciphered text(64字节)
2e89c8572989dada0e6840ce6b248c91
a703b727082505a40fadffb0c4972f73e64c585187df39ad084b26d2319aed0c
cbcd5cd877bd3a863956aa2824e85f14

 

SM4 CBC depher后:
client Finshed(16字节)
14 00 00 0C DE 57 BF 29 1C E3 3A EC 83 13 9E 58 

其中14 类型

    00 00 0C长度

DE 57 BF 29 1C E3 3A EC 83 13 9E 58  对以往handshake消息的hash值,从client hello消息开始,到change cipher spec消息结束(不包括change cipher spec,finished消息,hellorequest(注意不是client hello和server hello))

消息包括消息类型和长度以及内容,如下图蓝色所示。

通过下面式子计算后,取前12个字节

 PRF(master_secret, finished_label, SM3 (handshake_messages)) [0.11].

 

 

MAC code(32字节)
76 0E 49 8C 1E 9B C9 97 FA BB BC 4A 4B 55 9B 52 80 83 EC E8 C6 CC D5 F4 15 D7 6B 99 79 93 BF 25 
HMAC_hash(MAC_write_secret,seq_num+TLSCompresed.type+TLSCompresed.version+
TLSCompresedl.ength+TLSCompresed.fragment)
MAC_write_secret = B1 8D 1B 2B 67 7E A3 AB 5C 08 1B 6B F2 81 05 9E C3 25 E9 ED 2A FA 64 A9 C9 BE 87 F0 92 5F A6 0E

seq_num+TLSCompresed.type+TLSCompresed.version+
TLSCompresedl.ength+TLSCompresed.fragmen
00 00 00 00 00 00 00 00 seq 8字节
16       1字节type
01 01  2字节version
00 10  2字节长度值
14 00 00 0C DE 57 BF 29 1C E3 3A EC 83 13 9E 58 (16字节的finished消息)

HMAC_hash的hash算法是SM3

​​​​​​​

 

pading len + Pading content(共16字节padding)
0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 


http://chatgpt.dhexx.cn/article/7afQbWhT.shtml

相关文章

BitLocker 秘钥如何获取

在装双系统的过程中,遇到一个问题,就是在双系统安装之后,每次切换到windows(我的win11)的时候,就会出现以下界面,让输入BitLocker秘钥。 首先,我切换到安全模式打开了windows系统&am…

git 配置ssh 秘钥

git支持http和ssh两种Clone方式; PS:Clone即下载源码 如何配置git的ssh key,以便我们可以通过git方式下载源码。 需要经过以下几个步骤 1.配置账户和邮箱: 通过以下命令,查看是否配置账户和邮箱: git …

密钥管理概述

目录 层次化的密钥结构: 密钥的分类: 密钥托管技术: 系统的组成: 密钥协商: 密钥共享: 密钥分配技术: 现代密码体加密和解密算法是可以公开评估的,整个密码系统的安全性并不取决…

公钥和密钥

一、公钥与私钥 在非对称加密中,我们会用到两个密钥,一个是公钥,另一个是私钥。 公钥是给别人的,别人持有的;而私钥是你自己的,只能你持有,别人是不可以持有的。 二、签名验证算法和加密算法 …

如何获取SSH秘钥

从github拉取/上传代码,需要在github添加电脑SSH公钥,如何获取电脑SSH公钥: 1.一般SSH秘钥在目录~/.ssh。没有安装git并生成秘钥是没有这个目录的。 2.安装git,我使用的是git bash软件,git bash官网下载:h…

SSH公钥原理(密钥,秘钥,私钥)(看了还是懵逼啊!)

文章目录 1. 初见SSH2. SSH工作原理1. 基于口令的认证2.基于公钥认证3. SSH实践4 总结3. 为什么需要known_hosts? 1. 初见SSH SSH是一种协议标准,其目的是实现安全远程登录以及其它安全网络服务。 SSH仅仅是一协议标准,其具体的实现有很多&a…

秘钥是什么

密钥(secret key)是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥。 注:秘钥是一把钥匙。密码算法是锁的内部构造。加密是通过钥匙上锁的过程,解码是通过钥匙开…

JavaScript基础(详细总结)

目录 1、JavaScript简介 1.2、JavaScript的发展史 1.3、JavaScript的功能 1.4、JavaScript的特点 1.5、JavaScript组成 2、JavaScript基础语法 2.1、HTML引入JS 2.1.1、内部引入 2.1.2、外部引入 2.2、JS输出数据的三种方式 2.2.1、浏览器弹窗 2.2.2、输出HTML页面…

JavaScript学习手册(12)

对象(Object)--------- 基本数据类型的数据都是独立的,不能成为一个整体。 Object属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性。 对象分类 **内建对象:**由ES标准中定义的对象,在任…

前端之JavaScript

目录 一.初始JavaScript 1.什么是JavaScript 2.JS和HTML以及CSS的关系 3.JS的组成 二.第一份JS代码 几种JS的书写形式 JS的输入输出 三.JS的核心语法 1.变量(几种类型) 1.1 number数字类型 1.2 boolean类型 1.3 string字符串类型 1.4 undefined:未定义的数据类型 1.…

JavaScript基础介绍

一.javaScript是什么 JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。 二.javaScript的作用 1.嵌入动态文本于HTML页面。 2.对浏览器事件做出响应。 3.读写HTML元素。 4.在数据被提交到服务器之前验…

【JavaScript】基本语法大全

前言: 大家好,我是程序猿爱打拳。在学习C和Java这样的后端编程语言后,我们大概率会学习一些关于前端的语言如HTMLJavaScript。又因为前后端基本语法有些许不同,因此我整理出来。今天给大家讲解的是JS中的数据类型、运算符、选择结…

【JavaScript】JavaScript基础篇

目录 🍊一. 初识JavaScript 🍈二. JavaScript的书写格式 🥭三. JavaScript的基础语法 🌴1. 变量的用法 🌾2. 基本数据类型 🌵3. 运算符 🌴4. 条件语句 🌾5. 循环语句 &am…

前端基础语言HTML、CSS 和 JavaScript 学习指南

对于任何有兴趣学习前端 Web 开发的人来说,了解 HTML、CSS 和JavaScript 之间的区别至关重要。这三种前端语言都是您访问过的每个网站的用户界面构建块。而且,虽然每种语言都有不同的功能重点,但它们都可以共同创建令人兴奋的交互式网站&…

JavaScript基础入门

一,什么是JavaScript 1,与Java无关!与Java无关!与Java无关! JavaScript是一种为网站添加互动以及自定义行为的客户端脚本语言, 通常只能通过Web浏览器去完成操作, 而无法像普通意义上的程序那样…

javascript小白学习指南2

好啦 好啦 ,美女看够了,我们开始继续上一次讲的内容把(上一节的内容) 控制语句: 首先我先给大家总结一下在javascript中一共有 9 种控制语句它们分别是 if 语句do-while 语句while 语句for 语句for-in 语句label 语句b…

JavaScript学习手册(10)

流程控制语句 条件判断语句(if语句) 在执行某个语句之前进行判断,条件成立才会执行语句,条件不成立则语句不成立 ​ 语法一:if(条件表达式) ​ 语句 ​ **语法二:**if(条…

十本经典JavaScript书籍

十本经典JavaScript书籍 同步滚动: 一:《JavaScript权威指南(第六版)》 这本书是程序员学习核心JavaScript语言和由Web浏览器定义的JavaScript API的指南和综合参考手册。第6版涵盖HTML 5和ECMAScript 5。很多章节完全重写&…

JavaScript学习笔记

JavaScript学习笔记 1.JavaScript的输入输出 输出 js自上往下执行 <!-- js代码需要编写到script标签中 --><script>// 控制浏览器弹出一个警告框alert("hello world");// 让计算机在页面中输出一个内容//可以在body中写入一个内容document.write(…

JavaScript 的学习

文章目录 一、简介总结 一、简介 JavaScript 是互联网上最流行的脚本语言&#xff0c;这门语言可用于 HTML 和 web&#xff0c;更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。 JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言。 JavaScript 是可插…