密钥协商(密钥交换)机制的讲解

  • 国标文件涉及密钥协商算法的函数

  • 生成密钥协商参数并输出
  • 计算会话密钥
  • 产生协商数据并且计算会话密钥

密钥协商(交换)算法及其原理

密钥交换/协商目的

  • “密钥协商机制”是:(在身份认证的前提下)规避【偷窥】的风险。通俗地说,即使有攻击者在偷窥客户端与服务器的网络传输,客户端(client)依然可以利用“密钥协商机制”与服务器端(server)协商出一个只有二者可知的用来对于应用层数据进行加密的密钥(也称“会话密钥”)。

密钥交换/协商机制的几种类型

1,依靠非对称加密算法

原理:

  • 拿到公钥的一方先生成随机的会话密钥,然后利用公钥加密它,再把加密结果发给对方,对方用私钥解密;于是双方都得到了会话密钥。

举例:

  • RSA、SM2

秘钥协商/交换步骤

  1. 客户端连上服务端
  2. 服务端发送 CA 证书给客户端
  3. 客户端验证该证书的可靠性
  4. 客户端从 CA 证书中取出公钥
  5. 客户端生成一个随机密钥 k,并用这个公钥加密得到 k’
  6. 客户端把 k’ 发送给服务端
  7. 服务端收到 k’ 后用自己的私钥解密得到 k,此时双方都得到了密钥 k,协商完成。

例子:

  • RSA的秘钥协商流程

  • SM2的秘钥协商流程
  • 参考链接:SM2密钥协商流程 - 百度文库

2,依靠专门的密钥交换算法

简介:

  • DH 算法又称“Diffie–Hellman 算法”,它可以做到“通讯双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥”, 即通讯双方事先不需要有共享的秘密。而且,使用该算法协商密码,即使协商过程中被别人全程偷窥(比如“网络嗅探”),偷窥者也无法知道最终协商得出的密钥结果。

缺点

  • 此算法不支持认证,虽然可以抵抗偷窥但是无法抵抗篡改,无法对抗中间人攻击。一般此算法会配合其余的签名算法搭配使用,比如RSA、DSA算法。

例子:

  1. Alice和Bob约定使用一个模 p = 23和g = 5
  2. Alice选择一个保密的整数 a = 4作为私钥,计算出公钥 A = g^a mod p,将公钥A发送给Bob;A = 5^4 mod 23 = 4
  3. Bob选在一个保密的整数 b = 3,计算出公钥 B = g^b mod p,将公钥B发送给Alice;
  4. B = 5^3 mod 23 = 10
  5. Alice 计算出共享密钥  s = B^a mod p   s = 10^4 mod 23 = 18
  6. Bob 计算共享密钥    s = A^b mod p   s = 4^3 mod 23 = 18
  7. Alice和Bob现在就共享一个密钥(s = 18)

优势

  1. 通信双方分别计算出来的 k 必定是一致的
  2. 通信双方都无法根据已知的数来推算出对方的私钥
  3. 对于一个旁观者(偷窥者),虽然能看到 p,g,A,B,但是无法推算出 a 和 b(旁观者无法推算出双方的私钥),自然也无法推算出 k

注意事项:

  1. p 必须是质数且足够大(至少300位)
  2. a,b 也要足够大(至少100位),且必须是随机生成。
  3. g 必须是质数,不需要很大,比如 2 或 3 或 5 都可以。g 如果太大并不能显著提升安全性,反而会影响性能。

步骤:

  1. 客户端连接上服务器;
  2. 服务器端生成一个随机数S作为自己的私钥,做模幂运算之后,得到公钥;
  3. 服务器,选择RSA,ECDSA,DSA的一种,对模幂运算的参数,以及公钥进行签名,并发送给客户端; 防止服务器被篡改
  4. 客户端验证签名是否有效; 客户端并不会对签名进行解密,DH的特性,双方只交换公钥,只做加密操作;
  5. 客户端也产生一个随机数C,加密之后,将公钥传给服务器;
  6. 客户和服务器,根据得到的公钥产生同一个会话密钥;

