一种椭圆曲线公钥的短汉字编码、解码方法转让专利

申请号 : CN201910067861.4

文献号 : CN109905241B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王斌顾小卓荆继武马原杨颖珊陈朝晖李彦初

申请人 : 中国科学院信息工程研究所

摘要 :

本发明公开了一种椭圆曲线公钥的短汉字编码、解码方法。本发明编码方法为:1)使用椭圆曲线上点压缩方法对公钥P进行压缩,得到压缩后的公钥P’;2)选取2k个汉字组成数组C,根据公钥P’的长度确定编码公钥P所需汉字个数n;3)设置一保留位OP,然后根据该公钥P’与该保留位OP生成一比特串M;4)将比特串M以每块k位按序拆分为n块,对于每一块中的k位比特串,将其转化为十进制数i,取出数组C中第i个字符C[i]表示该块数据,于是依次将代表n块数据的n个字符拼接后形成新的字符串S;5)用该字符串S表示该公钥P。本发明公开的方法使得公钥信息可以以短汉字文本的形式方便地传递,为使用公钥密码保密通信奠定基础。

权利要求 :

1.一种椭圆曲线公钥的短汉字编码方法,其步骤包括:

1)使用椭圆曲线上点压缩方法对公钥P进行压缩,得到压缩后的公钥P’;其中公钥P为椭圆曲线上坐标点P的坐标;

2)选取2k个汉字组成数组C,用C[i]表示数组C中的第i个字符;k为一个汉字字符可表示的二进制位数;根据公钥P’的长度确定编码公钥P所需汉字个数n;

3)设置一保留位OP,然后根据该公钥P’与该保留位OP生成一比特串M;

4)将比特串M以每块k位的方式按序拆分为n块,对于每一块中的k位比特串,将其转化为十进制数i,取出数组C中第i个字符C[i]表示该块数据,于是依次将代表n块数据的n个字符拼接后形成新的字符串S;

5)用该字符串S表示该公钥P。

2.如权利要求1所述的方法,其特征在于,k取值为13,即选取8192个汉字组成数组C,n取值为20。

3.如权利要求2所述的方法,其特征在于,从《全国信息技术标准化技术委员会汉字内码扩展规范(GBK)》中选取8192个无重复汉字作为数组C。

4.如权利要求1所述的方法,其特征在于,所述公钥P’为公钥P的x坐标和1比特的y坐标标识位,yp’为yp的最右侧一个比特,yp为公钥P的y坐标。

5.如权利要求1或2所述的方法,其特征在于,所述保留位OP的长度为n个汉字可表示的比特长度减去公钥P’的比特长度;保留位OP用以表示编码标记。

6.如权利要求5所述的方法,其特征在于,所述比特串M=OP||yp’||xp,其中“||”表示拼接,xp为公钥P的x坐标,yp’为公钥P的1比特的y坐标标识位,yp’为yp的最右侧一个比特,yp为公钥P的y坐标。

7.一种对权利要求1所述方法得到的公钥编码进行解码的方法,其步骤包括:

1)对字符串S中的每个字符,在数组C中找到其位置i,将十进制的i表示为二进制比特串,若不足k位则采用高位补0的方式填充为k位;

2)将转换后的n个k位比特串按序拼接,得到一比特串M;

3)根据公钥P的短汉字编码过程中该比特串的生成规则,从该比特串M中提取保留位OP、公钥P的1比特的y坐标标识位yp’以及公钥P的x坐标xp;其中yp’为yp的最右侧一个比特,yp为公钥P的y坐标;

4)计算域元素α=(xp3+axp+b)mod p,计算αmod p的平方根β,若β的最右边比特等于yp’,则置yp=β,否则置yp=p-β;其中,a、b为椭圆曲线方程y2=x3+ax+b中的系数,公钥P为该椭圆曲线方程y2=x3+ax+b中的一点坐标;Fq为用于生成该公钥P的有限域,q=p且p为大于3的素数;

5)根据解码出的xp、yp得到公钥P。

说明书 :

一种椭圆曲线公钥的短汉字编码、解码方法

技术领域

[0001] 本发明属于密码技术领域,尤其涉及一种应用于椭圆曲线密码算法中公钥的短汉字编码、解码方法。

