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

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

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

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

密钥交换/协商目的

  • “密钥协商机制”是:(在身份认证的前提下)规避【偷窥】的风险。通俗地说,即使有攻击者在偷窥客户端与服务器的网络传输,客户端(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的形式复习,还是喜欢看我自己写的东西,符合我的个人逻辑头文件为…

C++11 explicit关键字的作用

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

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

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

c++ const

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

手撕源码 alloc

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

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

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

对于Algorand的介绍

介绍 Algorand具有能耗低、效率高、民主化、分叉概率极低、可拓展性好等优点,旨在解决现有区块链项目存在的“不可能三角”(高度可扩展的、安全的、去中心化)问题。Algorand由MIT教授、图灵奖得主Silvio Micali发起,拥有MIT区块链…

C++学习 高级编程

C 文件和流 到目前为止,目前使用最为广泛的是 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。以下将介绍从文件读取流和向文件写入流。这就需要用到 C 中另一个标准库 fstream,它定义了三个新的数…

内存池中的嵌入式指针

嵌入式指针 可以union改struct 内存分配后 next指针就没用了 直接作为数据空间比较省内存 因为对指针指向的内存存储的时候 编译器是不管你是什么类型的 &#xff0c;这里有道练习题可以对指针的概念稍微理解一下&#xff1a; #include <iostream> using std::cout; us…

内存池的实现4 alloc内存池

alloc 内存池 优点: &#xff1a;本质是定长内存池的改进&#xff0c;分配和释放的效率高。可以解决一定长度内存分配的问题。 缺点 &#xff1a;存在内碎片的问题&#xff0c;且将一块大内存切小以后&#xff0c;申请大内存无法使用&#xff0c;别的FreeList挂了很多空闲的内存…

c语音的一些特殊关键字

PRETTY_FUNCTION C语言中获取函数名 C语言中的__LINE__用以指示本行语句在源文件中的位置信息

vim 不常见但好用的命令

● 跳跃 ○ 向前跳跃是 f ○ 向后跳跃是 F ● 继续 ○ 保持方向是 ; ○ 改变方向是 , ● 可以加上 [count] 来加速 ● ^ 是到本行第一个非空字符 ● 0 是到本行第一个字符&#xff0c;不管是不是空格 ● g_ 是到本行最后一个非空字符 ● 两个按键要依次按下 ● $ 跳到本行最后…

加密机组会 会议纪要

2020年9月28日 1&#xff0c;使用基类继承的机制&#xff0c;调用写好的函数接口 1&#xff0c;不要 使用Content&#xff08;封装数据&#xff0c;本质是一个json字符串&#xff09;&#xff0c;1&#xff0c;因为每次使用这个需要对里面的内容进行序列化&#xff0c;转化成…

演示IPFS的一个完整的流程以及针对部分概念的详解

整体的流程 1&#xff0c;创建ipfs节点 通过ipfs init在本地计算机建立一个IPFS节点本文有些命令已经执行过了&#xff0c;就没有重新初始化。部分图片拷贝自先前文档&#xff0c;具体信息应以实物为准 $ ipfs init initializing IPFS node at /Users/CHY/.ipfs generating 2…

TDengine安装教程

TDengine安装教程 前言 TDengine的安装十分简单&#xff0c;可以有以下三种安装方式&#xff0c;源码安装、通过Docker容器进行安装、通过安装包进行安装。但是使用源码安装较为复杂&#xff0c;通过docker的方式最为简单&#xff0c;但是需要一定docker相关的知识&#xff0…

android 软件首次运行时引导页左右滑动效果

很多手机软件在安装后首次运行都会进入到引导页面&#xff0c;再次运行时会进入到主页面。 多了不说了&#xff0c;先看效果图&#xff1a; 代码如下&#xff1a; main.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:an…

dex分包之--------multidex包的配置使用

目录&#xff1a;一、前言二、产生原因三、MultiDex的简要原理四、MultiDex的使用 一、前言 首先说一下我遇到的情况&#xff0c;最近接手了一个项目是在已有的项目里进行更新添加一些功能&#xff0c;然后该项目导了N多的包&#xff0c;在我使用Android Studio的run”App”直…

Android Studio打包和引用aar

一、简介 Android 库在结构上与 Android 应用模块相同。它可以提供构建应用所需的一切内容&#xff0c;包括源代码、资源文件和 Android 清单。不过&#xff0c;Android 库将编译到您可以用作 Android 应用模块依赖项的 Android 归档 (AAR) 文件&#xff0c;而不是在设备上运行…