发布于 

国密算法浅析

前言

最近论坛上看到很多人讨论国密算法,但是实际工作中基本没有用到过。其实很多国家都有自己的国家级加密算法,韩国的ARIA、日本的Camellia、俄罗斯(前苏联)的GOST,那么国密算法有什么好处和优点?

简介

国密即国家密码局认定的国产密码算法,即商用密码。商用密码主要用于对不涉及国家秘密内容但又具有敏感性的内部信息、行政事务信息、经济信息等进行加密保护。现在主要使用在国有企业以及银行等地方。

国密即国家密码局认定的国产密码算法。主要有SM1、SM2、SM3、SM4。密钥长度和分组长度均为128位。

SM1

SM1 为对称加密,加密强度与AES相当。算法核心闭源,调用该算法时,需要通过加密芯片的接口配合进行调用。
采用该算法已经研制了系列芯片、智能IC卡、智能密码钥匙、加密卡、加密机等安全产品,主要应用于电子政务、电子商务及国民经济的各个应用领域(包括国家政务通、警务通等重要领域)。

SM1分组密码和SSF33分组密码均为国密分组密码标标准,SM1和SSF33的密钥长度和分组长度均为128比特。

目前这两个分组密码标准的算法尚未公开,其实现仅可以通过硬件芯片的方式获得,目前很多国产密码设备均包含这两个分组密码的硬件实现,由国家密码管理局制定的《智能IC卡及智能密码钥匙密码应用接口规范》中包含了对SM1分组密码的ECB、CBC、CFB、OFB加密模式和CBC-MAC的算法定义。

Engine调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* load engine with SM1 support */
ENGINE *engine = ENGINE_by_id("sdf");
if (engine == NULL) goto err;

/* load sm1-cbc cipher from engine */
const EVP_CIPHER *cipher = ENGINE_get_cipher(engine, NID_sm1_cbc);
if (cipher == NULL) goto err;

/* encrypt with sm1-cbc implemented with engine */
EVP_CIPHER_CTX *cctx = EVP_CIPHER_CTX_new();
if (cctx == NULL) goto err;
if (1 != EVP_EncryptInit_ex(cctx, cipher, engine, key, iv)) goto err;
if (1 != EVP_EncryptUpdate(cctx, ...)) goto err;
if (1 != EVP_EncryptFinal_ex(cctx, ...)) goto err;

SM1测试数据

SM1-ECB

1
2
3
4
5
6
7
8
unsigned char key[16] = {
0x40,0xbb,0x12,0xdd,0x6a,0x82,0x73,0x86,0x7f,0x35,0x29,0xd3,0x54,0xb4,0xa0,0x26
};
unsigned char plaintext[16] = {
0xff,0xee,0xdd,0xcc,0xbb,0xaa,0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00
};
unsigned char ciphertext[16] = {
0x6d,0x7f,0x45,0xb0,0x8b,0xc4,0xd9,0x66,0x44,0x4c,0x86,0xc2,0xb0,0x7d,0x29,0x93};

SM1-CBC

1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned char sm1_cbc_test_key[16] = {
0x40,0xbb,0x12,0xdd,0x6a,0x82,0x73,0x86,0x7f,0x35,0x29,0xd3,0x54,0xb4,0xa0,0x26
};
unsigned char sm1_cbc_test_iv[16] = {
0xe8,0x3d,0x17,0x15,0xac,0xf3,0x48,0x63,0xac,0xeb,0x93,0xe0,0xe5,0xab,0x8b,0x90
};
unsigned char sm1_cbc_test_plaintext[32] = {
0xff,0xee,0xdd,0xcc,0xbb,0xaa,0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00,
0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff
};
unsigned char sm1_cbc_test_ciphertext[32] = {
0x3a,0x70,0xb5,0xd4,0x9a,0x78,0x2c,0x07,0x2d,0xe1,0x13,0x43,0x81,0x9e,0xc6,0x59,
0xf8,0xfc,0x7a,0xf0,0x5e,0x7c,0x6d,0xfb,0x5f,0x81,0x09,0x0f,0x0d,0x87,0x91,0xb2};

SM2

SM2为非对称加密,基于ECC(椭圆曲线算法)。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。

SM2和椭圆曲线算法是什么关系?

