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

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

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

密钥交换/协商目的

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

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

1,依靠非对称加密算法

原理:

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

举例:

  • RSA、SM2

秘钥协商/交换步骤:

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

例子:

  • RSA的秘钥协商流程

协商密钥 java 密钥协商的主要作用_服务器

协商密钥 java 密钥协商的主要作用_密码学_02

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

简介:

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

缺点:

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

协商密钥 java 密钥协商的主要作用_密码学_03

协商密钥 java 密钥协商的主要作用_客户端_04

例子:

  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,就用对应的密钥与客户端通讯,否则就报错并中断连接。

参考链接: