This commit is contained in:
yumoqing 2025-06-17 18:05:40 +08:00
parent 904e2b2bdf
commit e0916e89b9

View File

@ -10,6 +10,37 @@ from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
def write_pubkey_pem(pubkey, pemfile):
with open(pemfile, "wb") as f:
f.write(
pubkey.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
)
def write_prikey_pem(prikey, pemfile):
with open(pemfile, "wb") as f:
f.write(
prikey.private_bytes(
encoding=serialization.Encoding.PEM,
#format=serialization.PrivateFormat.TraditionalOpenSSL,
format=serialization.PrivateFormat.PKCS8, # 指定为 PKCS#8 格式
encryption_algorithm=serialization.NoEncryption() # 可设置加密
)
)
def get_rsa_pubkey_from_pemstr(pemstr):
# 加载公钥
pem = pemstr.encode('utf-8')
public_key = serialization.load_pem_public_key(pem)
return public_key
def get_rsa_prikey_from_pemstr(pemstr):
pem = pemstr.encode('utf-8')
private_key = serialization.load_pem_private_key(pem, password=None)
return private_key
def get_rsa_pubkey_from_b64keystring(b64ks):
der_data = base64.b64decode(b64ks)
# 加载公钥
@ -19,11 +50,7 @@ def get_rsa_pubkey_from_b64keystring(b64ks):
def pubkey_encode(pubkey, bin):
ciphertext = pubkey.encrypt(
bin,
asym_padding.OAEP(
mgf=asym_padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
asym_padding.PKCS1v15()
)
# 输出 base64 编码后的密文
@ -39,11 +66,7 @@ def prikey_decode(prikey, text):
ciphertext = base64.b64decode(text)
plaintext = prikey.decrypt(
ciphertext,
asym_padding.OAEP(
mgf=asym_padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
asym_padding.PKCS1v15()
)
return plaintext
@ -74,8 +97,19 @@ def data_jj_encode(data, pubkey_b64str):
""" return a dict with:
AESKey:aes key encrypted by public key
data: data encrypted by aes key
步骤说明
1. 从pemstr生成公钥
2. 生成随机的aes密钥
3. 用公钥加密aes密钥到aes_key_cyber
4. 将data数据用json转换为字符串js
5. 用aes密钥将js字符串加密到data_cyber
6. 将data_cyber用base64编码到data_cyber_b64
7. 构造返回字典{
'AESKey': aes_key_cyber,
'data': data_cyber_b64
}并返回
"""
pubkey = get_rsa_pubkey_from_b64keystring(pubkey_b64str)
pubkey = get_rsa_pubkey_from_pemstr(pubkey_b64str)
aes_key = generate_key()
print(f'{aes_key=}')
aes_key_cyber = pubkey_encode(pubkey, aes_key)
@ -89,7 +123,7 @@ def data_jj_encode(data, pubkey_b64str):
}
def data_jj_decode(cdata, prikey_b64str):
prikey = get_rsa_prikey_from_b64keystring(prikey_str)
prikey = get_rsa_prikey_from_pemstr(prikey_str)
aes_key = prikey_decode(prikey, cdata['AESKey'])
print(f'{aes_key=}')
js_cyber = base64.b64decode(cdata['data'])
@ -117,15 +151,16 @@ if __name__ == '__main__':
"filed2": 2,
"field3": "r32g"
}
pubkey_str="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3LWvOQCufDQpf9PsOrBF" + \
pubkey_str="-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3LWvOQCufDQpf9PsOrBF" + \
"SsjPqIg/x1YZpQ4MksZs4BwHWjHT9PHoJ88OZl2cXmyaY6Hde2KXG1v873lI70/2" + \
"oUizX8Fyl0TTliAQ/p/kSsmgHfzhY+KOZUQ5HwXwnjFKv1q+Y0PpseNPFFHGiB1H" + \
"/6p8kJeV61GN00etwvAvDdfZKm9W6t1ByD9Bsr3/VSHJtv1DqVdgmVMxnI7W4mx6" + \
"UmseGmywngLvBHXI0+MWRK1RszCMISA6SsKTlT9IdT/r64vLht+NImEY6KPwODpu" + \
"6vBUSyRqbGVitZ6PPIPwzLkB8LZ69eTjK5SMXP6RD7kHio+vb4ljHWXzDfRH9HXq" + \
"FQIDAQAB"
"FQIDAQAB\n-----END PUBLIC KEY-----"
prikey_str = (
"-----BEGIN PRIVATE KEY-----\n"
"MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDcta85AK58NCl/"
"0+w6sEVKyM+oiD/HVhmlDgySxmzgHAdaMdP08egnzw5mXZxebJpjod17YpcbW/zv"
"eUjvT/ahSLNfwXKXRNOWIBD+n+RKyaAd/OFj4o5lRDkfBfCeMUq/Wr5jQ+mx408U"
@ -151,13 +186,16 @@ if __name__ == '__main__':
"5FBIZUp8xGEuHxIXA0D3ldmo2oswdMx5ZA9JtGcPUQKBgQDtlyIeU8p9wTgCLYn8"
"PVrVMJNiLv4zvJdmQNkBQmNIC67mLUGcZRZRfskk4hYB8sglAGkHZIUBDMFk785+"
"grB5Y0Rn7RAuzVs6uoibwAx4u3rEjENR0gOdyzMATzqjgWL8GnrG5QU6VHRIVwr6"
"ni/+cSjJYn6PolxPdurAZXYhqQ=="
"ni/+cSjJYn6PolxPdurAZXYhqQ==\n"
"-----END PRIVATE KEY-----"
)
pubkey = get_rsa_pubkey_from_b64keystring(pubkey_str)
prikey = get_rsa_prikey_from_b64keystring(prikey_str)
pubkey = get_rsa_pubkey_from_pemstr(pubkey_str)
prikey = get_rsa_prikey_from_pemstr(prikey_str)
key_crypt = pubkey_encode(pubkey, key_b64)
key_b64T = prikey_decode(prikey, key_crypt)
print(f"RSA加密{key_b64=}==>{key_crypt=}, \n解密==>{key_b64T=}")
x = data_jj_encode(d, pubkey_str)
d1 = data_jj_decode(x, prikey_str)
print(f'{d=}, {d1=}')
print(json.dumps(x, indent=4))