国密调研文档

基本概念

1.0 什么是密钥

  密钥就是一个字符串或数字,在加密和解密过程中传递给加密和解密算法。

1.1 公钥密码体制及加解密过程

  公钥密码体制分为三个部分:公钥私钥加/解密算法。公钥和加密/解密算法公开,私钥保密。

  加密:通过加密算法和公钥对明文进行加密,得到密文。

  解密:通过解密算法和私钥对密文进行解密,得到明文。(由公钥加密的内容,只能由私钥进行解密

1.2 对称加密算法

  加密过程中使用的密钥和解密过程中使用的密钥是相同的。即加密和解密使用同一个密钥。(不同于公钥密码体制,不区分公钥和私钥)

1.3 非对称加密算法

  加密使用的密钥,和解密使用的密钥不同。公钥密码体制就是一种非对称加密算法。

1.4 RSA算法

  RSA属于公钥密码体制。可以采用公钥加密、私钥解密;也可采用私钥加密、公钥解密。

1.5 签名

  What:在信息的后面加上一段内容,证明信息没有被修改过

  How:对信息进行哈希计算,得到一个哈希值(单向运算,即不能通过哈希值反推出信息内容),将哈希值进行加密,即签名。信息发送时将签名一并发送,接收方接收信息后,将签名解密得到哈希值,并会重新计算接收到信息的哈希值,对比两个哈希值即可判断出信息是否有修改。(不同的信息内容会计算得到不同的哈希值)

1.6 数字证书

  为了保证客户收到的公钥,的确是服务器的公钥,而不是第三方伪造的公钥!数字证书可以保证数字证书里的公钥是证书所有者(Subject)的。即如果拿到一个数字证书,即可判断该证书到底是不是那个服务器的。所以服务器可以向客户发送自己的数字证书(不仅仅包含了公钥)。

  数字证书包含了以下内容:

  (1)证书的发布机构:该证书是哪个公司/机构创建的

  (2)证书的有效期

  (3)公钥

  (4)证书所有者(Subject):这个证书是发布给谁的,一般是某个人或某个公司/机构的名称,或者某公司网站地址

  (5)证书签名算法:该数字证书签名时所使用的加密算法(将信息计算出的哈希值进行加密时用到的算法),利用证书中的公钥,根据签名算法对指纹进行解密

  (6)指纹以及指纹算法:保证证书完整性,确保证书没有被改动过。发布者根据指纹算法(一种哈希算法)计算整个证书的哈希值(指纹),并和证书放在一起。使用者在打开证书时,也  根据指纹算法计算一下证书的哈希值(指纹),如果一致,则表示证书安全。注:该指纹会使用证书发布机构的私钥,用签名算法加密后和证书放在一起

申请证书

  (1)购买证书。找,证书发布机构,一个公认并被权威机构认可,且操作系统里已安装了该机构的证书。

  (2)该机构发布证书时,将公钥、有效期等信息以明文形式写到证书里

  (3)该机构使用指纹算法,计算出该证书的指纹,并使用自己的私钥,将指纹以及指纹算法进行加密,伴随证书内容一起发布

  (4)最后,该机构向申请者提供一个私钥。

使用证书

  (1)对方先检查证书发布机构是否受信任,并在操作系统中检查,该机构是否是受信任的发布机构。(要检查一下麒麟OS是否信任该发布机构)

  (2)若受信任,则对方拥有该证书发布机构的证书的公钥,对申请者的证书的指纹及指纹算法进行解密

  (3)利用解密出来的指纹算法,计算本证书的指纹,将两指纹进行对比,用于检查该证书有没有被修改过

  (4)如果都没问题,对方便可放心的使用证书中的公钥,和我们进行安全通信了。

初识国密

  SM:代表商业密码,用于商用的、不涉及国家秘密的密码技术。

  SM2:基于椭圆曲线密码的公钥密码算法,包含数字签名、密钥交换和公钥加密,用于替换RSA/DH/ECDSA/ECDH等国际算法

  SM3:密码哈希算法(用于数据校验),用于代替SHA-1/SHA-256国际算法

  SM4:分组密码,用于替代DES/AES等国际算法

  SM9:基于身份的密码算法,可以替代数字证书的PKI/CA体系

如何保证对称密钥的安全?

  可以采用动态密钥(也叫会话密钥):(1)会话密钥的作用就是为了加解密通信数据(2)在加解密通信数据之前,客户端和服务端协商出会话密钥,该会话密钥只有服务端和特定的客户端才能知晓(3)会话密钥无需存储,一旦双方的连接被关闭,会话密钥将会消失,其安全性就得以保障。

  会话密钥可通过密钥协商算法完成,目前采用的主要的密钥协商算法为:(1)RSA密钥协商算法(2)DH密钥协商算法

客户端与服务端通信,存在的隐患及解决方案

(1)明文传输 —— 数据加密传输:需要一个只有客户端和服务端知道的密钥(密钥协商)

(2)数据篡改 —— 数据完整性校验:对数据进行哈希计算并签名(客户端和服务端采用同一种数据检验算法)

(3)站点劫持 —— 验证站点身份:双方互相验证对方证书可信,或客户端验证服务端证书可信(CA证书)

SSL/TLS协议

    SSL 1.0 1994年由NetScape公司设计

    SSL 2.0 1994年发布

    SSL 3.0 1996年发布,并得到大规模应用。应用次广泛

    TLS 1.0 协议号0x0301,1999年,互联网标准化组织接替NetScape公司,发布SSL的升级版。应用最广泛,通常被标识为 SSL 3.1

    TLS 1.1 协议号0x0302,2006年发布,被标识为 SSL 3.2

    TLS 1.2 协议号0x0303,2008年发布,主流浏览器已支持,被标识为 SSL 3.3

    TLS 1.2 修订版 2011年发布,

    记录层协议:(发送时)数据分块、压缩、计算校验码、加密传输;(接收时)解密、校验码验证、解压缩、封装

    握手协议:客户端和服务端进行身份验证,以及协商出供记录层使用的安全参数

SM4分组密码算法 GM/T 0002-2012

1.术语和定义

  分组长度block length:一个信息分组的比特位数

  密钥长度:密钥的比特位数

  密钥扩展算法key expansion algorithm:将密钥交换为轮密钥的运算单元

  轮数rounds:轮函数的迭代次数

  字word:长度为32比特的组(串)

  S盒 S-box:S盒为固定的8比特输入 8比特输出的置换,记为Sbox(.)

2.算法结构

  SM4密码算法是一个分组算法,该算法的分组长度为128比特,密钥长度为128比特。加密算法与密钥扩展算法都采用32轮非线性迭代结构。数据解密和数据加密的算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。

3.密钥及密钥参量

  加密密钥长度为128比特,表示为MK-(MK0, MK1, MK2, MK3),其中MKi(i=0,1,2,3)为字。

  轮密钥表示为(rk0,rk1,...rk31),其中rki(i=0,1,2...31)为32比特字。轮密钥由加密密钥生成。

  FK-(FK0, FK1, FK2, FK3)为系统参数,CK-(CK0,CK1,..., CK31)为固定参数,用于密钥扩展算法,其中FKi,CKi为字

4.轮函数F

4.1轮函数结构

  设输入为(X0,X1,X2,X3),轮密钥为rk,则轮函数F为:F(X0,X1,X2,X3,rk)=X0※T(X1※X2※X3※rk),※为32位异或,T为置换

4.2合成置换T

  T是一个可逆变换,由非线性变换 t(tao) 和线性变换L复合而成, 即T(.) = L(t(.))

  非线性变换t:由4个并行的S盒构成。设输入为A=(a0,a1,a2,a3),输出为B=(b0,b1,b2,b3),

    则B=(b0,b1,b2,b3=t(A)=(Sbox(a0),Sbox(a1),Sbox(a2),Sbox(a3))。Sbox数据如下:

    

  线性变换L,设输入为B,输出为C,则:※为32位异或,<<<i 为32位循环左移 i 位

  C=L(B)=B※(B<<<2)※(B<<<10)※(B<<<18)※(B<<<24)

5.算法描述

5.1加密算法

  加密算法由32次迭代运算和1次反序变换R组成。设明文输入为(X0,X1,X2,X3),密文输出为(Y0,Y1,Y2,Y3),轮密钥为rk,加密算法的运算过程如下:

  (1)32次迭代运算:Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki),i=0,1,...,31;

  (2)反序变换:(Y0,Y1,Y2,Y3=R(X32,X33,X34,X35)=X35,X34,X33,X32

5.2解密算法

  解密变换与加密变换结构相同,不同的是轮密钥的使用顺序,解密时,使用轮密钥序(rk31,rk30,...,rk0

5.3密钥扩展算法

  轮密钥由加密密钥通过密钥扩展算法生成。加密密钥为MK-(MK0, MK1, MK2, MK3),轮密钥生成方法为:

  (K0,K1,K2,K3)=(MK0※FK0MK1※FK1MK2※FK2MK3※FK3

  rki=Ki+4=KiT'(Ki+1Ki+2Ki+3※CKi),i=0,1,...,31,其中T'是将T的线性变换L替换为L' : L'(B)=B※(B<<<13)※(B<<<23)

    FK取值固定,(A3B1BAC6,56AA3350,677D9197,B27022DC)

    CK取值固定,

国密SSL VPN技术规范

1.前言

  国密SSL通信协议,协议号0x0101,相较于TLS1.1,增加了ECC、IBC的认证模式和密钥交换模式,取消了DH密钥交换方式,定义了密码套件,增加了网关-网关协议。

  该文件的应用还需要以下文件支持:GM/T 0005 0009 0010 0014 0015

2.术语和定义

  数字证书,也称公钥证书,由证书认证机构(CA)签名的一种数据结构(包含公开密钥拥有者信息,公开密钥等信息)。按类别可分为个人证书、机构证书和设备证书;按用途可分为签名证书和加密证书。

  IBC算法,又成为标识密码算法,是一种能以任意标识作为公钥,不需要使用数字证书证明公钥的非对称密码算法。

  IBC标识,表示实体身份或属性的字符串。

  载荷,ISAKMP通信双方交换消息的数据格式,是构造ISAKMP消息的基本单位。

  CBC,密码分组链接工作模式。

  VPN,虚拟专用网络(Virtual Private Network)。

  HMAC,采用杂凑算法(SM3)计算的消息验证码。

  PRF,伪随机函数

3.密码算法

  非对称密码算法,包括ECC椭圆曲线密码算法SM2、IBC标识密码算法SM9、RSA算法,用于身份鉴别、数字签名、密钥交换等。

  分组密码算法,SM1或SM4算法,用于密钥交换数据的加密保护和报文数据的加密保护,该算法的工作模式为CBC模式。

  密码杂凑(哈希)算法,包括SM3算法和SHA_1算法,用于对称密钥生成和完整性校验。

4.密钥种类

  概述,在国密SSL通信过程中,采用非对称密码算法进行身份鉴别和密钥交换,身份鉴别通过后协商预主密钥,双方各自计算主密钥,进而推导出工作密钥。使用工作密钥进行加解密和完整性校验。

  服务端密钥,用于握手过程中服务端身份鉴别和预主密钥的协商。服务端密钥为非对称密码算法的密钥对,包括签名密钥对和加密密钥对。其中签名密钥对由VPN自身密码模块产生,加密密钥对通过CA认证中心向KMC(密钥管理中心)申请。

  客户端密钥,用于握手过程中客户端身份鉴别和预主密钥的协商。同服务端密钥一样

  预主密钥,双方协商生成的密钥素材,用于生成主密钥。

  主密钥,由预主密钥、客户端随机数、服务端随机数、常量字符串,经计算生成的密钥素材,用于生成工作密钥。

  工作密钥,包括数据加密密钥和校验密钥。其中数据加密密钥用于数据的加密和解密,校验密钥用于数据的完整性计算和校验。发送方使用的工作密钥称为写密钥,接收方使用的工作密钥称为读密钥。

5.协议

  国密SSL VPN协议包括握手协议、密码规格变更协议、报警协议、网关-网关协议、记录层协议。握手协议用于身份鉴别和安全参数协商;密码规格变更协议用于通知安全参数变更;报警协议用于关闭通知和对错误进行报警;网关-网关协议用于建立网关到网关的传输层隧道;记录层协议用于传输数据的分段、压缩及解压缩、加密及解密、完整性校验。

6.握手协议族

(1)概述

  由密码规格变更协议、握手协议和报警协议三个子协议组成,用于双方协商出供记录层使用的安全参数,进行身份验证以及向对方报告错误等。

  握手协议族负责协商出一个会话,这个会话包括:

    会话标识:由服务端选取的随意的字节序列,用于识别活跃或可恢复的会话。

    证书:X.509 v3格式的数字证书

    压缩方法

    密码规格:指定的密码算法

    主密钥:客户端和服务端共享的48字节的密钥

    重用标识:标明能否用该会话发起一个新连接的标识。

  利用以上数据可以产生安全参数。利用握手协议的重用特性,可以使用相同的会话建立多个连接。

(2)握手协议总览

  握手协议涉及如下过程:

    交换hello消息来协商密码套件,交换随机数,决定是否会话重用;

    交换必要的参数,协商预主密钥;

    交换证书或IBC信息,用于验证对方;

    使用预主密钥和交换的随机数生成主密钥;

    向记录层提供安全参数;

    验证双方计算的安全参数的一致性、握手过程的真实性和完整性。

  握手流程如下:

  

  hello。客户端发送客户端hello消息给服务端,服务端回应服务端hello消息,否则产生一个fatal错误并断开连接。 hello用于在客户端和服务端进行基于ECC或IBC或RSA的密码算法协商,确定安全传输能力(包括协议版本,会话标识,密码标识,密码套件等属性),产生和交换随机数。

    身份验证和密钥交换。包括服务端证书、服务端密钥交换,客户端证书、客户端密钥交换。服务端发送完hello之后,接着发送自己的证书消息,服务端密钥交换消息。如果服务端需要验证客户端身份,则向客户端发送证书请求信息。然后发送服务端hello完成消息,hello解决结束,等待客户端返回消息。如果服务端向客户端发送证书请求信息(验证客户端身份),客户端必须返回证书消息。然后客户端发送密钥交换消息(消息内容取决于客户端hello消息和服务端hello消息协商出的密钥交换算法)。如果客户端发送了证书消息,那么也应发送一个带数字签名的证书验证消息供服务端验证客户端的身份。

  接着客户端发送密码规格变更消息,然后客户端立即使用刚协商的算法和密钥,加密并发送握手结束消息。服务端则回应密码规格变更消息,使用刚协商的算法和密钥,加密并发送握手结束消息。至此,握手过程结束,服务端和客户端可以开始数据安全传输。

(3)握手协议

  握手协议用于协商安全参数,握手协议的消息通过记录层协议传输。

  客户端hello:包括协议版本、随机数(时钟+随机数)、会话标识、密码套件、压缩方法。

    会话标识session_id是一个可变长字段,其值由服务端决定。如果没有可重用的会话标识或希望协商安全参数,该字段应为空,否则表示客户端希望重用该会话。

    密码套件,包括一个密钥交换算法、一个加密算法和一个校验算法。国密密码套件列表如下:

    

    服务端hello:包含内容同客户端hello,如果能从客户端hello消息中的密码套件消息中找到匹配的密码套件,返回服务端hello,否则返回handshake failure报警消息。

  服务端证书消息(Server Certificate),该消息总是紧跟在服务端hello消息之后。当选中的加密套件使用ECC或ECDHE或RSA时,本消息的内容为服务端的签名证书(在前)+加密证书(在后);当选中的加密套件使用IBC或IBSDH时,本消息的内容为服务端标识和IBC公共参数,用于客户端与服务端协商IBC公开参数。证书格式为X.509 v3,证书类型必须能适用于已经确定的密钥交换算法。密钥交换算法与证书密钥类型关系如下所示:

  

  服务端密钥交换消息(Server Key Exchange),用于客户端计算产生48字节的预主密钥。本消息中的密钥交换算法有:ECDHE、ECC、IBSDH、IBC、RSA。当使用ECDHE,即使用SM2算法时,交换的参数见GM/T 0009,其中服务端的公钥不需要交换,客户端直接从服务端的加密证书中获取。

  证书请求消息(Certificate Request),如果服务端要求认证客户端,则发送此消息,要求客户端发送自己的证书。该消息包括 a)要求客户端提供的证书类型列表 b)服务器信任的CA的证书可识别名(DN)列表(如果证书类型是IBC,本字段内容是IBC密钥管理中心的信任域名的列表)

  服务端hello完成消息(Server Hello Done),表示握手过程的hello消息阶段完成,发送完该消息后服务端等待客户端的响应消息。客户端接收到之后,验证服务端证书是否有效,并检验服务端的hello消息参数是否可以接受。如果可以接受,继续握手,否则发送Handshake failure致命报警。

  客户端证书消息(Client Certificate),如果服务端发送了证书请求消息,客户端要发送本条消息,消息内容同服务端证书消息。

  客户端密钥交换消息(Client Key Exchange)。如果密钥交换算法使用RSA、ECC和IBC算法,本消息中包含预主密钥(由客户端产生,采用服务端的加密公钥进行加密),当服务端收到加密后的预主密钥后,利用相应的私钥进行解密,获得预主密钥的明文;如果密钥交换算法使用ECDHE或IBSDH,本消息中包含计算预主密钥的客户端密钥交换参数。预主密钥的数据结构包括 a)客户端所支持的版本号,服务端要检查这个值是否和客户端hello消息中所发送的值相匹配 b)46字节的随机数。

  证书校验消息(Certificate Verify)。该消息用于鉴别客户端是否为证书的合法持有者,只有客户端证书消息发送时才发送此消息。证书校验消息包含签名算法列表:rsa_sha1,rsa_sm3,ecc_sm3(当ECC为SM2算法时用这个套件),ibs_sm3。要对这些内容进行哈希计算:自客户端hello消息直到本条消息(不含)为止所有与握手有关的消息。当使用SM2算法签名时,使用客户端的签名密钥。

  握手结束消息(Finished)。服务端和客户端各自在密码规格变更消息之后发送本消息,用于验证密钥交换过程是否成功,并校验握手过程的完整性。

