Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

python sm4加密

作者:终生卟离   发布日期:2025-03-30   浏览:77

from Crypto.Cipher import SM4
from Crypto.Random import get_random_bytes

# 生成一个16字节的随机密钥
key = get_random_bytes(16)

# 创建SM4加密对象
cipher = SM4.new(key, SM4.MODE_ECB)

# 要加密的明文,必须是16字节的倍数
plaintext = b'This is a secret message'

# 如果明文不是16字节的倍数,需要进行填充
block_size = 16
padding_length = block_size - len(plaintext) % block_size
padded_plaintext = plaintext + bytes([padding_length] * padding_length)

# 加密过程
ciphertext = cipher.encrypt(padded_plaintext)

print("Ciphertext:", ciphertext.hex())

# 解密过程
decrypted_padded_plaintext = cipher.decrypt(ciphertext)

# 去除填充
unpadded_plaintext = decrypted_padded_plaintext[:-decrypted_padded_plaintext[-1]]

print("Decrypted plaintext:", unpadded_plaintext.decode())

解释说明:

  1. 生成密钥:使用 get_random_bytes(16) 生成一个16字节的随机密钥。SM4算法要求密钥长度为16字节。
  2. 创建加密对象:使用 SM4.new(key, SM4.MODE_ECB) 创建一个SM4加密对象,这里使用ECB模式(电子密码本模式)。实际应用中建议使用更安全的模式如CBC或GCM。
  3. 填充明文:SM4要求明文长度是16字节的倍数。如果明文不是16字节的倍数,则需要进行填充。这里采用PKCS7填充方式。
  4. 加密过程:调用 cipher.encrypt(padded_plaintext) 对填充后的明文进行加密,返回加密后的密文。
  5. 解密过程:调用 cipher.decrypt(ciphertext) 对密文进行解密,返回填充后的明文。
  6. 去除填充:解密后需要去除填充部分,恢复原始明文。

注意:此示例使用了ECB模式,实际应用中建议使用更安全的模式如CBC,并且需要处理密钥的安全存储和传输问题。

上一篇:python字符转换数字

下一篇:python空格字符串怎么打

大家都在看

python时间格式

python ord和chr

python list.pop

python的for i in range

npm config set python

python代码简单

python读取文件夹

python中turtle

python 输出时间

python中list代表什么

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站