背景技术

[0002] 基于公钥密码学的加解密技术应用广泛,成为保证信息安全的重要工具,尤其是在数据加密、数字签名等方面发挥着巨大的作用。公钥密码算法中有一对公私钥,私钥应被保密存储,而公钥应该被公开。在实际的情境中,在使用公钥密码算法时,使用合适的方式来公开自己的公钥是必要的一步。对普通大众来说,使用公钥加密算法可以实现自己与他人之间的数据加密传输,而将自己的公钥便利地分享给他人并有效的管理、使用公钥仍是一个障碍。
[0003] 椭圆曲线密码算法是一种公钥加密算法,也称非对称加密算法。公钥加密算法含有两个密钥:公钥密码(简称公钥)和私有密钥(简称私钥),用户同时拥有私钥和公钥这一对密钥,其实私钥为自己保存不可公开,公钥可被公开被任何人使用。
[0004] 公钥加密算法一般用于加密与数字签名等方面。用户A拥有其私钥与公钥,并将公钥公开给用户B:在用于加密时,用户B将要传递的消息使用A的公钥加密后传递给A,被加密后的消息只能由拥有私钥的用户A来解密;在用于数字签名时,用户A将待签名的消息使用自己的私钥计算出数字签名,将消息与数字签名一并发送给用户B,用户B可用A的公钥来鉴别该消息是否真的来自于A。
[0005] 公钥加密体系中,双方无需使用私密信道来传递任何秘密信息,只需将一方的公钥以任何公开的形式传递给对方,双方即可进行加密通信。
[0006] SM2算法是中国的标准商用密码算法,属于椭圆曲线算法,在密码产品中被广泛的支持和使用。SM2圆曲线算法的具体细节参考GM/T 0003-2012《SM2椭圆曲线公钥密码算法》。为了本专利描述的方便,将SM2算法的密钥对的生成简要描述如下:
[0007] SM2曲线参数:
[0008] 椭圆曲线E是定义在有限域Fq上的椭圆曲线,G是椭圆曲线E上n阶的基点,椭圆曲线方程为y2=x3+ax+b,其中a和b为常数。
[0009] SM2密钥对生成:
[0010] 输入一个有效的有限域Fq(q=p且p为大于3的素数,或q=2m)上的椭圆曲线参数的集合。
[0011] 输出与椭圆曲线系统参数相关的一个密钥对(d,P)。
[0012] 具体计算步骤为:
[0013] a)用随机数发生器产生整数d∈[1,n-2];
[0014] b)G为基点,计算点P=(xp,yp)=[d]*G,“*”表示点乘运算,即计算椭圆曲线上点G的k倍点;
[0015] c)密钥对是(d,P),其中d为私钥,P为公钥。
[0016] 在SM2算法中,公钥为点P的坐标,共512比特,考虑以文本的形式表示公钥数据,使用常规的十六进制表示法,需要128字符,若使用这样长度的文本为载体来传递公钥,会给用户带来很大的不便利性。

发明内容

