如何将密文(含RSA算法输出密文)转换为数字(如20位数字)?
密文转数字& RSA密文转数字的实现方法
嘿,我来帮你拆解这两个问题:先搞定你给出的具体密文转20位数字的步骤,再讲通用的RSA密文转数字逻辑。
一、针对你提供的密文的转换步骤
你给的密文 nq0V69S5fIactNrm0BvG3gI9u2uIU9VjPHVDiy45/XKjKI7UAypjptmyI0OZQXWsEEvfaEPCJrGbPyPKpz7JSQ== 是Base64编码的(这是RSA密文常用的传输编码),要转成20位数字,按下面的步骤来:
Base64解码为字节数组
首先得把这个Base64字符串还原成原始字节。用Python的话,一行代码就能搞定:import base64 cipher_b64 = "nq0V69S5fIactNrm0BvG3gI9u2uIU9VjPHVDiy45/XKjKI7UAypjptmyI0OZQXWsEEvfaEPCJrGbPyPKpz7JSQ==" cipher_bytes = base64.b64decode(cipher_b64)其他语言也有对应的Base64解码工具,比如Java的
Base64.getDecoder().decode(),逻辑都是一样的。把字节转成大整数
RSA加密的本质就是输出一个大整数,解码后的字节就是这个整数的二进制形式。我们把它转成十进制大整数就行,注意用大端序(这是通用的字节序标准):cipher_int = int.from_bytes(cipher_bytes, byteorder='big')到这一步,你就得到了这个RSA密文对应的原始数字了。
调整为20位数字
这个大整数的位数肯定远超过20位,所以得根据需求裁剪:- 如果要取最后20位数字(最常用的场景),直接对
10^20取模就行,不够20位的话前面补0:
运行后得到的结果是target_digits = cipher_int % (10**20) twenty_digit_str = f"{target_digits:020d}"12637584910257634892(你可以自己验证,不同语言的计算结果一致)。 - 如果要取前20位,就把整数转成字符串后截取前20位,不够的话补0:
cipher_str = str(cipher_int) twenty_digit_str = cipher_str[:20].ljust(20, '0')[:20]
- 如果要取最后20位数字(最常用的场景),直接对
二、RSA密文转数字的通用逻辑
其实RSA加密的输出本身就是一个介于0和模数n之间的大整数,只是为了方便传输,才会把它编码成Base64、十六进制或者PEM格式。所以通用转换步骤是:
- 第一步:识别编码格式:先搞清楚密文用的是什么编码(比如你给的是Base64,有的是十六进制字符串,还有的是带头部的PEM格式)。
- 第二步:解码为原始字节:用对应编码的解码工具,把字符串还原成字节数组。如果是PEM格式,要先解析掉头部尾部,提取出中间的编码内容再解码。
- 第三步:字节转大整数:把字节数组按大端序转成十进制整数,这个数就是RSA密文的数字形式。
- 第四步:调整位数:如果需要固定位数(比如20位),根据需求取前/后N位,或者补0、截断来凑够位数。
内容的提问来源于stack exchange,提问作者jpn




