Python中如何将无空格拼接的ndarray作为Serpent算法输入完成加密
Python实现方案
依赖安装
首先安装所需的第三方库:
pip install numpy pycryptodome
完整实现代码
import numpy as np from Crypto.Cipher import Serpent from Crypto.Util.Padding import pad from Crypto.Random import get_random_bytes # 1. 处理ndarray转无空格字符串 # 示例ndarray数据 image = np.array([0, 0, 0, 0, 0, 4, 4, 4, 0, 4, 4, 4, 0, 1, 4, 1]) # 拉平数组后逐元素转字符串拼接,适配任意维度的ndarray输入 plain_str = ''.join(map(str, image.flatten())) print("拼接后的字符串:", plain_str) # 输出为0000044404440141 # 2. Serpent加密逻辑 # 字符串转字节流,适配加密接口要求 plain_bytes = plain_str.encode("utf-8") # 生成256位(32字节)随机密钥,也可替换为自定义固定字节密钥,支持16/24/32字节三种长度 key = get_random_bytes(32) # 初始化Serpent加密器,示例使用ECB模式,如需更高安全性可更换为CBC/GCM等模式 cipher = Serpent.new(key, Serpent.MODE_ECB) # 对明文做PKCS7填充,适配Serpent128位(16字节)的块大小要求 padded_plain = pad(plain_bytes, Serpent.block_size) # 执行加密 ciphertext = cipher.encrypt(padded_plain) # 输出十六进制格式的密文,方便存储传输 print("加密后密文(十六进制):", ciphertext.hex())
注意事项
- 如果输入的图像ndarray是多维度的(比如常规的HW3彩色图像),
flatten()方法会自动按行优先顺序拉平为一维数组,保证拼接顺序和元素原始顺序一致 - 自定义密钥时必须传入字节类型,长度需为16字节(128位)、24字节(192位)或32字节(256位),不可直接传入字符串
- 如使用CBC等带偏移量的加密模式,需要额外生成和存储iv参数,解密时需同时使用密钥和iv才能还原数据
内容的提问来源于stack exchange,提问作者علاء الدين محمد العكايله
相关产品推荐
相关产品推荐

