ET199 密码狗密钥对读取

0 条回复
5 次浏览

加密锁/加密狗 ET199 超级多功能锁(包含网络锁功能)是一款无驱并可以同时支持软件保护和身份认证的多功能 USB 设备。硬件采用 16 位国外进口高性能智能卡芯片,提供 64K 用户存储空间,硬件支持 512/1024/2048 位 RSA、DES/3DES、SHA1、MD5 算法,具有超高性价比。ET199 通过世界领先成熟的 C51 锁内编程技术,保证加密后的软件无法破解。

官网地址: https://www.jansh.com.cn/product/rockey/et-199/

ET199 可以生成密钥对,生成的文件为:.pub、.pri 文件。
这两个文件要用十六进制编辑器打开,里面存储的不是字符串,要根据字节读取 p、q、n、e,根据读取的值计算公私钥。
下面是使用算法读取密钥对文件并进行加解密测试。

复制
# -- coding: utf-8 --
# mxpy
import base64

import rsa,base64

class RSAFunc():
    '''
    pub_file: 公钥路径
    pri_file:私钥路径
    '''
    def __init__(self,pub_file,pri_file):
        self.pub_file_path=pub_file
        self.pri_file_path=pri_file

    def __getNE(self):
        with open(self.pub_file_path, 'rb') as f:
            # 读取 n 的长度
            n_size = f.read(4)
            # print(f.tell())
            # f.seek(4)
            # 读取 n 的值
            n = f.read(int(n_size.hex(), 16)).hex()
            # f.seek(4+int(n_size.hex(),16))
            # 读取 e 的长度
            e_size = f.read(4)
            # 读取 e 的值
            e = f.read(int(e_size.hex(), 16)).hex()
            n = int(n, 16)
            e = int(e, 16)
            return n,e

    def __getPQ(self):
        with open(self.pri_file_path, 'rb') as f:
            # 读取 n 的长度
            # p_size = f.read(4)
            f.seek(4)
            p_size = b'\x00\x00\x00\x80'
            # print(int(p_size.hex(), 16))
            # 读取 n 的值
            p = f.read(int(p_size.hex(), 16)).hex()
            # 读取 e 的长度
            q_size = f.read(4)
            # f.seek(4+int(p_size.hex()))
            # q_size = b'\x00\x00\x00\x80'
            # 读取 e 的值
            q = f.read(int(q_size.hex(), 16)).hex()
            p = int(p, 16)
            q = int(q, 16)
            return p,q

    def __extended_gcd(self,a, b):
        if a == 0:
            return (b, 0, 1)
        else:
            gcd, x, y = self.__extended_gcd(b % a, a)
            return (gcd, y - (b // a) * x, x)

    def __getD(self,e,p,q):
        # n = p * q
        phi = (p - 1) * (q - 1)
        gcd, x, y = self.__extended_gcd(e, phi)
        phi = (p - 1) * (q - 1)
        d = x % phi
        return d

    def getPublicKey(self):
        n,e=self.__getNE()
        public_key = rsa.PublicKey(n, e)
        return public_key

    def getPrivateKey(self):
        n,e=self.__getNE()
        p,q=self.__getPQ()
        d=self.__getD(e,p,q)
        private_key = rsa.PrivateKey(n, e, d, p, q)
        return private_key

    def encrypt(self,msg,public_key):
        return base64.b64encode(rsa.encrypt(msg.encode(),public_key)).decode('utf-8')

    def decrypt(self,msg,private_key):
        return rsa.decrypt(base64.b64decode(msg.encode()),private_key)

    def saveKey(self,key,filename):
        key=key.save_pkcs1()
        with open(filename,"wb") as f:
            f.write(key)
            f.flush()
            f.close()

    def signMsg(self,msg,private_key,hashMethod):
        return base64.b64encode(rsa.sign(msg.encode(), private_key, hashMethod)).decode("utf-8")

    def verifyMsg(self,msg,sign,public_key):
        try:
            return rsa.verify(msg.encode(), base64.b64decode(sign), public_key)
        except rsa.VerificationError as e:
            return str(e)

if __name__ == '__main__':
    # filename="20231229"
    rsafunc=RSAFunc(r"C:\Users\mxpy\Desktop\ET199\密钥对\20231229.pub",r"C:\Users\mxpy\Desktop\ET199\密钥对\20231229.pri")
    public_key=rsafunc.getPublicKey()
    private_key=rsafunc.getPrivateKey()
    rsafunc.saveKey(public_key,"20231229.pem")
    rsafunc.saveKey(private_key,"20231229_pri.pem")

    msg="mxpy{e119cbef54dc4e4fbd1b127a1007e1e3}"
    print("待加密字符串:"+msg)
    encmsg=rsafunc.encrypt(msg,public_key)
    print(f"加密:{encmsg}")
    print(f"解密:{rsafunc.decrypt(encmsg,private_key).decode('utf-8')}")
    sign=rsafunc.signMsg(msg,private_key,"SHA-256")
    print(f"签名:{sign}")
    print(f"校验:{rsafunc.verifyMsg(msg,sign,public_key)}")

image
运行截图

发表一个评论

R保持