Encryption and Hashing Functions with RSA

  • Share this:

Code introduction


This code defines several encryption-related functions, including generating RSA key pairs, encrypting and decrypting messages, hashing passwords, and verifying passwords.


Technology Stack : cryptography, PBKDF2HMAC, Scrypt, serialization, rsa, padding, hashes, OAEP, MGF1

Code Type : The type of code

Code Difficulty :


                
                    
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives.kdf.scrypt import Scrypt
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric import padding
from os import urandom

def generate_rsa_keypair(bit_length=2048):
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=bit_length,
        backend=default_backend()
    )
    public_key = private_key.public_key()
    return private_key, public_key

def encrypt_message(public_key, message):
    encrypted = public_key.encrypt(
        message,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return encrypted

def decrypt_message(private_key, encrypted_message):
    decrypted = private_key.decrypt(
        encrypted_message,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return decrypted

def hash_password(password, salt=None):
    if salt is None:
        salt = urandom(16)
    kdf = Scrypt(
        salt=salt,
        length=32,
        n=2**14,
        r=8,
        p=1,
        backend=default_backend()
    )
    key = kdf.derive(password.encode())
    return key, salt

def verify_password(stored_password, provided_password, salt):
    stored_key, _ = hash_password(stored_password, salt)
    provided_key, _ = hash_password(provided_password, salt)
    return stored_key == provided_key