[0017] 针对现有技术中存在的技术问题,本发明的目的在于提供一种椭圆曲线公钥的短汉字编码、解码方法,以使得通信双方或多方能以简单的方式向对方分享自身的公钥同时有效地管理他人的公钥,为使用公钥密码算法进行后续的保密通信奠定基础。
[0018] 本发明的技术方案为:
[0019] 一种椭圆曲线公钥的短汉字编码方法,其步骤包括:
[0020] 1)使用椭圆曲线上点压缩方法对公钥P进行压缩,得到压缩后的公钥P’;其中公钥P为椭圆曲线上坐标点P的坐标;
[0021] 2)选取2k个汉字组成数组C,用C[i]表示数组C中的第i个字符;k为一个汉字字符可表示的二进制位数;根据公钥P’的长度确定编码公钥P所需汉字个数n;
[0022] 3)设置一保留位OP,然后根据该公钥P’与该保留位OP生成一比特串M;
[0023] 4)将比特串M以每块k位的方式按序拆分为n块,对于每一块中的k位比特串,将其转化为十进制数i,取出数组C中第i个字符C[i]表示该块数据,于是依次将代表n块数据的n个字符拼接后形成新的字符串S;
[0024] 5)用该字符串S表示该公钥P。
[0025] 进一步的,k取值为13,即选取8192个汉字组成数组C,n取值为20。
[0026] 进一步的,从《全国信息技术标准化技术委员会汉字内码扩展规范(GBK)》中选取8192个无重复汉字作为字符集。
[0027] 进一步的,所述公钥P’为公钥P的x坐标和1比特的y坐标标识位。
[0028] 进一步的,所述保留位OP的长度为n个汉字可表示的比特长度减去公钥P’的比特长度;保留位OP用以表示编码标记。
[0029] 进一步的,所述比特串M=OP||yp’||xp,其中“||”表示拼接,xp为公钥P的x坐标,yp’为公钥P的1比特的y坐标标识位。
[0030] 一种公钥编码进行解码的方法,其步骤包括:
[0031] 1)对字符串S中的每个字符,在数组C中找到其位置i,将十进制的i表示为二进制比特串,若不足k位则采用高位补0的方式填充为k位;
[0032] 2)将转换后的n个k位比特串按序拼接,得到一比特串M;
[0033] 3)根据公钥P的短汉字编码过程中该比特串的生成规则,从该比特串M中提取保留位OP、公钥P的1比特的y坐标标识位yp’以及公钥P的x坐标xp;
[0034] 4)计算域元素α=(xp3+axp+b)mod p,计算αmod p的平方根β,若β的最右边比特等于yp’,则置yp=β,否则置yp=p-β;其中,a、b为椭圆曲线方程y2=x3+ax+b中的系数,公钥P为该椭圆曲线方程y2=x3+ax+b中的一点坐标;Fq为用于生成该公钥P的有限域,q=p且p为大于3的素数;
[0035] 5)根据解码出的xp、yp得到公钥P。
[0036] 在本发明中,针对于公钥数据的文本表示,发明了一种对公钥的短汉字编码方法,仅需使用20字符的文本表示公钥数据,与常规的十六进制表示法相比优势在于使用的字符数量更少,与短网址服务使用数据库映射相比优势在于完全本地化编码与解码而无需云端参与,即本发明的编码无需云端参与即可完成。
[0037] 另外,在本发明中,为了进一步方便用户管理自己与他人公钥,还设计了一种适用于移动端的基于短汉字编码的对公钥进行简单化传输、管理的软件系统,最终提供了一种对用户友好的、简单易用的公钥密码算法中密钥的传输与管理的基础设施,为用户使用公钥密码算法进行安全通信、身份认证打下基础。
[0038] 本发明中提供了一种对于椭圆曲线公钥的“短汉字编码”,椭圆曲线公钥为点P的坐标(即椭圆曲线公钥为椭圆曲线上坐标点P的坐标),其中x、y坐标均为256比特,使用普通的十六进制表示法需要128字符,而较长的字符不便于公钥的传递。本发明中采用如下方案来实现无需云端服务器参与的对于椭圆曲线公钥的“短汉字编码”。首先使用在GM/T 0003-2012《SM2椭圆曲线公钥密码算法》中提出了一种“椭圆曲线上点的压缩”方法,已知x坐标的情况下,附加y坐标最右侧的一个比特,由椭圆曲线方程可以恢复出y坐标,于是压缩后的公钥用十六进制表示法表示为256÷4+1=65字符,而65字符的数量仍然比较大。本发明中同时采用了使用《全国信息技术标准化技术委员会汉字内码扩展规范(GBK)》中的8192个无重复汉字作为字符集来进行编码,保留位、y坐标最右侧一个比特、x坐标共拼接为260位,共需
260÷13=20个字符即可表示公钥信息,可以大大减少表示公钥数据的文本字符数量。

附图说明

[0039] 图1为本发明“短汉字编码”的编码示意图;
[0040] 图2为本发明“短汉字编码”的解码示意图。

具体实施方式

