mirror of
https://github.com/github/codeql.git
synced 2025-12-18 18:10:39 +01:00
I don't know if this is really a smart test-setup... I feel a bit stupid when doing this xD
72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
# RSA is a public-key algorithm for encrypting and signing messages.
|
|
|
|
from Crypto.PublicKey import RSA
|
|
from Crypto.Cipher import PKCS1_OAEP
|
|
from Crypto.Signature import pss
|
|
from Crypto.Hash import SHA256
|
|
|
|
private_key = RSA.generate(2048) # $ PublicKeyGeneration keySize=2048
|
|
|
|
# These 2 methods do the same
|
|
public_key = private_key.publickey()
|
|
public_key = private_key.public_key()
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# encrypt/decrypt
|
|
# ------------------------------------------------------------------------------
|
|
|
|
print("encrypt/decrypt")
|
|
|
|
secret_message = b"secret message"
|
|
|
|
# Following example at https://pycryptodome.readthedocs.io/en/latest/src/examples.html#encrypt-data-with-rsa
|
|
|
|
encrypt_cipher = PKCS1_OAEP.new(public_key)
|
|
|
|
encrypted = encrypt_cipher.encrypt(secret_message) # $ CryptographicOperation CryptographicOperationInput=secret_message # MISSING: CryptographicOperationAlgorithm=RSA-OAEP?
|
|
|
|
print("encrypted={}".format(encrypted))
|
|
|
|
print()
|
|
|
|
decrypt_cipher = PKCS1_OAEP.new(private_key)
|
|
|
|
decrypted = decrypt_cipher.decrypt(encrypted) # $ CryptographicOperation CryptographicOperationInput=encrypted # MISSING: CryptographicOperationAlgorithm=RSA-OAEP?
|
|
|
|
print("decrypted={}".format(decrypted))
|
|
assert decrypted == secret_message
|
|
|
|
print("\n---\n")
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# sign/verify
|
|
# ------------------------------------------------------------------------------
|
|
|
|
print("sign/verify")
|
|
|
|
|
|
message = b"message"
|
|
|
|
signer = pss.new(private_key)
|
|
|
|
hasher = SHA256.new(message) # $ CryptographicOperation CryptographicOperationAlgorithm=SHA256 CryptographicOperationInput=message
|
|
signature = signer.sign(hasher) # $ CryptographicOperation CryptographicOperationInput=hasher # MISSING: CryptographicOperationAlgorithm=RSA-PSS?
|
|
|
|
print("signature={}".format(signature))
|
|
|
|
print()
|
|
|
|
verifier = pss.new(public_key)
|
|
|
|
hasher = SHA256.new(message) # $ CryptographicOperation CryptographicOperationAlgorithm=SHA256 CryptographicOperationInput=message
|
|
verifier.verify(hasher, signature) # $ CryptographicOperation CryptographicOperationInput=hasher CryptographicOperationInput=signature # MISSING: CryptographicOperationAlgorithm=RSA-PSS?
|
|
print("Signature verified (as expected)")
|
|
|
|
try:
|
|
verifier = pss.new(public_key)
|
|
hasher = SHA256.new(b"other message") # $ CryptographicOperation CryptographicOperationAlgorithm=SHA256 CryptographicOperationInput=b"other message"
|
|
verifier.verify(hasher, signature) # $ CryptographicOperation CryptographicOperationInput=hasher CryptographicOperationInput=signature # MISSING: CryptographicOperationAlgorithm=RSA-PSS?
|
|
raise Exception("Signature verified (unexpected)")
|
|
except ValueError:
|
|
print("Signature mismatch (as expected)")
|