3,依靠通讯双方事先已经共享的“秘密”

简介:

  • 既然双方已经有共享的秘密(这个“秘密”可能已经是一个密钥,也可能只是某个密码/password),只需要根据某种生成算法,就可以让双方产生相同的密钥(并且密钥长度可以任意指定)
  • PSK 即“Pre-Shared Key”的缩写,就是预先让通信双方共享一些秘钥,这些秘钥通常是对称加密的秘钥,所谓的预先是指这些秘钥在双方尚未构建TSL协议之前,就已经部署在双方的系统之内了。

优势:

  • 不需要依赖公钥体系,不需要部属 CA 证书。不需要涉及非对称加密,TLS 协议握手(初始化)时的性能好于前述的 RSA 和 DH。

步骤:

  • 在通讯之前,通讯双方已经预先部署了若干个共享的密钥。为了标识多个密钥,给每一个密钥定义一个唯一的 ID。协商的过程很简单:客户端把自己选好的密钥的 ID 告诉服务端。如果服务端在自己的密钥池子中找到这个 ID,就用对应的密钥与客户端通讯,否则就报错并中断连接。

参考链接:

  • 密钥交换(密钥协商)算法及其原理 - Yungyu - 博客园
  • Diffie–Hellman key exchange DH密钥协商_詹天佐的博客-CSDN博客
  • 密钥协商机制 - 简书
  • Diffie-Hellman密钥协商算法 - Qcer - 博客园
  • https://wenku.baidu.com/view/a953fa07de80d4d8d15a4f0d.html#
  • HTTPS 温故知新(三) —— 直观感受 TLS 握手流程(上)
  • Diffie-Hellman密钥协商算法 - Qcer - 博客园

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

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

相关文章

基于ECC算法的秘钥协商

基于ECC算法的衍生算法 ECDH(ECCDH)RSAECDHE(ECCDHE) ECDH密钥协商(ECCDH) 椭圆曲线密码学是属于非对称密码学的,其私钥的计算公式如下: 私钥是一个随机数d,取值范围在1……n-1,其中n是子群的阶公钥是点HdG&#xff…

C++11 多线程相关知识的学习

C多线程类Thread(C11) C11中std命名空间将Boost库中的Thread加入,Boost的多线程从准标准变为标准,这里将其用法整理复习,以demo的形式复习,还是喜欢看我自己写的东西,符合我的个人逻辑头文件为…

vscode vim 插件自定义配置