7.密钥计算

主密钥计算

  主密钥由预主密钥、客户端随机数、服务端随机数、常量字符串,经PRF计算生成,共48字节。

工作密钥

  工作密钥包括校验密钥和加密密钥,由主密钥、客户端随机数、服务端随机数、常量字符串,经PRF计算生成。

8.国密算法加密套件(由国密VPN协议定义)

  功能:定义客户端-服务端如何协商对称密钥,采用哪种算法进行数据校验和签名,加密套件是双方建立连接的基础,由协议约定,只有客户端和服务端具有同样的加密套件,才能握手成功。

  国密通信中,主要应用的国密套件为ECC_SM4_SM3、ECDHE_SM4_SM3(必须要求双向认证)。

  例如:ECC_SM4_SM3

  在国密SSL通信中,主要使用的加密套件。(目前支持国密通信的浏览器主要也是支持了这个加密套件),其值为(0xe0,0x13),代表密码套件的编号,由IANA定义。ECC——即SM2,密钥交换及签名算法;SM4——加密算法;SM3——校验算法

  例如:TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(0xc02c)

   由TLS协议、ECDHE密钥交换(协商)算法(EC:椭圆曲线;DH:基于DH算法的交换算法;E:Ephermeral)、ECDSA签名算法(身份验证)、AES_256_GCM加密算法SHA384哈希算法(数据校验)这几部分组成,0xc02c为此加密套件的ID号。