椭圆曲线算法是通过方程确定的,SM2算法采用的椭圆曲线方程为:

y2=x3+ax+by^2 = x^3 + a·x + b

在SM2算法标准中,通过指定a、b系数,确定了唯一的标准曲线。同时,为了将曲线映射为加密算法,SM2标准中还确定了其它参数,供算法程序使用。

SM2加解密步骤

参考文献

基于国密(SM2)HTTPS证书

国产密码算法是保障我国网络安全自主可控的重要基础。国密标准(SM2)证书同时通过 “SM2/RSA” 双证书服务帮助网站系统自适应兼容所有浏览器,兼顾国密合规和全球通用。

国密 SSL 协议的握手过程如下:(基本兼容常规RSA证书握手流程)

  • 1.交换 Hello 消息来协商密码套件,交换随机数,决定是否会话重用。
  • 2.交换必要的参数,协商预主密钥。
  • 3.交换证书信息,用于验证对方。
  • 4.使用预主密钥和交换的随机数生成主密钥。
  • 5.向记录层提供安全参数。
  • 6.验证双方计算的安全参数的一致性、握手过程的真实性和完整性。

实现以上握手过程,需要客户端(浏览器)和服务端都支持国密算法。虽然目前 SM2/SM3/SM9 算法已相继纳入国际标准体系,但要实现客户端和服务端的广泛兼容,仍然需要漫长的推进过程。在此期间,通过技术解决方案让浏览器端、服务端都能够支持国密算法和国密 SSL 证书,才能推动国密算法普及应用。
因此,在服务端实现基于国密算法的 SSL 认证和 HTTPS 加密,需要网站运营者向工信部许可的权威电子认证机构,申请符合国密标准的国密 SSL 证书,并将证书部署在支持国密标准证书的 web 服务器上。

支持国密(SM2)标准证书的浏览器

360浏览器、密信浏览器、红莲花浏览器等可支持国密算法。

SM3

SM3 一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。相关标准为”GM/T 0004-2012 《SM3密码杂凑算法》”。

在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开。据国家密码管理局表示,其安全性及效率与SHA-256相当。

在信息安全中,有许多重要的应用,都使用了密码散列函数来实现,例如数字签名,消息认证码。对标MD5算法。
整个算法的执行过程可以概括成四个步骤:消息填充、消息扩展、迭代压缩、输出结果。具体详细流程不再赘述,参考文末国家密码局文献。

SM4

SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。由国家密码管理局于2012年3月21日发布,相关标准为”GM/T 0002-2012《SM4分组密码算法》(原SMS4分组密码算法)”。2016年8月,成为中国国家密码标准(GB/T 32907-2016)。

SM4密码算法是一个分组算法,数据分组长度为128比特,密钥长度为128 比特。加密算法与密钥扩展算法均采取32轮迭代结构。SM4密码算法以字节(8位)和字节(32位)作为单位进行数据处理。SM4密码算法是对合运算,因此解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。  

SM4

SM4算法的基本内容有以下几方面:

  • 基本运算:SM4密码算法使用模2加和循环移位作为基本运算。
  • 基本密码部件:SM4密码算法使用了S盒、非线性变换τ、线性变换部件L、合成变换T基本密码部件。
  • 轮函数:SM4密码算法采用对基本轮函数进行迭代的结构。利用上述基本密码部件,便可构成轮函数。SM4密码算法的轮函数是一种以字为处理单位的密码函数。
  • 加密算法:SM4密码算法是一个分组算法。数据分组长度为128比特,密钥长度为128比特。加密算法采用32轮迭代结构,每轮使用一个轮密钥。
  • 解密算法:SM4密码算法是对合运算,因此解密算法与加密算法的结构相同,只是轮密铝的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
  • 密钥扩展算法:SM4密码算法使用128位的加密密钥,并采用32轮法代加密结构,每一轮加密使用一个32位的轮密钥,共使用32个轮密钥。因此需要使用密钥扩展算法,从加密密钥产生出32个轮密钥。
提示

由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。

参考文献

  1. SM2椭圆曲线公钥密码算法
  2. SM2椭圆曲线公钥密码算法推荐曲线参数
  3. SM3密码杂凑算法
  4. SM4 Wiki简介