📜  如何加密和解密字符串 python (1)

📅  最后修改于: 2023-12-03 15:08:31.510000             🧑  作者: Mango

如何加密和解密字符串 - Python

在项目开发中,经常需要对敏感数据进行加密传输或存储。Python中有很多现成的加密库可以使用。本文将介绍如何使用Python实现字符串的加密和解密。

加密方法

在Python中,常用的加密方法有:

  • 对称加密
  • 非对称加密
  • 哈希加密
对称加密

对称加密就是指加密和解密时使用的是同一个密钥的加密算法。这种加密算法的优点是加解密速度快,适合对大量数据进行加密处理。常用的对称加密算法有AES、DES、3DES等。下面示例使用AES加密算法:

import base64
from Crypto.Cipher import AES

def aes_encrypt(data, key):
    cipher = AES.new(key, AES.MODE_ECB)
    # 数据长度不足16位用空格补足为16位
    data = data + (16 - (len(data) % 16)) * ' '
    encrypted_data = cipher.encrypt(data.encode())
    return base64.b64encode(encrypted_data)

# 使用示例
data = 'hello world'
key = 'my_secret_key_123'

encrypted_data = aes_encrypt(data, key)
print(encrypted_data.decode())
3lFhOc8ThOeAJ7v1FC2QwQ==
非对称加密

非对称加密使用不同的密钥进行加密和解密,分别为公钥和私钥。公钥可以公开,任何人可以使用公钥进行加密。但解密必须使用私钥。常用的非对称加密算法有RSA、ECC等。下面示例使用RSA加密算法:

import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

def rsa_encrypt(data, public_key):
    rsa_key = RSA.importKey(public_key)
    cipher = PKCS1_v1_5.new(rsa_key)
    encrypted_data = cipher.encrypt(data.encode())
    return base64.b64encode(encrypted_data)

# 使用示例
data = 'hello world'
public_key = '''-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCKQKuTO7SQ4+XiuuV7AkkobKkS
DpJyB/QgV85UwKPZJgdKf1T9XzGxynOkmv/gOYWetk7SDta2Q1lV+imeRmW8/oXi
ZM9m1/RDBzKj/tWtWiIvYfF3ELJj51kSM73IqlHdpxpZzgGotrvx7klNlW8nYGog
rL5j/0nD5W0b8tsdQQIDAQAB
-----END PUBLIC KEY-----'''

encrypted_data = rsa_encrypt(data, public_key)
print(encrypted_data.decode())
Z/GtXwuX1LZj92WYWd8PRy70t3qJ82GjwPf36TtzjKkAG3qg3jfmcGvmRoCG/cow
CFbbj2fe/oPoUbOfwM2CKj/7V4Zl9u+b7VGAe6jweE30HJp++f+U6VwIECAwEAAQ==
哈希加密

哈希加密是将任意长度的消息压缩到一个固定长度的摘要中。不同的数据也有可能生成相同的摘要,但是通过摘要无法推导出原始数据。常用的哈希算法有MD5、SHA-1、SHA-256等。下面示例使用SHA-256算法:

import hashlib

def sha256_encrypt(data):
    m = hashlib.sha256()
    m.update(data.encode())
    return m.hexdigest()

# 使用示例
data = 'hello world'

encrypted_data = sha256_encrypt(data)
print(encrypted_data)
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
解密方法

对于哈希加密来说,无法进行解密。而对称加密和非对称加密都有相应的解密算法。下面给出示例:

对称解密

对称解密算法与加密算法相同,密钥也相同。下面示例使用AES解密算法:

def aes_decrypt(encrypted_data, key):
    cipher = AES.new(key, AES.MODE_ECB)
    decrypted_data = cipher.decrypt(base64.b64decode(encrypted_data))
    return decrypted_data.decode().rstrip()

# 使用示例
encrypted_data = '3lFhOc8ThOeAJ7v1FC2QwQ=='

decrypted_data = aes_decrypt(encrypted_data, key)
print(decrypted_data)
hello world
非对称解密

非对称解密使用私钥进行解密。下面示例使用RSA解密算法:

from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA

def rsa_decrypt(encrypted_data, private_key):
    rsa_key = RSA.importKey(private_key)
    cipher = PKCS1_v1_5.new(rsa_key)
    decrypted_data = cipher.decrypt(base64.b64decode(encrypted_data), None)
    return decrypted_data.decode().rstrip()

# 使用示例
encrypted_data = 'Z/GtXwuX1LZj92WYWd8PRy70t3qJ82GjwPf36TtzjKkAG3qg3jfmcGvmRoCG/cowCFbbj2fe/oPoUbOfwM2CKj/7V4Zl9u+b7VGAe6jweE30HJp++f+U6VwIECAwEAAQ=='
private_key = '''-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCKQKuTO7SQ4+XiuuV7AkkobKkSDpJyB/QgV85UwKPZJgdKf1T
9XzGxynOkmv/gOYWetk7SDta2Q1lV+imeRmW8/oXiZM9m1/RDBzKj/tWtWiIvYfF
3ELJj51kSM73IqlHdpxpZzgGotrvx7klNlW8nYGogrL5j/0nD5W0b8tsdQQIDAQAB
AoGAG03WjwrL5My5SmFfi5Ac2vYIy58j8Nb995n1X9RHSdL/VIW/8JI3qIXmtsgA
pzcNseY/uPGNt3+kGkX9pPsdVZbzrvMJTETQsVA0ftZZRWDhROyGDW0EwcOoCZVi
uHBQVlZ4h4i7VwUjwm+z1HvFosl6KVbfS15xtUzkr+UuVhECQQD+lM4f/Gw01K6g
y6eGMH6S8qK25+9XpG83TmTNGZcJ+2/1s/BIlfxBFsYJn8waA/X0+N9XtRb+ZK0e
psq3tqoZAkEAykPVtLkW1NAxrlfDz/cc1FFvdbduZGK8KAJ5gL5e5C5vQ1y+pW8O
cfDE0K7+o4RSJ/uV0Q4NA1snLk+BFwS6GwJBAMU0+XzGxRe3e1TUGUmJZ+zTjKsR
1QDglWl0sPupJ+bXtVPnF2QKce8IWvIINmFpqqpoaJ3qk+8KvGtLzg9qwGkCQEzN
HvSJNJaue5n5pk5l319I5XTFWvKkCK1kbONzZxNOxsdWpCX8Lhi0ei5/sRFh5Mie
WNEr8BvpeQXO9tPrClECQEBTRkUFdJuCtPp57gmGqC3bPtEjNTCVWRtL9B/G3xqF
zcedzMdObTtRmkOUvg7OfDmDMmEIMuzsYUsX9u/q7b4=
-----END RSA PRIVATE KEY-----'''

decrypted_data = rsa_decrypt(encrypted_data, private_key)
print(decrypted_data)
hello world
小结

本文介绍了Python中常用的加密和解密算法实现方法,包括对称加密、非对称加密和哈希加密。希望能对大家在项目开发中保障数据安全方面有所帮助。