python 得sm4加密
时间: 2025-03-27 17:38:33 浏览: 62
### Python 中实现 SM4 加密
为了在 Python 中实现 SM4 加密,可以使用 `pycryptodome` 库。这个库提供了强大的加密功能,并且支持多种加密算法,其中包括 SM4。
安装 pycryptodome 可以通过 pip 完成:
```bash
pip install pycryptodome
```
下面是一个简单的例子展示如何使用此库来进行 SM4 的加密和解密操作[^1]。
#### 密钥生成
SM4 是一种分组密码,其工作模式通常为 ECB 或 CBC。这里采用更安全的 CBC 模式作为示范。对于 CBC 模式来说,除了需要一个 128-bit 长度的秘密密钥外,还需要初始化向量 IV 来增强安全性。
```python
from Crypto.Cipher import SM4
import os
def generate_key():
"""Generates a random 16-byte key."""
return os.urandom(16)
key = generate_key()
iv = b'\x00' * 16 # Initialization Vector can be all zeros or any other fixed value.
print(f"Generated Key: {key.hex()}")
```
#### 数据填充
由于 SM4 处理的是固定大小的数据块(通常是 16 字节),因此当输入数据不是这些尺寸的确切倍数时,则需对其进行适当填充。在此处应用 PKCS#7 填充方案来满足这一需求。
```python
BS = 16 # Block size of SM4 algorithm.
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS).encode('utf-8')
unpad = lambda s : s[:-ord(s[len(s)-1:])]
data_to_encrypt = b'This is some secret message.'
padded_data = pad(data_to_encrypt)
print(f"Padded Data Length: {len(padded_data)} bytes.")
```
#### 加密过程
有了前面准备好的材料之后就可以创建 cipher 对象并执行实际的加密动作了。
```python
cipher = SM4.new(key=key, mode=SM4.MODE_CBC, iv=iv)
encrypted_message = cipher.encrypt(padded_data)
print(f"Encrypted Message Hex String: {encrypted_message.hex()}")
```
#### 解密过程
同样的方式也可以用于解码已编码的信息。
```python
decipher = SM4.new(key=key, mode=SM4.MODE_CBC, iv=iv)
decrypted_padded_message = decipher.decrypt(encrypted_message)
original_message = unpad(decrypted_padded_message)
print(f"Decrypted Original Message: {original_message.decode('utf-8')}")
```
以上就是利用 Python 和 `pycryptodome` 实现 SM4 加密的一个基本实例。
阅读全文
相关推荐


















