如何修改Python RSA加密代码以实现字符串分3字符块加密?
解决字符串适配RSA加密的修改方案
你的代码报错是因为直接将字符串传入了需要数值类型的加密函数,math.pow无法处理字符串。要实现按3字符分块的RSA加密,需要完成以下核心修改:
必须修改的核心点
- 字符串分块:将输入字符串分割为固定长度(3字符)的块,不足长度的补填充字符(如空格)。
- 字符串转整数:把每个字符块转换为RSA可处理的整数(基于ASCII编码映射)。
- 修正模幂运算:替换
math.pow为Python内置的pow(base, exp, mod),避免浮点精度问题,同时直接完成模运算。 - 适配分块加密逻辑:遍历所有分块,逐个加密后收集结果。
- 密钥参数调整(可选但必要):原密钥的
n = 521*757 = 394397,而3字符块转成的最大整数是256^3 -1 = 16777215,远大于n,违反RSA明文必须小于n的规则。因此要么换更大的素数让n>16777215,要么将分块大小改为2字符(256²=65536 < 394397)。
修改后的完整代码(3字符分块版本)
# 更换为更大的素数,确保n > 256^3(16777216) p = 4099 q = 4111 e = 11 n = p * q def chunk_string(s, chunk_size=3): # 将字符串分割为3字符一组,不足补空格 chunks = [] for i in range(0, len(s), chunk_size): chunk = s[i:i+chunk_size] if len(chunk) < chunk_size: chunk += ' ' * (chunk_size - len(chunk)) chunks.append(chunk) return chunks def str_to_int(s): # 将字符串转换为整数(按ASCII码的256进制组合) num = 0 for idx, char in enumerate(reversed(s)): num += ord(char) * (256 ** idx) return num def encrypt_block(plain_num): # 内置pow直接计算模幂,避免浮点错误 if plain_num >= n: raise ValueError(f"明文块数值{plain_num}大于n={n},请调整分块大小或密钥") return pow(plain_num, e, n) # 输入处理 message = input("Enter Plaintext: ") print("Original Message is: ", message) # 分块并执行加密 text_chunks = chunk_string(message) encrypted_blocks = [] for chunk in text_chunks: plain_num = str_to_int(chunk) encrypted = encrypt_block(plain_num) encrypted_blocks.append(encrypted) print("Encrypted Message Blocks: ", encrypted_blocks)
代码说明
- 分块函数:
chunk_string保证每个块长度一致,方便后续统一转换为整数。 - 字符串转整数:
str_to_int将每个字符的ASCII码按256进制加权计算,把3字符块映射为一个整数。 - 加密优化:
pow(plain_num, e, n)是Python专门优化的模幂运算,比先算幂再取模效率高得多,且不会出现浮点精度丢失。 - 密钥调整:选用的4099和4111都是素数,乘积
n=16850989大于3字符块的最大可能值,符合RSA加密要求。
如果不想更换密钥,只需将chunk_string的chunk_size改为2即可,无需调整p和q参数。
内容的提问来源于stack exchange,提问作者FunctionUndefined
相关产品推荐
相关产品推荐

