CN106411498B - 一种实现国密算法的方法 - Google Patents
一种实现国密算法的方法 Download PDFInfo
- Publication number
- CN106411498B CN106411498B CN201611206829.2A CN201611206829A CN106411498B CN 106411498 B CN106411498 B CN 106411498B CN 201611206829 A CN201611206829 A CN 201611206829A CN 106411498 B CN106411498 B CN 106411498B
- Authority
- CN
- China
- Prior art keywords
- value
- algorithm
- result
- state
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/002—Countermeasures against attacks on cryptographic mechanisms
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/08—Key distribution or management, e.g. generation, sharing or updating, of cryptographic keys or passwords
- H04L9/0861—Generation of secret information including derivation or calculation of cryptographic keys or passwords
- H04L9/0866—Generation of secret information including derivation or calculation of cryptographic keys or passwords involving user or device identifiers, e.g. serial number, physical or biometrical information, DNA, hand-signature or measurable physical characteristics
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/08—Key distribution or management, e.g. generation, sharing or updating, of cryptographic keys or passwords
- H04L9/0861—Generation of secret information including derivation or calculation of cryptographic keys or passwords
- H04L9/0877—Generation of secret information including derivation or calculation of cryptographic keys or passwords using additional device, e.g. trusted platform module [TPM], smartcard, USB or hardware security module [HSM]
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/32—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
- H04L9/3247—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials involving digital signatures
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Storage Device Security (AREA)
Abstract
本发明公开了一种实现国密算法的方法,涉及POS安全传输领域。所述方法:S1,判断POS机中是否安装国密芯片,如果是,则进入S2;如果否,则进入S4;S2,判断国密芯片和/或通信通道是否被攻击,如果是,则进入S4;如果否,则进入S3;S3,设置国密芯片可使用标识,使用国密芯片保护数据传输安全;S4,设置国密芯片不可使用标识,同时,调用国密软件程序保护数据传输安全;所述国密软件程序为SM2算法软件程序、SM3算法软件程序或SM4算法软件程序。本发明所述方法实现了在国密芯片无法使用时,保证能够POS机信息传输过程中正常使用国密算法。
Description
技术领域
本发明涉及POS安全传输领域,尤其涉及一种实现国密算法的方法。
背景技术
在POS机上,如果需要支持国密算法,通常会使用一块支持国密算法的芯片(简称:国密芯片)。POS机的MCU通过SPI等通讯接口,把密钥或数据同时发送给国密芯片,国密码芯片计算完成后,再把计算结果返回POS机。两者交互的数据一般都是明文形式。基于传输过程的安全,现有利用MCU的安全机制,把国密芯片、MCU与国密芯片通讯通道保护起来。当国密芯片或通讯通道受到攻击时,MCU立即检测到攻击,停止数据交互,防止重要数据泄露,如:密钥。
上述POS机上的国密算法,避免了重要数据的泄露,但是,当POS机上国密芯片宕机或坏掉,则会导致国密算法无法使用;或检测到国密芯片或通讯通道受到攻击时,为了保证重要数据安全,也不能使用国密芯片;或在旧版本的机器中,没有国密芯片,国密算法也无法使用。国密算法的无法应用直接导致POS机存在泄漏信息的风险,故,需要提供一种在国密芯片不能使用的条件下,依旧能够实现国密算法的软件方法。
发明内容
本发明的目的在于提供一种实现国密算法的方法,从而解决现有技术中存在的前述问题。
为了实现上述目的,本发明所述实现国密算法的方法,所述方法包括:
S1,判断POS机中是否安装国密芯片,如果是,则进入S2;如果否,则进入S4;
S2,判断国密芯片和/或通信通道是否被攻击,如果是,则进入S4;如果否,则进入S3;
S3,设置国密芯片可使用标识,使用国密芯片实现国密算法的使用;
S4,设置国密芯片不可使用标识,同时,调用国密软件程序实现国密算法的使用;所述国密软件程序为SM2算法软件程序、SM3算法软件程序或SM4算法软件程序。
优选地,步骤S1具体按照下述实现:通过ADC采集POS机MCU硬件引脚的ADC值,然后根据调用的module_is_exist函数,在预先设置的ADC值表中查询采集到的ADC值与ADC值表中的ADC值是否匹配,如果是,则POS机上已安装国密芯片;如果否,则POS机上未安装国密芯片。
优选地,步骤S3中,使用国密芯片实现国密算法的使用过程中还包括以下步骤,具体按照下述实现:MCU发送数据包后,判断MCU是否在预定的超时时间内收到国密芯片返回的运算结果,如果是,则继续使用国密芯片保护数据传输安全;如果否,则所述国密芯片工作不正常,通讯失败,进入S4。
优选地,所述国密软件程序为SM2算法软件程序,具体按照下述步骤实现:
A1,初始化
首先申请分配用于椭圆曲线算法的内存空间,并初始化为素域椭圆曲线的仿射坐标表示形式;使用在仿射坐标系下简化的椭圆曲线方程:y2=x3+ax+b;接着申请并初始化用于大数算法的内存空间;两个内存空间用于保存SM2算法的工作环境;两个内存空间的地址保存在全局变量中,不释放;
然后,使用SM2算法推荐的椭圆曲线参数:域规模q、第一参数a、第二参数b、基点G的坐标及其点的阶n,进一步初始化SM2算法的工作环境,
最后,预存乘法结果,所述乘法结果用于加速后续使用的点的乘法;
A2,生成公私钥对
首先,调用MCU的硬件随机函数,产生32字节随机数的私钥;利用A1中已初始化的椭圆曲线,计算与所述私钥对应的公钥;
然后,检验公私钥是否有效,如果是,则清除缓存的公私钥,并返回公私钥生成成功的消息;如果否,则清除缓存的密钥对,并返回公私钥生成不成功;
A3,计算用户与消息的杂凑值
在用户信息ID、用户信息长度、初始化后的椭圆曲线的第一参数a、第二参数b、公钥与用户输入的消息的基础上,使用杂凑算法,计算并得到用户与消息的杂凑值;
A4,对用户数据进行签名;
A5,验证接收到的数据上的签名是否合法。
更优选地,A4中,对用户数据进行签名,具体按照下述步骤实现:
A41,依据用户信息与用于签名的消息,计算杂凑值e,
A42,调用MCU的硬件随机函数,生成32字节的随机数k;判断k是否符合0≤k≤n;如果是,则返回A41;如果否,则进入A43;
A43,利用A1中已初始化的椭圆曲线,计算椭圆曲线上获得随机数k与基点G的乘积结果所对应的点(x1,y1);
A44,将所述杂凑值e和点的横坐标x1的数据类型均转换为整数,然后,将杂凑值e的整数与横坐标x1的坐标值的整数相加后得到的结果模上基点的阶n完成模n运算,得到64字节签名结果的前32字节结果,签名结果的前32字节结果作为r值;
A45,判断是否存在r=0且r+k=n,如果是,则返回A42;如果否,则计算签名结果的后32字节s值;
A46,所述r值乘以函数形参中的私钥,结果为t1;私钥加1后进行逆运算得到逆结果t2;t2×(k+t1)得到的结果模上基点的阶n完成模n运算,得到的结果为s值;
A47,判断所述s值是否符合s=0,如果是,则返回A42;如果否,则输出64字节的签名结果M,所述M为r、s的组合。
更优选地,A5中验证接收到的数据上的签名是否合法,具体为:
A51,获取函数形参的签名结果,签名结果前32字节作为r′值,签名结果后32字节作为s′值,判断所述r′值是否在[0,n-1]范围内,如果是,则进入A52;如果否,则验签失败;
A52,判断签名中携带的s′值是否在[0,n-1]范围内,如果是,使用杂凑算法计算接收到数据的杂凑值e′,计算r′+s′之和模上基点的阶n完成模n运算,得到的结果为t,判断所述t是否符合t=0,如果是,则验签失败;如果否,则进入S53;
A53,在初始化后的椭圆曲线的基础上,计算椭圆曲线点(x1′,y1′),所述(x1′,y1′)的运算公式为:(x1′,y1′)=[s′]G+[t]PA,PA为与私钥w对应的公钥W,所述私钥w为输出被验证输入消息设备中的私钥;
A54,将杂凑值e′与点横坐标x1′坐标值的数据类型均转换为整数后,计算R值,所述R值为杂凑值e′的整数与点横坐标x1′的坐标值整数之和模上基点的阶n完成模n运算后得到的结果;
A55,判断所述R值与所述r′值是否相等,如果是,验证通过;如果否,则验签失败。
优选地,所述SM3算法软件程序为SM3杂凑算法,具体为:
B1,初始化与SM3杂凑算法相关的环境数据;
B2,对输入消息按照64字节分组迭代压缩,并累加输入消息的长度,不足64字节的输入消息,则不参与压缩,先缓存在SM3的环境中,与下一条输入消息合并成64字节后,再进入B3;
B3,将累加得到的消息总长度与缓存的消息依据填充规则填充数据;对填充后的数据进行迭代压缩,输出的压缩结果,所述压缩结果即为所述输入消息的杂凑值,所述杂凑值的长度为32字节。
优选地,所述SM4算法软件程序为SM4加解密算法,具体为:
C1,查S盒
依据输入的字节数据,从S盒数据表中查找对应的元素值;
C2,密钥扩展
将输入的16字节的密钥,扩展为128字节字密钥,如果扩展口的密钥用于解密操作,则要再将密钥逆序存储,然后在进行32轮非线性迭代数据,在32轮非线性迭代数据时,每轮依次使用扩展后的4字节密钥,参与运算;
C3,非线性迭代数据
将输入的数据,按16字节分组,每组数据进行32轮非线性迭代,将迭代结果由小端模式转换大端模式,则为加密或解密结果。
本发明的有益效果是:本发明所述方法使在无法增加国密芯片的旧版机器也可以使用国密算法。本发明所述方法实现了在国密芯片无法使用时,保证能够POS机信息传输过程中正常使用国密算法。其中SM2算法使用了开源库openssl中成熟的椭圆曲线算法,来提升SM2软件算法健壮性。
附图说明
图1是初始化时探测能否使用国密芯片过程;
图2是国密服务接口流程;
图3是初始化用sm2计算的环境过程;
图4是生成SM2的公私钥对过程;
图5是计算用户与消息杂凑值过程;
图6是SM2签名过程;
图7是SM2验签过程;
图8是SM3函数流程;
图9是sm3_starts流程;
图10是sm3_update流程;
图11是SM3压缩算法sm3_process流程;
图12是sm3_finish流程;
图13是SM4加解密服务函数流程;
图14是SM4查S盒示意图;
图15是SM4密钥扩展示意图;
图16是SM4非线性迭代数据的示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施方式仅仅用以解释本发明,并不用于限定本发明。
实施例:参照图1,本实施例所述实现国密算法的方法,所述方法包括:
S1,判断POS机中是否安装国密芯片,如果是,则进入S2;如果否,则进入S4;
S2,判断国密芯片和/或通信通道是否被攻击,如果是,则进入S4;如果否,则进入S3;
S3,设置国密芯片可使用标识,使用国密芯片实现国密算法的使用;
S4,设置国密芯片不可使用标识,同时,调用国密软件程序实现国密算法的使用;所述国密软件程序为SM2算法软件程序、SM3算法软件程序或SM4算法软件程序更详细的解释说明为:
(一)步骤S1具体按照下述实现:通过ADC采集POS机MCU硬件引脚的ADC值,然后根据调用的module_is_exist函数,在预先设置的ADC值表中查询采集到的ADC值与表中的ADC值是否匹配,如果是,则POS机上安装国密芯片;如果否,则POS机上未安装国密芯片。
(二)参照图2,步骤S3中,使用国密芯片实现国密算法的使用过程中还包括以下步骤,具体按照下述实现:MCU发送数据包后,判断MCU是否在预定的超时时间内收到国密芯片返回的运算结果,如果是,则继续使用国密芯片保护数据传输安全;如果否,则所述国密芯片工作不正常,通讯失败,进入S4。
附图1中触发,表示机器侦测到攻击,机器处理不安全状态。
(三)SM2/SM3/SM4算法为国家密码局公布的国密算法,所以在国密芯片不可使用时,可以通过软件实现SM2/SM3/SM4算法,提供相关的国密算法服务。而本申请使用的SM2/SM3/SM4算法不是依托于独立SM2/SM3/SM4算法芯片即国密芯片使用,本申请中所述SM2/SM3/SM4算法编写在适用于POS机使用的国密芯片判断程序内,其中,SM2使用了开源库openssl中成熟的椭圆曲线算法,提升SM2算法软件代码的效率与健壮性。以下是C语言具体实现描述及示意图。
所述国密软件程序为SM2算法软件程序,具体按照下述步骤实现:
A1,初始化
参照图3,首先申请分配用于椭圆曲线算法的内存空间,并初始化为素域椭圆曲线的仿射坐标表示形式;使用在仿射坐标系下简化的椭圆曲线方程:y2=x3+ax+b;接着申请并初始化用于大数算法的内存空间;两个内存空间都是用于保存SM2工作环境;两个内存空间的地址保存在全局变量中,不释放;
然后,使用SM2算法推荐的椭圆曲线参数:域规模q、第一参数a、第二参数b、基点G的坐标及其点的阶n,进一步初始化SM2的工作环境;
最后,预存乘法结果,所述乘法结果用于加速后续使用的点的乘法;
为了提升SM2的算法速度,在系统初始化时,先把SM2椭圆曲线系统参数先初始化好,保存在全局变量中。同时利用开源库openssl中椭圆曲线特性,预存一些乘法结果,用于后续SM2使用乘法时可以加速。
SM2算法的工作环境,保存于struct sm2_context sm2_ctx的结构体中,BN_CTX与EC_GROUP为openssl中的结构体。
在初始化时,使用到openssl的函数如下:
BN_CTX*BN_CTX_new(void);
EC_GROUP*EC_GROUP_new(const EC_METHOD*meth);
const EC_METHOD*EC_GFp_mont_method(void);
int EC_GROUP_get_curve_GFp(const EC_GROUP*group,BIGNUM*p,BIGNUM*a,BIGNUM*b,BN_CTX*ctx);
int EC_GROUP_set_generator(EC_GROUP*group,const EC_POINT*generator,const BIGNUM*order,const BIGNUM*cofactor);
int EC_GROUP_precompute_mult(EC_GROUP*group,BN_CTX*ctx);
A2,生成公私钥对
参照图4,首先,调用MCU的硬件随机函数,产生32字节随机数的私钥;利用A1中已初始化的椭圆曲线,计算与所述私钥对应的公钥;然后,检验公私钥是否有效,如果是,则清除缓存的公私钥,并返回公私钥生成成功的消息;如果否,则清除缓存的密钥对,并返回密钥对生成不成功;
生成公私钥对时,为了保证SM2的生成密钥的随机性,get_rnd使用的是CPU内部的真随机数产生器,而不是调用系统的随机函数。使用到openssl的函数如下:
int EC_POINT_mul(const EC_GROUP*group,EC_POINT*r,const BIGNUM*n,constEC_POINT*q,const BIGNUM*m,BN_CTX*ctx);
int EC_KEY_set_group(EC_KEY*key,const EC_GROUP*group);
int EC_KEY_set_private_key(EC_KEY*key,const BIGNUM*priv_key);
int EC_KEY_set_public_key(EC_KEY*key,const EC_POINT*pub_key);
int EC_KEY_check_key(const EC_KEY*eckey);
A3,计算用户与消息的杂凑值
参照图5,在用户信息ID、用户信息长度、初始化后的椭圆曲线的第一参数a、第二参数b、公钥与用户输入的消息的基础上,使用杂凑算法,计算并得到用于与消息的杂凑值;
依据SM2数据签名算法规则,需要将用户信息(id)、用户信息长度(id_len)、SM2参数a与b、基点G、公钥与消息一起计算杂凑值,这里使用的是SM3杂凑算法。提供服务的函数原型:
static int sm2_calculate_e(unsigned char*id,unsigned int id_len,unsigned char*publicKey,unsigned char*msg,unsigned int msg_len,unsigned char*e)
使用到sm3函数为软件实现,函数如下,详见后面SM3的描述。
void sm3_starts(sm3_context*ctx);
void sm3_update(sm3_context*ctx,unsigned char*input,unsigned intlen);
void sm3_finish(sm3_context*ctx,unsigned char output[32]);
A4,对用户数据进行签名;
参照图6,依据SM2数据签名算法规则,实现SM2签名的具体流程,提供服务的函数原型:
int sm2_sign(unsigned char*id,int idlen,const unsigned char*pubkey,unsigned char*prikey,unsigned char*msg,int msg_len,unsigned char*sign);
使用到openssl的函数如下:
#define BN_is_zero(a)((a)->top==0)
#define BN_is_negative(a)((a)->neg!=0)
int BN_ucmp(const BIGNUM*a,const BIGNUM*b);
int EC_POINT_mul(const EC_GROUP*group,EC_POINT*r,const BIGNUM*g_scalar,const EC_POINT*point,const BIGNUM*p_scalar,BN_CTX*ctx);
int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP*group,constEC_POINT*point,BIGNUM*x,BIGNUM*y,BN_CTX*ctx);
int EC_GROUP_get_order(const EC_GROUP*group,BIGNUM*order,BN_CTX*ctx);
int BN_mod_add_quick(BIGNUM*r,const BIGNUM*a,const BIGNUM*b,constBIGNUM*m);
int BN_add(BIGNUM*r,const BIGNUM*a,const BIGNUM*b);
int BN_mod_sub_quick(BIGNUM*r,const BIGNUM*a,const BIGNUM*b,constBIGNUM*m);
BIGNUM*BN_mod_inverse(BIGNUM*in,const BIGNUM*a,const BIGNUM*n,BN_CTX*ctx);
int BN_mod_mul(BIGNUM*r,const BIGNUM*a,const BIGNUM*b,const BIGNUM*m,BN_CTX*ctx);
A5,验证接收到的数据上的签名是否合法;
参照图7,依据SM2数据签名算法规则实现,SM2验签具体流程,提供服务的函数原型:int sm2_verify(unsigned char*id,int idlen,const unsigned char*pubkey,unsigned char*sign,unsigned char*msg,int msglen)
使用到openssl的函数如下:
BIGNUM*BN_bin2bn(const unsigned char*s,int len,BIGNUM*ret)
#define BN_is_zero(a)((a)->top==0)
#define BN_is_negative(a)((a)->neg!=0)
int BN_ucmp(const BIGNUM*a,const BIGNUM*b);
int BN_mod_add_quick(BIGNUM*r,const BIGNUM*a,const BIGNUM*b,constBIGNUM*m);
int EC_POINT_mul(const EC_GROUP*group,EC_POINT*r,const BIGNUM*g_scalar,const EC_POINT*point,const BIGNUM*p_scalar,BN_CTX*ctx);
int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP*group,constEC_POINT*point,BIGNUM*x,BIGNUM*y,BN_CTX*ctx);
(3.1)A4中,对用户数据进行签名,具体按照下述步骤实现:
A41,依据用户信息与用于签名的消息,计算杂凑值e,
A42,调用MCU的硬件随机函数,生成32字节的随机数k;判断k是否符合0≤k≤n;如果是,则返回A41;如果否,则进入A43;
A43,利用A1中已初始化的椭圆曲线,计算椭圆曲线上获得随机数k与基点G的乘积结果所对应的点(x1,y1),将x1的数据类型转换为整数;
A44,将所述杂凑值e和点的横坐标x1的数据类型均转换为整数,然后,将杂凑值e与x坐标值相加后得到的结果模上基点的阶n完成模n运算,得到64字节的签名结果的前32字节结果,签名结果的前32字节结果作为r值;
A45,判断是否存在r=0且r+k=n,如果是,则返回A42;如果否,则计算签名结果的后32字节s值;
A46,所述r值乘以函数形参中的私钥,结果为t1;进行逆运算得到逆结果t2;t2×(k+t1)得到的结果模上基点的阶n完成模n运算,得到的结果为s值;
A47,判断所述s值是否符合s=0,如果是,则返回A42;如果否,则输出64字节的签名结果M,所述M为r、s的组合。
(3.2)A5中验证接收到的数据上的签名是否合法,具体为:
A51,获取函数形参的签名结果,签名结果前32字节作为r′值,签名结果后32字节作为s′值,判断所述r′值是否在[0,n-1]范围内,如果是,则进入A52;如果否,则验签失败;
A52,判断签名中携带的s′值是否在[0,n-1]范围内,如果是,使用杂凑算法计算接收到数据的杂凑值e′,计算r′+s′之和模上基点的阶n完成模n运算,得到的结果为t,判断所述t是否符合t=0,如果是,则验签失败;如果否,则进入S53;
A53,在初始化后的椭圆曲线的基础上,计算椭圆曲线点(x1′,y1′),所述(x1′,y1′)的运算公式为:(x1′,y1′)=[s′]G+[t]PA;PA为与私钥w对应的公钥W,所述私钥w为输出被验证输入消息设备中的私钥,即为签名函数sm2_sign中输入的形参pubkey;
A54,将杂凑值e′与点横坐标x1′的数据类型转换为整数后,计算R值,所述R值为杂凑值e′与点横坐标x1′之和模上基点的阶n完成模n运算后得到的结果,
A55,判断所述R值与所述r′值是否相等,如果是,验证通过;如果否,则验签失败。
(四)所述SM3算法软件程序为SM3杂凑算法,具体为:
B1,初始化与SM3杂凑算法相关的环境数据;
B2,对输入消息按照64字节分组迭代压缩,并累加输入消息的长度,不足64字节的输入消息,则不参与压缩,先缓存在SM3的环境中,与下一条输入消息合并成64字节后,再进入B3;
步骤B2,对应sm3_update函数,每次调用此函数,SM3环境数据中的长度变量,会加上输入消息的长度,也就是统计输入消息长度。不是保存输入消息长度,最后才将所有消息长度相加,得到总消息长度。
然后sm3_update函数内部,会将输入消息,以64字节为单位,迭代压缩数据。不足64字节的,先缓存,在下次调用sm3_update或sm3_finish才使用。如果是调用sm3_update函数,则缓存数据与输入消息拼接起来,再进行压缩。如果是调用sm3_finish,则B3动作
B3,将累加得到的消息总长度与缓存的消息依据填充规则填充数据;对填充后的数据进行迭代压缩,输出的压缩结果,所述压缩结果即为所述输入消息的杂凑值,所述杂凑值的长度为32字节。
SM3算法,需要填充输入的数据,使用数据长度为64字节的整数倍,填充后的数据以64字节为一组,迭代压缩,最后的压缩结果,就是杂凑值,其长度为32字节。SM3算法中为了节省内存,同时方便使用,在输出杂凑值前,才对完成数据填充。
提供的服务函数原型为int sm3(unsigned char*input,unsigned int input_len,unsigned char*output);其流程图见图8。
从图8知,sm3函数分为三个子功能函数完成杂凑值的计算,分别是:
a.初始化SM3相关的环境数据,函数原型为void sm3_starts(sm3_context*ctx);其流程图见图9。
b.数据以64字节为一组,迭代压缩不足64字节的数据,缓存起来,与下次调用时的数据拼到一起,凑足64字节,再压缩;
函数原型为void sm3_update(sm3_context*ctx,unsigned char*input,unsigned int len);其流程图见图10。
c.对缓存的数据,进行填充到,再压缩,输出最后的结果。
函数原型为void sm3_finish(sm3_context*ctx,unsigned char output[32]);其流程图见图12。
按SM3杂凑算法的规则,可对长度小于264比特的消息,生成杂凑值。为了方便SM2中计算用户与消息的杂凑值,SM3杂凑值计算要支持分段输入消息。也就是sm3_start调用一次后,sm3_update可以连续被调用多次,分别输入一段不同长度的消息,甚至只输入一个字节的消息,消息输入完成后,最后调用sm3_finish时获取杂凑值,无需要将所有消息都拷贝到一个消息缓存里,再调用sm3获取杂凑值。
图8中结构体sm3_context的结构体如下,用于保存sm3函数的工作环境,另函数sm3支持重入。
图10与图12都有以64字节为单位,对数据进行迭代压缩的功能。有必要将64字的压缩功能封装成一个函数,方便SM3杂凑功能实现。64字节的压缩函数原型为:static voidsm3_process(sm3_context*ctx,unsigned char data[64]),其流程图为图11。因为SM3的算法规则中,数据是以大端存储的,而我们使用的平台的CPU,是小端形式的,所以在压缩前,先把数据转为小端形式,保存到字变量中。图11中使用了如下的宏。
#define SHL(x,n)(((x)&0xFFFFFFFF)<<n)/*左移*/
#define ROTL(x,n)(SHL((x),n)|((x)>>(32-n)))/*循环左移*/
#define FF0(x,y,z)((x)^(y)^(z))/*布尔函数:FFj(x,y,z)=x^y^z j为[0,15]的范围*/
#define FF1(x,y,z)(((x)&(y))|((x)&(z))|((y)&(z)))/*布尔函数:FFj(x,y,z)=(x&y)|(x&z)|(y&z)j为[16,63]的范围*/
#define GG0(x,y,z)((x)^(y)^(z))/*布尔函数:GGj(x,y,z)=(x,y,z)=x^y^zj为[0,15]的范围*/
#define GG1(x,y,z)(((x)&(y))|((~(x))&(z)))/*布尔函数:GGj(x,y,z)=(x&y)|(~x&z)j为[16,63]的范围*/
#define P0(x)((x)^ROTL((x),9)^ROTL((x),17))/*置换函数:P0(x)=x^(x<<<9)^(x<<<17)其中<<<表示循环左移*/
#define P1(x)((x)^ROTL((x),15)^ROTL((x),23))/*置换函数:P1(x)=x^(x<<<15)^(x<<<23)其中<<<表示循环左移*/
(五)所述SM4算法软件程序为SM4加解密算法,具体为:
C1,查S盒
依据输入的字节数据,从S盒数据表中查找对应的元素值;
C2,密钥扩展
将输入的16字节的密钥,扩展为128字节字密钥,如果扩展口的密钥用于解密操作,则要再将密钥逆序存储,然后在进行32轮非线性迭代数据,在32轮非线性迭代数据时,每轮依次使用扩展后的4字节密钥,参与运算;128字节字密钥即为32字密钥,32字密钥中每字有4字节数据,进行32轮非线性迭代数据时,第一轮非线性迭代,使用第一个字密钥;第二轮非线性迭代,使用第二个字密钥,……,第三十二轮非线性迭代,使用第三十二个字密钥。
C3,非线性迭代数据:将输入的数据,按16字节分组,每组数据进行32轮非线性迭代,将迭代结果由小端模式转换大端模式,则为加密或解密结果。
同样为SM4算法设计一个结构体,用于保存SM4算法的环境。该结构体为:
struct sm4_context{
unsigned long sk[32];/*用于保存轮密钥*/
};
SM4加解密提供的服务的函数接口如下:
int sm4(unsigned char*input,unsigned int input_len,unsigned char*output,unsigned char*smkey,int mode)
该函数流程图如图13。其中密钥逆序,是指struct sm4_context中的sk内容,第1与第32内容互换,第2与第31内容互换……,程序如下实现:
int i;unsigned long t;
for(i=0;i<32;i++){t=ctx->sk[i];ctx->sk[i]=ctx->sk[i];ctx->sk[i]=t;}
SM4属于对称加密算法,采用32轮非线性迭代结构。可以大致分为两个步骤:一、密钥扩展。二、以16字节数据为一组,进行非线性迭代数据。在程序上,分解为三个子函数去实现SM4加解密功能。分别是:查S盒、密钥扩展、非线性迭代数据。
密钥扩展与非线性迭代数据都使用到了非线性变换,主要是通过查S盒实现的,因此单独提供一个查S盒的函数接口:unsigned char sm4Sbox(unsigned char inch)。其流程图如图14。依据inch的数值,从S盒数据表中取出对应的元素值。
密钥扩展,是将输入的16字节的密钥,按一定规则,扩展为32字节密钥,在32轮非线性迭代数据时,每轮使用一个扩展后的密钥,参与运算。提供的密钥扩展函数接口为:void sm4_setkey(unsigned long SK[32],unsigned char key[16]),其流程图如图15。图中ROTL表示32比特循环左移,与SM3算法中的ROTL一样使用宏实现。
非线性迭代数据,是使用扩展后的密钥,按迭代规则,对数据进行变换操作。提供服务的函数接口为:void sm4_one_round(unsigned long sk[32],unsigned char input[16],unsigned char output[16]),其流程图如图16。
通过采用本发明公开的上述技术方案,得到了如下有益的效果:本发明所述方法使在无法增加国密芯片的旧版机器也可以使用国密算法。本发明所述方法在国密芯片无法使用时,保证能够POS机信息传输过程中正常使用国密算法。其中SM2算法使用了开源库openssl中成熟的椭圆曲线算法,来提升SM2软件算法健壮性。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视本发明的保护范围。
Claims (8)
1.一种实现国密算法的方法,其特征在于,所述方法包括:
S1,判断POS机中是否安装国密芯片,如果是,则进入S2;如果否,则进入S4;
S2,判断国密芯片和/或通信通道是否被攻击,如果是,则进入S4;如果否,则进入S3;
S3,设置国密芯片可使用标识,使用国密芯片实现国密算法的使用;
S4,设置国密芯片不可使用标识,同时,调用国密软件程序实现国密算法的使用;所述国密软件程序为SM2算法软件程序、SM3算法软件程序或SM4算法软件程序。
2.根据权利要求1所述方法,其特征在于,步骤S1具体按照下述实现:
通过ADC采集POS机MCU硬件引脚的ADC值,然后根据调用的module_is_exist函数,在预先设置的ADC值表中查询采集到的ADC值与ADC值表中的ADC值是否匹配,如果是,则POS机上已安装国密芯片;如果否,则POS机上未安装国密芯片。
3.根据权利要求1所述方法,其特征在于,步骤S3中,使用国密芯片实现国密算法的使用过程中还包括以下步骤,具体按照下述实现:
MCU发送数据包后,判断MCU是否在预定的超时时间内收到国密芯片返回的运算结果,如果是,则继续使用国密芯片保护数据传输安全;如果否,则所述国密芯片工作不正常,通讯失败,进入S4。
4.根据权利要求1所述方法,其特征在于,所述国密软件程序为SM2算法软件程序,具体按照下述步骤实现:
A1,初始化
首先申请分配用于椭圆曲线算法的内存空间,并初始化为素域椭圆曲线的仿射坐标表示形式;使用在仿射坐标系下简化的椭圆曲线方程:y2=x3+ax+b;接着申请并初始化用于大数算法的内存空间;两个内存空间用于保存SM2算法的工作环境;两个内存空间的地址保存在全局变量中,不释放;
然后,使用SM2算法推荐的椭圆曲线参数:域规模q、第一参数a、第二参数b、基点G的坐标及其点的阶n,进一步初始化SM2算法的工作环境,
最后,预存乘法结果,所述乘法结果用于加速后续使用的点的乘法;
A2,生成公私钥对
首先,调用MCU的硬件随机函数,产生32字节随机数的私钥;利用A1中已初始化的椭圆曲线,计算与所述私钥对应的公钥;
然后,检验公私钥是否有效,如果是,则清除缓存的公私钥,并返回公私钥生成成功的消息;如果否,则清除缓存的密钥对,并返回公私钥生成不成功;
A3,计算用户与消息的杂凑值
在用户信息ID、用户信息长度、初始化后的椭圆曲线的第一参数a、第二参数b、公钥与用户输入的消息的基础上,使用杂凑算法,计算并得到用户与消息的杂凑值;
A4,对用户数据进行签名;
A5,验证接收到的数据上的签名是否合法。
5.根据权利要求4所述方法,其特征在于,A4中,对用户数据进行签名,具体按照下述步骤实现:
A41,依据用户信息与用于签名的消息,计算杂凑值e,
A42,调用MCU的硬件随机函数,生成32字节的随机数k;判断k是否符合0≤k≤n;如果是,则返回A41;如果否,则进入A43;
A43,利用A1中已初始化的椭圆曲线,计算椭圆曲线上获得随机数k与基点G的乘积结果所对应的点(x1,y1);
A44,将所述杂凑值e和点的横坐标x1的数据类型均转换为整数,然后,将杂凑值e的整数与横坐标x1的坐标值的整数相加后得到的结果模上基点的阶n完成模n运算,得到64字节签名结果的前32字节结果,签名结果的前32字节结果作为r值;
A45,判断是否存在r=0且r+k=n,如果是,则返回A42;如果否,则计算签名结果的后32字节s值;
A46,所述r值乘以函数形参中的私钥,结果为t1;私钥加1后进行逆运算得到逆结果t2;t2×(k+t1)得到的结果模上基点的阶n完成模n运算,得到的结果为s值;
A47,判断所述s值是否符合s=0,如果是,则返回A42;如果否,则输出64字节的签名结果M,所述M为r、s的组合。
6.根据权利要求4所述方法,其特征在于,A5中验证接收到的数据上的签名是否合法,具体为:
A51,获取函数形参的签名结果,签名结果前32字节作为r′值,签名结果后32字节作为s′值,判断所述r′值是否在[0,n-1]范围内,如果是,则进入A52;如果否,则验签失败;
A52,判断签名中携带的s′值是否在[0,n-1]范围内,如果是,使用杂凑算法计算接收到数据的杂凑值e′,计算r′+s′之和模上基点的阶n完成模n运算,得到的结果为t,判断所述t是否符合t=0,如果是,则验签失败;如果否,则进入S53;
A53,在初始化后的椭圆曲线的基础上,计算椭圆曲线点(x1′,y1′),所述(x1′,y1′)的运算公式为:(x1′,y1′)=[s′]G+[t]PA,PA为与私钥w对应的公钥W,所述私钥w为输出被验证输入消息设备中的私钥;
A54,将杂凑值e′与点横坐标x1′坐标值的数据类型均转换为整数后,计算R值,所述R值为杂凑值e′的整数与点横坐标x1′的坐标值整数之和模上基点的阶n完成模n运算后得到的结果;
A55,判断所述R值与所述r′值是否相等,如果是,验证通过;如果否,则验签失败。
7.根据权利要求1所述方法,其特征在于,所述SM3算法软件程序为SM3杂凑算法,具体为:
B1,初始化与SM3杂凑算法相关的环境数据;
B2,对输入消息按照64字节分组迭代压缩,并累加输入消息的长度,不足64字节的输入消息,则不参与压缩,先缓存在SM3的环境中,与下一条输入消息合并成64字节后,再进入B3;
B3,将累加得到的消息总长度与缓存的消息依据填充规则填充数据;对填充后的数据进行迭代压缩,输出的压缩结果,所述压缩结果即为所述输入消息的杂凑值,所述杂凑值的长度为32字节。
8.根据权利要求1所述方法,其特征在于,所述SM4算法软件程序为SM4加解密算法,具体为:
C1,查S盒
依据输入的字节数据,从S盒数据表中查找对应的元素值;
C2,密钥扩展
将输入的16字节的密钥,扩展为128字节字密钥,如果扩展口的密钥用于解密操作,则要再将密钥逆序存储,然后在进行32轮非线性迭代数据,在32轮非线性迭代数据时,每轮依次使用扩展后的4字节密钥,参与运算;
C3,非线性迭代数据
将输入的数据,按16字节分组,每组数据进行32轮非线性迭代,将迭代结果由小端模式转换大端模式,则为加密或解密结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611206829.2A CN106411498B (zh) | 2016-12-23 | 2016-12-23 | 一种实现国密算法的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611206829.2A CN106411498B (zh) | 2016-12-23 | 2016-12-23 | 一种实现国密算法的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106411498A CN106411498A (zh) | 2017-02-15 |
CN106411498B true CN106411498B (zh) | 2019-07-30 |
Family
ID=58087734
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611206829.2A Active CN106411498B (zh) | 2016-12-23 | 2016-12-23 | 一种实现国密算法的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106411498B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109933304B (zh) * | 2019-03-20 | 2022-06-21 | 成都三零嘉微电子有限公司 | 适用于国密sm2p256v1算法的快速蒙哥马利模乘器运算优化方法 |
CN110733535B (zh) * | 2019-09-29 | 2021-08-03 | 卡斯柯信号有限公司 | 基于国产加密技术的轨道交通信号系统的运行及恢复方法 |
CN111555881A (zh) * | 2020-03-23 | 2020-08-18 | 中安云科科技发展(山东)有限公司 | 使用sdf、skf实现国密ssl协议的方法及系统 |
CN111865559B (zh) * | 2020-06-16 | 2022-02-18 | 郑州信大捷安信息技术股份有限公司 | 一种sm4算法快速实现方法及装置 |
CN113922960B (zh) * | 2020-07-08 | 2023-10-24 | 神州融安数字科技(北京)有限公司 | 一种基于sm2的psi获取方法、装置及系统 |
CN112865969A (zh) * | 2021-02-07 | 2021-05-28 | 广东工业大学 | 一种数据加密卡的加密方法及装置 |
CN114629622B (zh) * | 2022-02-22 | 2023-03-24 | 广东省绿算技术有限公司 | 基于fpga的国密算法加速运算控制方法及装置 |
CN114915405B (zh) * | 2022-07-15 | 2022-11-11 | 麒麟软件有限公司 | 一种基于OpenSSL的国密算法硬件加速方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2005117527A2 (en) * | 2004-06-02 | 2005-12-15 | Brian Abram | An electronic device to secure authentication to the owner and methods of implementing a global system for highly secured authentication |
CN101924765A (zh) * | 2010-08-20 | 2010-12-22 | 河南省电力公司 | 一种单系统单网络计算机通讯方法 |
CN102074274A (zh) * | 2010-11-04 | 2011-05-25 | 北京曙光天演信息技术有限公司 | 一种加密卡内加密芯片错误检测及自动复位的方法 |
CN102104864A (zh) * | 2009-12-22 | 2011-06-22 | 中兴通讯股份有限公司 | 一种实现终端锁网锁卡功能的方法及终端 |
CN104468125A (zh) * | 2014-12-24 | 2015-03-25 | 江西倍康信息技术有限公司 | 基于国密算法的移动互联网信息通信加密方法 |
-
2016
- 2016-12-23 CN CN201611206829.2A patent/CN106411498B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2005117527A2 (en) * | 2004-06-02 | 2005-12-15 | Brian Abram | An electronic device to secure authentication to the owner and methods of implementing a global system for highly secured authentication |
CN102104864A (zh) * | 2009-12-22 | 2011-06-22 | 中兴通讯股份有限公司 | 一种实现终端锁网锁卡功能的方法及终端 |
CN101924765A (zh) * | 2010-08-20 | 2010-12-22 | 河南省电力公司 | 一种单系统单网络计算机通讯方法 |
CN102074274A (zh) * | 2010-11-04 | 2011-05-25 | 北京曙光天演信息技术有限公司 | 一种加密卡内加密芯片错误检测及自动复位的方法 |
CN104468125A (zh) * | 2014-12-24 | 2015-03-25 | 江西倍康信息技术有限公司 | 基于国密算法的移动互联网信息通信加密方法 |
Also Published As
Publication number | Publication date |
---|---|
CN106411498A (zh) | 2017-02-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106411498B (zh) | 一种实现国密算法的方法 | |
US8712036B2 (en) | System for encrypting and decrypting a plaintext message with authentication | |
US7715553B2 (en) | Encrypting a plaintext message with authentication | |
CN108462686B (zh) | 动态密钥的获取方法、装置、终端设备及存储介质 | |
Kalenderi et al. | Breaking the GSM A5/1 cryptography algorithm with rainbow tables and high-end FPGAS | |
CN102904711B (zh) | 信息加密方法 | |
NZ277128A (en) | Public key encryption system and mixture generator | |
JP2008252299A (ja) | 暗号処理システム及び暗号処理方法 | |
CN110795762A (zh) | 基于流密码的保留格式加密方法 | |
CN108989309A (zh) | 基于窄带物联网的加密通信方法及其加密通信装置 | |
CN100583754C (zh) | 一种伪随机数生成方法 | |
CN112054896B (zh) | 白盒加密方法、装置、终端及存储介质 | |
He et al. | The keyed optical Hash function based on cascaded phase-truncated Fourier transforms | |
CN110855667A (zh) | 一种区块链加密方法、装置及系统 | |
CN114697095A (zh) | 一种混合加解密方法、系统、装置及介质 | |
US20060002550A1 (en) | Method and system for generation of cryptographic keys and the like | |
Jolfaei et al. | A lightweight integrity protection scheme for fast communications in smart grid | |
CN116248316A (zh) | 文件加密方法、文件解密方法、装置及存储介质 | |
CN110213292A (zh) | 数据发送方法及装置、数据接收方法及装置 | |
CN114205104A (zh) | 针对功率和电磁侧信道攻击的对认证标签计算的保护 | |
KR20150103394A (ko) | 암호화 시스템 및 그것의 암호 통신 방법 | |
Wang et al. | Adaptive RSA encryption algorithm for smart grid | |
Mantoro et al. | Improving the security guarantees, authenticity and confidentiality in short message service of mobile applications | |
CN114124354B (zh) | 确定性鉴别加解密装置及方法 | |
CN114710293B (zh) | 数字签名方法、装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |