当前位置:文档之家› 国密算法简介

国密算法简介

版本人员时间升级内容❝课程目的◦了解国密算法的算法原理◦了解SM2、SM3、SM4的算法原理◦了解国密卡片相关API❝目标人员◦移动金融初级开发人员❝前置课程◦RSA密钥体系◦DES密钥体系❝基本知识❝对称加密算法SM2❝非对称加密算法SM4❝摘要算法SM3定义国密即国家密码局认定的国产密码算法,即商用密码,主要完成加密、解密、签名、验签、摘要等操作。

常用国密算法种类算法类型密钥长度输入数据要求输出数据特征SM2非对称加密算法公钥64字节,私钥32字节。

长度小于(2^32-1)*32=137,438,953,440字节(大约1374亿多)。

输出长度是明文长度+96,有随机数参数,每次密文不同。

SM3摘要算法--无要求。

固定长度,32字节。

SM4对称加密算法16字节分组长度16字节,需要填充到16字节整数倍。

有CBC和ECB两种模式,CBC需要设定初始值。

长度为16字节整数倍。

国密算法还有SM1、SM7、SSF33、祖冲之密码对称加密算法,SM9非对称加密算法。

国密算法与其他算法比较非对称加密算法SM2与RSA比较国密算法与其他算法比较SM2与RSA算法的一些统计数据RSA密钥强度(长度)SM2密钥强度(长度)破解时间(年)521比特106比特104(已破解)768比特132比特108(已破解)1024比特160比特10112048比特210比特1020国密算法与其他算法比较SM2与RSA算法的一些统计数据算法签名速度验签速度1024RSA2792次/秒51224次/秒2048RSA455次/秒15122次/秒256SM24095次/秒871次/秒国密算法与其他算法比较SM4与DES较从算法上看,国产SM4算法在计算过程中增加非线性变换,理论上能大大提高其算法的安全性,并且由专业机构进行了密码分析,民间也对21轮SM4进行了差分密码分析,结论均为安全性较高。

国密卡实现API类层次图class ng.Object◦class com.guomi.GMCipher◦class com.guomi.GMKeyBuilder◦class com.guomi.GMKeyPair◦class com.guomi.GMMessageDigest ◦class com.guomi.GMSignature◦class com.guomi.GMCipherExtend◦class com.guomi.GMSM2KeyExchange国密卡实现的API接口interface javacard.security.Key◦interface javacard.security.SecretKeyinterface com.guomi.SM1Keyinterface com.guomi.SM4Keyinterface com.guomi.SM7Keyinterface com.guomi.SSF33Key◦interface javacard.security.PrivateKey interface com.guomi.SM2PrivateKey ◦interface javacard.security.PublicKeyinterface com.guomi.SM2PublicKey国密卡实现的API接口interface com.unionpay.guomi.SM2Key ◦interface com.guomi.SM2PrivateKey◦interface com.guomi.SM2PublicKey目录❝算法原理❝加密❝解密❝签名❝验签算法原理❝国密SM2规定椭圆曲线参数(固定值,256比特)◦p :FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF◦a:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC◦b:28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93◦n:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123◦gx:32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7◦gy:BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0❝各个参数意义如下椭圆曲线方程:y2=x3+ax+b,把它定义在Fp上, 要求a,b满足:4a3+27b2≠0(mod p)那么,p 、a 、b 用来确定一条椭圆曲线(确切来说应该是有限域Fp),G(gx,gy)为基点,n为点G 的阶,另外,还有一个非必要参数h,是椭圆曲线上所有点的个数m与n相除的整数部分;加密SM2公私玥结构、◦SM2公私玥关系P=d*G 或者(x ,y )=d*(gx ,gy ),即公钥P 是基点G 的d 倍点。

其中,P 为公钥,坐标表示为(x,y),d 为私钥,G 为基点,坐标(gx ,gy ),‘*’为离散椭圆曲线坐标系中的乘法运算。