国密算法的开源实现 —— GmSSL

认识GmSSL

  http://gmssl.org/

  https://github.com/guanzhi/GmSSL.git

  GmSSL是一个开源的密码库以及工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法、SM2国密数字证书及基于SM2证书的SSL/TLS安全通信协议,支持国密硬件密码设备,提供符合国密规范的编程接口与命令行工具,可以用于构建PKI/CA、安全通信、数据加密等符合国密标准的安全应用。

 GmSSL编译与运行

$ git clone https://github.com/guanzhi/GmSSL gmssl
$ cd gmssl
$ ./config --prefix=/home/lin/gm-ws/gmssl -DGMSSL_NO_TURBO no-afalgeng(适用于FT 2000台式机)
$ make
$ make install
 
$ export PATH=/home/lin/gm-ws/gmssl/bin:$PATH
$ export LD_LIBRARY_PATH=/home/lin/gm-ws/gmssl/lib:$LD_LIBRARY_PATH

$ gmssl version //查看GmSSL是否安装成功 

查看gmssl所支持的国密套件

openssl ciphers -V | column -t

  在GmSSL中,ECC_SM4_SM3的名称为:SM2-WITH-SMS4-SM3,适用于GMTLSv1.1版本,密钥协商算法为SM2,身份验证算法为SM2,加密算法为SMS4,密钥长度128位,HMAC(基于哈希的消息认证码)算法为SM3。

  测试某服务器是否支持某个密码套件

