国密算法总结
概念说明
国密算法是指我国定制的商用加密算法,用于金融行业。包括SM1、SM2、SM3、SM4。其中SM1是硬件实现的算法,我里不与讨论,而SM2、SM3、SM4等可以使用软件实现。
国际算法比较
- 国际加密算法:RSA、SHA/MD5、DES等常用算法,RSA是非对称算法(签名和验签),SHA/MD5为摘要算法(HASH值),DES为对称加密(数据加密)。
- 国密算法的SM2对应于RSA,SM2对应于SHA,SM3对应于DES。
- 非对称算法 RSA密钥目前建议使用2048 BIT(公钥明文256 byte私钥明文512 byte),生成的加密数据为密钥长度的整数倍,签名数据与密钥长度一致。SM2密钥长度为32字节(公钥明文64字节,私钥明文32字节),生成的加密数据结果为32*3+明文长度,签名数据与私钥长度一致64字节。
- 对称加密 DES加密的密钥必须是8/16/32的倍数对应于DES/3DES/3DES加密,输入数据长度必须是密钥长度的整数倍;而SM4的密钥长度是16字节,输入数据必须是16字节的倍数。
- 摘要算法 SM3计算结果为32字节的HASH值。
关键参数
SM2 椭圆曲线参数(规范推荐值)、userID(推荐值:1234567812345678)、私钥、公钥(可通过私钥生成)
知识点
- SM2密钥对的生成是基于一些算法参数,这些数据在规范内是有推荐值的。所以在使用SM2算法的前提是双方都使用的是相同的推荐参数,否则计算结果是不会对的。具体参数可查看规范。
- SM3对称加密算法的密文数据,如果长度为明文长度+1(16字节的整数倍+1),则第一个字节是一个标识(0x04)。所以在处理SM3解密的时候要注意,有些工具或API在解密时可能需要加上标识符。
- SM2加密结果数据的组成:1 BYTE(0x04) + 64 BYTE(2个大整数) + 密文(与明文长度相同) + 32 BYTE(密文的HASH值)。其中第一字节的标识数据要注意处理,其它工具或API是否要求。
- SM2进行签名,对于相同的待签名数据,每次签名的结果都不同,不是固定的。因为签名过程会使用到随机数,签名过程会对明文+公钥+ID进行摘要。
- SM4加密时要进行16字节的对齐。
- 在使用一些开源加密库时要注意:
- BYTE数组和大整数的转换 API生成的钥数据有可能出现33字节,而第1字节为0x00,这个字节表示符号(正数)。32字节密钥的本质是一个大整数(即大整数转换成字节数),而密钥只生成正整数,由于第1个字节的最高位为1时表示的是负数,所以在转换时就有了一个字节0x00表示为正数。同样的,在调用开源接口进行byte数据转换为大整数的时候,如果密钥明文是32 byte,但是第一个字节最高位为1时,必须要先添加一个0x00。