import binascii from random import choice from . import sm3, func from Cryptodome.Util.asn1 import DerSequence, DerInteger from binascii import unhexlify import random # 选择素域,设置椭圆曲线参数 default_ecc_table = { 'n': 'FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123', 'p': 'FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF', 'g': '32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7' 'bc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0', 'a': 'FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC', 'b': '28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93', } class CryptSM2(object): def __init__(self, private_key, public_key, ecc_table=default_ecc_table, mode=0, asn1=False): """ mode: 0-C1C2C3, 1-C1C3C2 (default is 1) """ self.private_key = private_key self.public_key = public_key.lstrip("04") if public_key.startswith("04") else public_key self.para_len = len(ecc_table['n']) self.ecc_a3 = ( int(ecc_table['a'], base=16) + 3) % int(ecc_table['p'], base=16) self.ecc_table = ecc_table assert mode in (0, 1), 'mode must be one of (0, 1)' self.mode = mode self.asn1 = asn1 def _kg(self, k, Point): # kP运算 Point = '%s%s' % (Point, '1') mask_str = '8' for i in range(self.para_len - 1): mask_str += '0' mask = int(mask_str, 16) Temp = Point flag = False for n in range(self.para_len * 4): if (flag): Temp = self._double_point(Temp) if (k & mask) != 0: if (flag): Temp = self._add_point(Temp, Point) else: flag = True Temp = Point k = k << 1 return self._convert_jacb_to_nor(Temp) def _double_point(self, Point): # 倍点 l = len(Point) len_2 = 2 * self.para_len if l < self.para_len * 2: return None else: x1 = int(Point[0:self.para_len], 16) y1 = int(Point[self.para_len:len_2], 16) if l == len_2: z1 = 1 else: z1 = int(Point[len_2:], 16) T6 = (z1 * z1) % int(self.ecc_table['p'], base=16) T2 = (y1 * y1) % int(self.ecc_table['p'], base=16) T3 = (x1 + T6) % int(self.ecc_table['p'
python调用from gmssl import sm2后,对sm2进行密钥生成代码的补充
最新推荐文章于 2024-09-01 09:29:40 发布