ET199 密码狗密钥对读取
加密锁/加密狗 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)}")

运行截图