Use cases
- Verifying if a string has been changed
Installation
Install cryptography
with pip
: pip install cryptorgraphy
Supported Python versions
- Python 2.7
- Python 3.6
- Python 3.7
Example Code for Python based signing of a String using SHA-512, RSA 4096, BASE64 and UTF-8 encoding
import base64
import logging
from cryptography.exceptions import InvalidSignature
from cryptography.exceptions import UnsupportedAlgorithm
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.asymmetric import rsa
# set up logger
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def demonstrate_signature_rsa(plain_text):
"""
Example for cryptographic signing of a string in one method.
- Generation of public and private RSA 4096 bit keypair
- SHA-512 with RSA signature of text using PSS and MGF1 padding
- BASE64 encoding as representation for the byte-arrays
- UTF-8 encoding of Strings
- Exception handling
"""
try:
# GENERATE NEW KEYPAIR
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=4096,
backend=default_backend()
)
public_key = private_key.public_key()
# SIGN DATA/STRING
signature = private_key.sign(
data=plain_text.encode('utf-8'),
padding=padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
algorithm=hashes.SHA256()
)
logger.info("Signature: %s", base64.urlsafe_b64encode(signature))
# VERIFY JUST CREATED SIGNATURE USING PUBLIC KEY
try:
public_key.verify(
signature=signature,
data=plain_text.encode('utf-8'),
padding=padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
algorithm=hashes.SHA256()
)
is_signature_correct = True
except InvalidSignature:
is_signature_correct = False
logger.info("Signature is correct: %s", is_signature_correct)
except UnsupportedAlgorithm:
logger.exception("Signing failed")
if __name__ == '__main__':
# demonstrate method
demonstrate_signature_rsa(
"Text that should be signed to prevent unknown tampering with its content.")