جریان ایجاد امضای دیجیتال و تأیید در پایتون

این جریان نحوه ایجاد و تأیید یک امضای دیجیتال را با استفاده از cryptography
کتابخانه در پایتون این فرآیند صحت و یکپارچگی پیام را تضمین می کند و تأیید می کند که توسط دارنده کلید خصوصی امضا شده و تغییری نکرده است.
3 مرحله اصلی وجود دارد.
-
ایجاد جفت کلید:
- کلید خصوصی: با استفاده از RSA، با توان عمومی 65537 و اندازه کلید 2048 بیت ایجاد شده است.
- کلید عمومی: برگرفته از کلید خصوصی.
- ذخیره سازی: هر دو کلید در فایل ها با فرمت PEM ذخیره می شوند.
-
پیام را امضا کنید:
- پیام: داده هایی که باید امضا شوند.
- عملکرد هش: SHA-256 برای هش پیام استفاده می شود.
- لایه گذاری: PSS (Signature Scheme احتمالی) با MGF1 (تابع تولید ماسک) و حداکثر طول نمک برای بالشتک استفاده می شود.
- امضا: پیام با استفاده از کلید خصوصی امضا می شود و امضا در یک فایل ذخیره می شود.
-
تأیید امضا:
- کلید عمومی: از فایل PEM بارگیری شده است.
- امضا: از فایل بارگذاری شده است.
- پیام: پیام اصلی که امضا شد.
- تایید: کلید عمومی به همراه پیام و امضا برای تایید صحت امضا استفاده می شود. اگر امضا معتبر باشد، به این معنی است که پیام توسط کلید خصوصی مربوطه امضا شده است.
مرحله 1: کتابخانه مورد نیاز را نصب کنید
ابتدا مطمئن شوید که آن را دارید cryptography
کتابخانه نصب شده است می توانید آن را با استفاده از pip نصب کنید:
pip install cryptography
مرحله 2: یک جفت کلید ایجاد کنید
یک جفت کلید از یک کلید خصوصی (که برای امضا استفاده می شود) و یک کلید عمومی (که برای تأیید استفاده می شود) تشکیل شده است.
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
# Generate private key
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
# Generate public key from the private key
public_key = private_key.public_key()
# Save the private key to a file
with open("private_key.pem", "wb") as f:
f.write(private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
))
# Save the public key to a file
with open("public_key.pem", "wb") as f:
f.write(public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
))
مرحله 3: یک پیام را امضا کنید
برای ایجاد یک امضای دیجیتال، از کلید خصوصی برای امضای پیام استفاده خواهید کرد.
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
# Message to be signed
message = b"Hello, this is a secret message!"
# Sign the message
signature = private_key.sign(
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
# Save the signature to a file
with open("signature.bin", "wb") as f:
f.write(signature)
مرحله 4: تأیید امضا
برای تأیید امضا، از کلید عمومی استفاده کنید تا بررسی کنید که آیا با پیام مطابقت دارد یا خیر.
# Load the public key
with open("public_key.pem", "rb") as f:
public_key = serialization.load_pem_public_key(f.read())
# Load the signature
with open("signature.bin", "rb") as f:
signature = f.read()
# Message to be verified
message = b"Hello, this is a secret message!"
# Verify the signature
try:
public_key.verify(
signature,
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
print("The signature is valid.")
except:
print("The signature is invalid.")