Python实现RSA加密时如何将字符串明文转换为可运算整数
问题根因
你之前直接拼接ASCII码字符串的方式不可逆,是因为不同字符的ASCII码位数不固定(可打印字符ASCII码范围为32~126,有2位、3位两种长度),解密时无法准确拆分拼接后的长串。
最优解决方案
推荐使用Python内置的字节与整数互转方法,完全可逆,是行业通用的RSA明文转换实现方式:
- 加密侧转换逻辑:
- 将输入的字符串按utf-8编码为字节序列
- 用
int.from_bytes()方法将字节序列转换为大端序整数,可直接代入RSA加密运算 - 注意转换后的整数必须小于RSA公钥的
n值,超出的话需要对明文做分块处理
- 解密侧还原逻辑:
- 解密得到明文整数后,用
int.to_bytes()方法将整数转回字节序列 - 对字节序列做utf-8解码,得到原始字符串
- 解密得到明文整数后,用
修改后的完整示例代码
# 示例RSA密钥(实际使用请生成2048位及以上的正式密钥) p = 61 q = 53 n = p * q e = 17 d = 2753 # 加密逻辑 m = input("Enter message: ") # 字符串转整数 m_bytes = m.encode('utf-8') m_int = int.from_bytes(m_bytes, byteorder='big') if m_int >= n: raise ValueError("明文太长,请使用更长的RSA密钥或对明文分块") # 用内置三参数pow做快速模幂,性能远高于m**e %n c = pow(m_int, e, n) print("Encrypted message = %d" % c) # 解密逻辑 decrypted_m_int = pow(c, d, n) # 整数转回字符串 decrypted_m_bytes = decrypted_m_int.to_bytes((decrypted_m_int.bit_length() + 7) // 8, byteorder='big') decrypted_m = decrypted_m_bytes.decode('utf-8') print("Decrypted message =", decrypted_m)
注意事项
- 实际生产环境不要用示例中的短密钥,至少使用2048位及以上长度的RSA密钥
- 如果需要加密长文本,不要直接用RSA加密整个文本,标准方案是用RSA加密随机生成的对称密钥,再用对称密钥加密长文本,性能更优
内容的提问来源于stack exchange,提问作者haxor_girl
相关产品推荐
相关产品推荐