[0041] 为了使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明作进一步详细说明。
[0042] 图1、图2公开了一种“短汉字编码”的编解码方案,“短汉字编码”是一种对于椭圆曲线公钥的编码方式,可以有效缩短用以表示公钥的字符数量。以SM2椭圆曲线为例,公钥为椭圆曲线上的一个点P,记P=(xp,yp),其中x和y坐标均为256比特,若使用普通的十六进制表示法,单个字符可代表4比特,公钥点P的x和y坐标共需(256+256)÷4=128字符,需要的字符数较多,不利于用户间的传递。注意到,对于SM2椭圆曲线算法使用的椭圆曲线方程y2=x3+ax+b(素数域256位),在GM/T 0003-2012《SM2椭圆曲线公钥密码算法》中提出了一种“椭圆曲线上点的压缩”方法,则公钥P可由xp和单比特yp’表示,其中yp’为yp的最右侧一个比特,由xp和yp’恢复yp的方法为:
[0043] a)计算域元素α=(xp3+axp+b)mod p;
[0044] b)计算αmod p的平方根β,一般采用Tonelli-Shanks算法
[0045] c)若β的最右边比特等于yp’,则置yp=β,否则置yp=p-β。
[0046] 经过以上椭圆曲线点的压缩之后,点P可由xp和单比特yp’表示,使用十六进制表示法,共需256÷4+1=65字符(注,单比特yp’也需要1字符表示),需要的字符数仍然较多。
[0047] 使用以下的汉字编码方式可以进一步缩短表示公钥所需的字符数量:
[0048] 在《全国信息技术标准化技术委员会汉字内码扩展规范(GBK)》中共有约6763+6080+8160=21003个汉字,出于编解码性能等方面考虑,我们选取其中无重复的8192个字符作为字符集来编码,具体编码方法为:
[0049] a)选取2k个汉字,k为一个字符的二进制位数(也就是k比特)(本发明中选取8192个汉字)组成数组C,用C[i]表示数组中的第i个字符,i即为该字符的下标;点压缩后的信息为256比特的x坐标加1比特的y坐标标识,实际共257比特,至少需要20个汉字(20*13=260比特>257比特),将剩余的3比特规定为“保留位”。实际上,取8192*2=16384个汉字也可以,GBK编码表中有2万左右的汉字,这样的话,一个汉字可以表示14比特(16384=2的14次方),点压缩后的公钥需要257比特,257÷14=18.3,也就是需要19个字符,但是多加了一倍的用来编码的字符集,而最后只缩短了1个字符,而且用来编码的汉字越多,编解码性能就越差(计算过程中需要找查找汉字的位置,数量越多查找的速度越慢),因此本发明选取8192个汉字。
[0050] b)选取3比特的OP用作保留位(保留位OP用以表示编码标记或日后使用,默认为000,比如记录编码版本、类型、算法等信息),yp’为yp的最右侧一个比特,xp为点P的x坐标,比特串M=OP||yp’||xp,其中“||”表示拼接,比特串M长度为3+1+256=260位;
[0051] c)将比特串M以每块k位(k取值为13)的方式按序拆分为n块(n为20),对于每一块中的k位比特串,将其转化为十进制数i(13位的比特串即13位的二进制,其十进制范围为[0,8191],恰好对应数组C的共8192个下标),取出数组C中第i个字符即C[i]表示该块数据,于是依次将代表n块数据的n个C中的字符拼接后形成新的字符串S;
[0052] d)由n个字符组成的S即可表示点P即公钥数据;本发明中选择8192个汉字,k取值为13,对应的公钥数据为20个字符。
[0053] 解码方法为:
[0054] a)对字符串S中的每个字符,在数组C中找到其位置i(即数组下标),将十进制的i表示为二进制比特串,若不足13位则采用高位补0的方式填充为13位;
[0055] b)将转换后的20个13位比特串按序拼接为总长为20×13=260位的比特串M;
[0056] c)对260位的比特串M,取前3位作为保留位OP,第4位yp’,剩余的256位即点P的xp坐标;
[0057] d)计算域元素α=(xp3+axp+b)mod p,计算αmod p的平方根β,一般采用Tonelli-Shanks算法,若β的最右边比特等于yp’,则置yp=β,否则置yp=p-β;
[0058] e)以上即解码出公钥点(xp,yp)。
[0059] 通过“短汉字编码”可以将椭圆曲线公钥P点的坐标仅以20个字符表示,可实现更方便的公钥传递。
[0060] 一个“短汉字编码”的公钥数据示例如下:
[0061]
[0062] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。