From e0916e89b91794ee0f4b8fd8c88edf45c7be883e Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 17 Jun 2025 18:05:40 +0800 Subject: [PATCH] bugfix --- weishijiajie/jj_utils.py | 72 ++++++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/weishijiajie/jj_utils.py b/weishijiajie/jj_utils.py index 352e882..1bbffae 100644 --- a/weishijiajie/jj_utils.py +++ b/weishijiajie/jj_utils.py @@ -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)) +