长度举例SM2公钥64字节,包括x 分量和y 分量6C7D9D212ED9A5B43659402F07696F7026AE2ADB874D9BDC2D4DC47D883B6AEE8FC2FA7668EFD664E0876B21B1C6202551978331C59259489E5B13F941E1EA95SM2私钥32字节38DAF6D271322AF0AFEE399DEEF28D18B51CD8388BF78F4E78B943E7436181A4离散域加法及多倍点图解公私玥SM2公私玥对生成◦Java CardGMKeyPair dGM_KeyPair= null;SM2PublicKey dSM2pubkey = null;SM2PrivateKey dSM2prikey = null;dGM_KeyPair= new GMKeyPair(GMKeyPair.ALG_SM2_FP,GMKeyBuilder.LENGTH_SM2_FP_256);dSM2pubkey = (SM2PublicKey) GMKeyBuilder.buildKey(GMKeyBuilder.TYPE_SM2_PUBLIC, GMKeyBuilder.LENGTH_SM2_FP_256,true);dSM2prikey = (SM2PrivateKey) GMKeyBuilder.buildKey(GMKeyBuilder.TYPE_SM2_PRIVATE, GMKeyBuilder.LENGTH_SM2_FP_256,true);dGM_KeyPair.genSM2KeyPair();dSM2prikey = (SM2PrivateKey) dGM_KeyPair.getPrivate();dSM2pubkey = (SM2PublicKey) dGM_KeyPair.getPublic();公私玥SM2公私玥对生成◦Java EEAsymmetricCipherKeyPair keyPair=ecKeyPairGenerator.generateKeyPair();ECPrivateKeyParameters priKey= (ECPrivateKeyParameters) keyPair.getPrivate();ECPublicKeyParameters pubKey= (ECPublicKeyParameters) keyPair.getPublic();BigInteger biD= priKey.getD();//私钥BigInteger biX= pubKey.getQ().getX().toBigInteger();//公钥X分量BigInteger biY= pubKey.getQ().getY().toBigInteger();//公钥Y分量加密明文结构◦SM2加密算法对明文数据不需要填充。

◦SM2加密算法要求明文长度小于(2^32-1)*32字节。

注:RSA算法中,明文长度要求小于模长。

加密完整密文结构字段名称解析长度XCoordinate离散椭圆曲线上随机点的x分量32字节YCoordinate离散椭圆曲线上随机点的y分量32字节HASH哈希值,32字节CipherText纯密文与明文长度一致注:SM2算法中,由于需要随机选取点参与密文计算,故相同的明文及密钥,在不同的加密过程中,密文也不相同,与RSA算法不同。

加密加密步骤◦加密输入数据:源数据(M)、SM2公钥SM2Publickey(包括公钥分量x、公钥分量y)。

◦通过SM2公钥加密算法,计算完整密文。

加密SM2加密代码实现◦Java CardCipher dGM_Cipher=GMCipher.getInstance(GMCipher.ALG_SM2_WITH_SM3_NOPAD,false);dGM_Cipher.init(dSM2pubkey, Cipher.MODE_ENCRYPT);short reslen= dGM_Cipher.doFinal(debugdata, (short) 0,(short) debugdata.length, buf, (short) 0);加密SM2加密代码实现◦Java EESM2 sm2= SM2.getInstance();Cipher cipher= new Cipher();ECPoint userKey= sm2.getUserKey(x, y);// 随机生成公钥分量,c1.x、c1.y。

cipher.encrypt(data)ECPoint c1 = cipher.init_enc(sm2, userKey);byte[] xy= c1.getEncoded();byte[] thash= ne cipher.doFinal(thash);// 计算HASHw byte[32];System.out.println("allciphertext="+ Utils.toHexStringNoBlank(xy).substring(2, 130)+ Utils.toHexStringNoBlank(thash)+ Utils.toHexStringNoBlank(data));解密解密步骤◦输入数据:密文(C)、SM2私钥SM2prikey。

相关主题