通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python中如何实现加密解密

python中如何实现加密解密

在Python中实现加密和解密可以通过多种方式进行,包括对称加密算法、非对称加密算法、哈希算法等。其中,对称加密算法最常用的一种是AES(高级加密标准),非对称加密算法常用的是RSA,而哈希算法则包括MD5、SHA-1等。本文将详细介绍如何使用这些算法在Python中实现加密和解密。

一、对称加密算法(AES)

对称加密是一种使用相同密钥进行加密和解密的算法。AES(Advanced Encryption Standard)是对称加密算法的代表。Python中,可以使用pycryptodome库来实现AES加密和解密。

安装pycryptodome库

首先,确保安装了pycryptodome库:

pip install pycryptodome

AES加密和解密示例

from Crypto.Cipher import AES

from Crypto.Random import get_random_bytes

import base64

填充函数

def pad(data):

length = 16 - (len(data) % 16)

return data + chr(length) * length

去填充函数

def unpad(data):

return data[:-ord(data[len(data)-1:])]

AES加密

def aes_encrypt(key, data):

data = pad(data)

iv = get_random_bytes(16)

cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv)

encrypted_data = cipher.encrypt(data.encode('utf-8'))

return base64.b64encode(iv + encrypted_data).decode('utf-8')

AES解密

def aes_decrypt(key, encrypted_data):

encrypted_data = base64.b64decode(encrypted_data)

iv = encrypted_data[:16]

cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv)

data = cipher.decrypt(encrypted_data[16:])

return unpad(data.decode('utf-8'))

示例

key = 'thisisaverysecret'

data = 'Hello, World!'

encrypted = aes_encrypt(key, data)

print(f'Encrypted: {encrypted}')

decrypted = aes_decrypt(key, encrypted)

print(f'Decrypted: {decrypted}')

二、非对称加密算法(RSA)

非对称加密使用一对密钥——公钥和私钥。公钥用于加密,私钥用于解密。Python中可以使用pycryptodome库来实现RSA加密和解密。

生成RSA密钥对

from Crypto.PublicKey import RSA

生成RSA密钥对

key = RSA.generate(2048)

private_key = key.export_key()

public_key = key.publickey().export_key()

保存密钥到文件

with open('private.pem', 'wb') as f:

f.write(private_key)

with open('public.pem', 'wb') as f:

f.write(public_key)

RSA加密和解密示例

from Crypto.Cipher import PKCS1_OAEP

from Crypto.PublicKey import RSA

import base64

RSA加密

def rsa_encrypt(public_key, data):

key = RSA.import_key(public_key)

cipher = PKCS1_OAEP.new(key)

encrypted_data = cipher.encrypt(data.encode('utf-8'))

return base64.b64encode(encrypted_data).decode('utf-8')

RSA解密

def rsa_decrypt(private_key, encrypted_data):

key = RSA.import_key(private_key)

cipher = PKCS1_OAEP.new(key)

encrypted_data = base64.b64decode(encrypted_data)

data = cipher.decrypt(encrypted_data)

return data.decode('utf-8')

示例

public_key = open('public.pem', 'rb').read()

private_key = open('private.pem', 'rb').read()

data = 'Hello, World!'

encrypted = rsa_encrypt(public_key, data)

print(f'Encrypted: {encrypted}')

decrypted = rsa_decrypt(private_key, encrypted)

print(f'Decrypted: {decrypted}')

三、哈希算法

哈希算法将任意长度的数据映射为固定长度的哈希值,常用于数据完整性校验和密码存储。Python中可以使用hashlib库来实现常见的哈希算法。

常见哈希算法示例

import hashlib

MD5哈希

def md5_hash(data):

md5 = hashlib.md5()

md5.update(data.encode('utf-8'))

return md5.hexdigest()

SHA-1哈希

def sha1_hash(data):

sha1 = hashlib.sha1()

sha1.update(data.encode('utf-8'))

return sha1.hexdigest()

SHA-256哈希

def sha256_hash(data):

sha256 = hashlib.sha256()