openssl s_client -cipher "ECDHE-SM2-WITH-SMS4-SM3" -connect sm2test.ovssl.cn:443 -tls1_2 -servername sm2test.ovssl.cn

创建证书

搭建个人国密CA

  CA是分级管理的,这是一个三级CA管理:Root CA -> Server CA -> Server

  Root CA为一级CA,拥有根CA证书;Server CA为二级CA,其CA证书由Root CA签发;Server为最终用户,其证书由Server CA签发。当然Root CA也可以直接给Server签发证书

制作 根CA 证书

1. 生成SM2私钥

gmssl ecparam -genkey -name sm2p256v1 -text -out rootkey.pem

2. 创建证书请求

gmssl req -new -key rootkey.pem -out rootreq.pem

3. 创建一个certext.ext文本文件,内容为:

[ v3_ca ]
basicConstraints = CA:true  //指定所签发的证书是CA证书
[ usr_cert ]
subjectAltName = DNS:localhost

4. 生成证书

gmssl x509 -req -days 365 -in rootreq.pem -signkey rootkey.pem -extfile certext.ext -extensions v3_ca -out rootcert.pem
5. 将key和证书合到一个文件中(非必要)
$ cat rootcert.pem rootkey.pem > root.pem

签发 Server CA 证书

$ gmssl ecparam -genkey -name sm2p256v1 -text -out serverCAkey.pem
$ gmssl req -new -key serverCAkey.pem -out serverCAreq.pem
$ gmssl x509 -req -days 365 -in serverCAreq.pem -extfile certext.ext -extensions v3_ca -CA rootcert.pem -CAkey rootkey.pem -CAcreateserial -out serverCAcert.pem
$ cat serverCAcert.pem serverCAkey.pem rootcert.pem > serverCA.pem

签发 Server 证书

$ gmssl ecparam -genkey -name sm2p256v1 -text -out serverkey.pem
$ gmssl req -new -key serverkey.pem -out serverreq.pem
$ gmssl x509 -req -days 365 -in serverreq.pem -extfile certext.ext -extensions usr_cert -CA serverCA.pem -CAkey serverCA.pem -CAcreateserial -out servercert.pem
$ cat servercert.pem serverkey.pem serverCAcert.pem rootcert.pem > server.pem

注意:CA的一个重要前提是信任!此套证书仅用于开发测试,浏览器并不会信任该证书!如果需要在产品中部署国密证书,需要去指定CA中心申请。

 
 
 
 
原文地址:https://www.cnblogs.com/pgzhanglin/p/15336731.html