Python faster JWE decryption

98 views Asked by At

I have python code that decrypt JWE, but my issue is that I need to keep up with quite high load of data to decode per second and my code is too slow...

Does someone maybe has a suggestion on how to make this code work faster?

This is the decryption code which should return {"test": "test"}

from jwcrypto import jwe, jwk

DATA = "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIiwia2lkIjoiZDgzNTIyNGItNmJlOS00MWQ0LTkyYWEtYzEyOGZkNWU5ZWNlIn0.Gadr3iydQTwKzDKp7wYeDX4gzu8_hD9t8iylgtklGdrKDOtK4pScUNuoBX92R9gnvWapNXpwcr2CEdQ45_POJ-HpFONOFCUDFuOxTfHn7ncytEDCv7a5TTbDAVBAmcH9mbkeo0DRok6vJxrprgl1USzK3UjhXzdUPTWhp8tMYtXXNzaPVbgthNqe4Hy4TX-K1Mcl_ZFcJn_JeLFE9kOWid1Dwaltzqh4pXQQoFMosumSNDGApY-DKpLpzcy_8UV890B1cnsceuggg88iPXM_GpJzKMuxkzt-451h7V500UOkdxz6M4PgAf8YLNmwziyJe3dOSEIlub0fqiZhhRNUvA.e3vioHj1RvZb58UL.-cBm-2fjYZB_EczWj78byA.3M3UqyaPUZIekudlT3aTjg"
DECRYPTION_KEY = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCs/yqrB8VjupUov9zApR6iEkEAPRzWrKvn+ZKlx6Rt/qTDNg0jjKahsHqTultndcB+58z+RQ/wAGGAoPm1f1JmY9P7pOGOOyGGEEsyonfa3PVwJ8Yryw3Cu0nwm2q0r9Pdv9d+BGdpPBubZ6Io5OIAtVrR7tjj8OZkGs3UXmMruXc8MTkXkO5Hccf7z+GNCu+ebNrM7sDVT+akjB2swRfHgsgwtLnnsCslyu55G6xiQIk2M7WURl7q37Y0pG4glYj4401n9lK0b8YbiuXhoeOY7799zd7gGSL1KdA14U0YSiHfbPLOV2e1Tjfv1adY97b2cSgt3ml6rbFj3siOyxyFAgMBAAECggEACu5Qlt/10/hdJmcBHtcQGXOH0ekKonHkptK5Nmpn9F9Lr94BdIaVnM/W3vC+h8oD8MDazhI1EJglkQga3yH9ZeTW5yai7ebEloD/D2L+qcCebYjF18yLwQsuf9qCIoqdm3xctGS42AhpQieJMoZL1XmgFHXAFJ8LH7Yl3U5de8ywqKdUq41YqdpklMGY3p1tS8R3R9l1x8repGyV6xQvUUsvJZ9Edkh9UBEmWG2AbEX8J5TN8h+P7Pg5dBj3sZYrcF4YvuYEIMPtfuVGqtX0SNiAWMngaYjFqG3fyfrFmxNUjF5A0GoALWF/Z4VaNtCudF4M+wptN0O77h/1gdC/PQKBgQDT1hL8LlVMRceTkZNyH8JvGN+G5m2YMsXV/GysGT3jVU2ErIvFydEhkh7fNk9jJ7vpSfIiQ2SKr+/+uh7iSa94h09AJVO5+WzcWCYa4Fen81/gaM5Hpf8bOWcQXBJRtvTN8IfjaznebYH2w2ckHLS8yZLXYSB2DGI8EaG4kgTeAwKBgQDREDAVidenvlaocYUZDNMMSVpyPCRzTIGhbEQk4JjBfdx2OKaxIXW4P4FgtH71GreJ4TFYh2BvXhpooxymM+K5bbZa+Cfhcf9fivcmXooGTsdf5hAFzIs2VXnpN82lxI9G+C4e/JDrTgADCuDGHXs3rxf5EgSYopknrtpbfAw41wKBgFdiuQQ0rNVA99plNDjg5xljXlpM1irxzvC+J6o642/TMZ4oe6RE47OAjqGvysHxky/iZDNEL8aSW2NuLe1VTkBfOQ8SFt7iCMlAx79QinhrCkMNmQKvdHQrktuJz7jLy2Lk9XmYMxARhopgAz0/ZkN2t8+Hbpej9iYnc9oqyj03AoGBAMEKM3wP1YNcK2RJvd5NiyqTKOLGSdn00NWexKVQhXxUnRbEZJa2EJ7adLo4r+nei47S0t+t0QvEVpo70p5c1oLlnTYOYbS3sFgmVuOk88mzQEF6i1zva7P15SXFkyv3fVzImL2f9KhxU217w+TrH/VgxcAENR5DNSwBNjq3JgntAoGBALYsMibwoh7PRkaqvIMpKW0bbkKIvk36MhVXcUx8Xi0UMvvd/6FBTBieWoKELAvQ4X1bL1FISHibok+/ofMAhxn9/Zt4StQYdTWtxyht6YhUFi1VKEWO1IqxLrXReIR9JAm5/gtwJBuKPh3DPw8HDlCtX8AQlh2EOInRp8hcUdPl"
KEY_ID = "d835224b-6be9-41d4-92aa-c128fd5e9ece"


def key_to_pem(key: str, is_public: bool = True) -> bytes:
    pem = [f"-----BEGIN {'PUBLIC' if is_public else 'PRIVATE'} KEY-----"]
    for group in grouper(key, 64):
        pem.append(''.join(group))
    pem.append(f"-----END {'PUBLIC' if is_public else 'PRIVATE'} KEY-----")
    return str.encode('\n'.join(pem))


def decrypt_data(encrypted_data: str, pem_decryption_key: bytes, key_id: str) -> str:
    private_key = jwk.JWK.from_pem(pem_decryption_key)
    protected_header = {
        "alg": "RSA-OAEP-256",
        "enc": "A256GCM",
        "kid": key_id,
    }
    jwetoken = jwe.JWE(protected=protected_header)
    jwetoken.deserialize(encrypted_data, key=private_key)
    payload = jwetoken.payload
    return payload.decode("utf-8")


if __name__ == '__main__':
    decrypt_key = key_to_pem(DECRYPTION_KEY, is_public=False)
    print(decrypt_data(DATA, decrypt_key, KEY_ID))
0

There are 0 answers