sha256.update(data.encode('utf-8'))

return sha256.hexdigest()

示例

data = 'Hello, World!'

print(f'MD5: {md5_hash(data)}')

print(f'SHA-1: {sha1_hash(data)}')

print(f'SHA-256: {sha256_hash(data)}')

四、其他加密算法和库

除了上述介绍的AES、RSA和哈希算法,Python中还有许多其他加密算法和库可供使用。例如,cryptography库提供了更高层次的加密功能,支持包括对称加密、非对称加密、数字签名和密钥管理等。

安装cryptography库

pip install cryptography

使用cryptography库实现AES加密和解密

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

from cryptography.hazmat.primitives import padding

from cryptography.hazmat.backends import default_backend

import os

AES加密

def aes_encrypt(key, data):

iv = os.urandom(16)

cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())

encryptor = cipher.encryptor()

padder = padding.PKCS7(algorithms.AES.block_size).padder()

padded_data = padder.update(data.encode('utf-8')) + padder.finalize()

encrypted_data = encryptor.update(padded_data) + encryptor.finalize()

return iv + encrypted_data

AES解密

def aes_decrypt(key, encrypted_data):

iv = encrypted_data[:16]

cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())

decryptor = cipher.decryptor()

decrypted_data = decryptor.update(encrypted_data[16:]) + decryptor.finalize()

unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()

data = unpadder.update(decrypted_data) + unpadder.finalize()

return data.decode('utf-8')

示例

key = os.urandom(32)

data = 'Hello, World!'

encrypted = aes_encrypt(key, data)

print(f'Encrypted: {encrypted.hex()}')

decrypted = aes_decrypt(key, encrypted)

print(f'Decrypted: {decrypted}')

使用cryptography库实现RSA加密和解密

from cryptography.hazmat.primitives.asymmetric import rsa, padding

from cryptography.hazmat.primitives import serialization, hashes

import base64

生成RSA密钥对

private_key = rsa.generate_private_key(

public_exponent=65537,

key_size=2048,

backend=default_backend()

)

public_key = private_key.public_key()

序列化密钥

private_pem = private_key.private_bytes(

encoding=serialization.Encoding.PEM,

format=serialization.PrivateFormat.TraditionalOpenSSL,

encryption_algorithm=serialization.NoEncryption()

)

public_pem = public_key.public_bytes(

encoding=serialization.Encoding.PEM,

format=serialization.PublicFormat.SubjectPublicKeyInfo

)

RSA加密

def rsa_encrypt(public_key, data):

public_key = serialization.load_pem_public_key(public_key, backend=default_backend())

encrypted_data = public_key.encrypt(

data.encode('utf-8'),

padding.OAEP(

mgf=padding.MGF1(algorithm=hashes.SHA256()),

algorithm=hashes.SHA256(),

label=None

)

)

return base64.b64encode(encrypted_data).decode('utf-8')

RSA解密

def rsa_decrypt(private_key, encrypted_data):

private_key = serialization.load_pem_private_key(private_key, password=None, backend=default_backend())

encrypted_data = base64.b64decode(encrypted_data)

data = private_key.decrypt(

encrypted_data,

padding.OAEP(

mgf=padding.MGF1(algorithm=hashes.SHA256()),

algorithm=hashes.SHA256(),

label=None

)

)

return data.decode('utf-8')

示例

data = 'Hello, World!'

encrypted = rsa_encrypt(public_pem, data)

print(f'Encrypted: {encrypted}')

decrypted = rsa_decrypt(private_pem, encrypted)

print(f'Decrypted: {decrypted}')

使用cryptography库实现数字签名

数字签名用于验证数据的完整性和真实性。常用的数字签名算法包括RSA和ECDSA。

RSA数字签名

from cryptography.hazmat.primitives.asymmetric import padding

from cryptography.hazmat.primitives import hashes

签名

def sign_data(private_key, data):

private_key = serialization.load_pem_private_key(private_key, password=None, backend=default_backend())