{"workbench.colorTheme": "Material Theme","files.defaultLanguage": "markdown", //新建文档格式为markdown格式"vim.easymotion": true,"vim.leader": " ", // leader键"vim.useSystemClipbo…

C++11 explicit关键字的作用

explicit 在C中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。因为无参构造函数和多参构造函数本身就是显示调用的。再加上explicit关键字也没有什么意义…

c++ 指针的强制类型转换

#include <iostream> using namespace std; class A { public:int i;int j;A(int n):i(n),j(n) { } }; int F2 (int,char *){return 1; }; int F1 (int){return 2; }; int main() {A a(100);int &r reinterpret_cast<int&>(a); //强行让 r 引用 ar 200; …

C++11学习 virtual(虚函数)的用法

Virtual虚函数 在面向对象的C语言中&#xff0c;虚函数&#xff08;virtual function&#xff09;是一个非常重要的概念。因为它充分体现了面向对象思想中的继承和多态性这两大特性&#xff0c;在C语言里应用极广。多态性&#xff1a;其含义就是多种形式&#xff1b;将具有继承…

c++ const

函数名称不单单是函数名 const 补充内容 还有 const 参数类型 函数后头const 只能在成员函数如果const对象 但是我没通过const成员函数 就会报错

C++11学习 新特性之 “=default” 、“=delete”

文章目录 1、 default 和delete 概述2、 类与默认函数3、 使用“delete”来限制函数生成4、 “default”使用范围 1、 default 和delete 概述 default、delete 是C11的新特性&#xff0c;分别为&#xff1a;显式缺省(告知编译器生成函数默认的缺省版本)和显式删除(告知编译器…

C++学习 优雅的实现对象到文件的序列化/反序列化 关键字serialize

需要使用到序列化场景的需求 在写代码的过程中&#xff0c;经常会需要把代码层面的对象数据保存到文件&#xff0c;而这些数据会以各种格式存储&#xff0e;例如&#xff1a;json&#xff0c;xml&#xff0c;二进制等等&#xff0e;二进制&#xff0c;相比json&#xff0c;xml…

C++代码注释详解

常用注释语法 注释写在对应的函数或变量前面。JavaDoc类型的多行注释风格如下&#xff1a; /** * 这里为注释. */ 一般注释中有简要注释和详细注释&#xff0c;简要注释有多种标识方式&#xff0c;这里推荐使用brief命令强制说明&#xff0c;例如&#xff1a;/** * brief 这里…

段错误:SIGSEGV

SIGSEGV是在访问内存时发生的错误&#xff0c;它属于内存管理的范畴 SIGSEGV是一个用户态的概念&#xff0c;是操作系统在用户态程序错误访问内存时所做出的处理。 当用户态程序访问&#xff08;访问表示读、写或执行&#xff09;不允许访问的内存时&#xff0c;产生SIGSEGV。 …

web3 0.2.x 和 1.x.x版本之间的差异

版本差异 单位转换 0.2.x web3.fromWei(13144321,ether) 1.x.x web3.utils.fromWei(13144321,ether)1.0以后的版本使用了大量的Promise&#xff0c;可以结合async/await使用&#xff0c;而0.20版本只支持回调函数

如何提高阅读源码的能力并且手撕源码

怎么有效的手撕代码呢&#xff1f; 把代码跑起来把代码一个片段拿出来使用画出代码运行的流程图一行一行的搬运在看源码的情况下写出类似的demo

并发和并行的区别简单介绍

并发和并行 并发是关于正确有效地控制对共享资源的访问 同时完成多个任务。在开始处理其他任务之前&#xff0c;当前任务不需要完成。并发解决了阻塞发生的问题。当任务无法进一步执行&#xff0c;直到外部环境发生变化时才会继续执行。最常见的例子是I/O&#xff0c;其中任务…

手撕源码 alloc

怎么有效的手撕代码呢&#xff1f; gnu gcc 2.9 的 内存池 把代码跑起来把代码一个片段拿出来使用画出代码运行的流程图一行一行的搬运在看源码的情况下写出类似的demo 第三步&#xff1a; 第五步: // 这个头文件包含一个模板类 allocator&#xff0c;用于管理内存的分配、…

Algorand的共识协议及其核心的优势

Algorand 设计的初衷 Algorand 想解决的核心问题是&#xff1a;去中心化网络中低延时&#xff08;Latency&#xff09;和高置信度&#xff08;Confidence&#xff09;之间的矛盾。其中&#xff0c;延时指从发起交易到确认交易所需要的时间&#xff1b;置信度指的是发出的交易不…

手撕源码 SQL解析器 sqlparser

怎么有效的手撕代码呢&#xff1f; 源代码&#xff1a;https://github.com/hyrise/sql-parser 把代码跑起来把代码一个片段拿出来使用画出代码运行的流程图一行一行的搬运在看源码的情况下写出类似的demo

针对Algorand所使用的密码相关技术细节进行介绍

关键概念 VRF: 可验证随机函数。简单来说是&#xff1a;vrf,Proof VRF(sk,seed)&#xff0c;sk为私钥&#xff0c;seed为随机种子&#xff1b;通过Verify(proof,pk,seed)验证vrf的合法性。cryptographic sorition: 根据用户本轮的VRF值&#xff0c;自身的权重以及公开的区块链…

内存池的实现1 :重载

#ifndef KSTD_ALLOCATOR_H_ #define KSTD_ALLOCATOR_H_// 这个头文件包含一个模板类 allocator&#xff0c;用于管理内存的分配、释放&#xff0c;对象的构造、析构 // 暂不支持标准库容器 todo::支持萃取#include <new> // placement new #include <cstddef>…