signature = private_key.sign(

data.encode('utf-8'),

padding.PSS(

mgf=padding.MGF1(hashes.SHA256()),

salt_length=padding.PSS.MAX_LENGTH

),

hashes.SHA256()

)

return base64.b64encode(signature).decode('utf-8')

验证签名

def verify_signature(public_key, data, signature):

public_key = serialization.load_pem_public_key(public_key, backend=default_backend())

signature = base64.b64decode(signature)

try:

public_key.verify(

signature,

data.encode('utf-8'),

padding.PSS(

mgf=padding.MGF1(hashes.SHA256()),

salt_length=padding.PSS.MAX_LENGTH

),

hashes.SHA256()

)

return True

except:

return False

示例

data = 'Hello, World!'

signature = sign_data(private_pem, data)

print(f'Signature: {signature}')

is_valid = verify_signature(public_pem, data, signature)

print(f'Is valid: {is_valid}')

ECDSA数字签名

from cryptography.hazmat.primitives.asymmetric import ec

生成ECDSA密钥对

private_key = ec.generate_private_key(ec.SECP256R1(), default_backend())

public_key = private_key.public_key()

序列化密钥

private_pem = private_key.private_bytes(

encoding=serialization.Encoding.PEM,

format=serialization.PrivateFormat.TraditionalOpenSSL,

encryption_algorithm=serialization.NoEncryption()

)

public_pem = public_key.public_bytes(

encoding=serialization.Encoding.PEM,

format=serialization.PublicFormat.SubjectPublicKeyInfo

)

签名

def sign_data(private_key, data):

private_key = serialization.load_pem_private_key(private_key, password=None, backend=default_backend())

signature = private_key.sign(

data.encode('utf-8'),

ec.ECDSA(hashes.SHA256())

)

return base64.b64encode(signature).decode('utf-8')

验证签名

def verify_signature(public_key, data, signature):

public_key = serialization.load_pem_public_key(public_key, backend=default_backend())

signature = base64.b64decode(signature)

try:

public_key.verify(

signature,

data.encode('utf-8'),

ec.ECDSA(hashes.SHA256())

)

return True

except:

return False

示例

data = 'Hello, World!'

signature = sign_data(private_pem, data)

print(f'Signature: {signature}')

is_valid = verify_signature(public_pem, data, signature)

print(f'Is valid: {is_valid}')

通过以上示例,我们可以看到Python中实现加密和解密的方法非常多样化,涵盖了对称加密、非对称加密、哈希算法以及数字签名等多种加密技术。根据具体的应用需求,可以选择合适的加密算法和库来保护数据的安全性。

相关问答FAQs:

如何在Python中选择合适的加密算法?
在Python中,有多种加密算法可供选择,包括对称加密和非对称加密。对称加密如AES(高级加密标准)适合处理大量数据,并且加密和解密使用相同的密钥,适合在信任环境中使用。非对称加密如RSA则适合在不安全的环境中传输密钥,因为它使用一对公钥和私钥进行加密和解密。选择合适的算法取决于您的具体需求,比如数据的敏感性、性能要求及实施复杂性。

如何使用Python库进行加密和解密操作?
Python提供了多个库用于实现加密和解密功能,最常用的库是cryptographyPyCryptoDome。使用cryptography库,可以轻松实现加密和解密操作,只需导入相应的模块,生成密钥后即可对数据进行加密。例如,使用AES算法时,可以设置块大小、填充方式等参数,确保数据安全。而使用PyCryptoDome则提供了类似的功能,用户可以根据自己的需求选择合适的库进行实现。

在Python中如何安全地存储和管理加密密钥?
加密密钥的安全存储至关重要。可以考虑使用环境变量或配置文件来存储密钥,同时确保这些文件的访问权限受到限制。此外,使用专门的密钥管理服务(如AWS KMS或Azure Key Vault)可以进一步增强密钥的安全性。这些服务不仅提供密钥生成和存储功能,还能提供访问控制和审计功能,确保密钥在使用过程中的安全性和合规性。

相关文章