我们如何将rsa算法的输出转换为数字。
密文:nq0V69S5fIactNrm0BvG3gI9u2uIU9VjPHVDiy45 / XKjKI7UAypjptmyI0OZQXWsEEvfaEPCJrGbPyPKpz7JSQ ==
将上述密文转换为20位数字
答案 0 :(得分:0)
如果我理解正确,您希望将密文转换为基数10(十进制)。
首先,您无法选择转换的输出大小,它具有固定的长度,具体取决于原始密文的长度和编码。
其次,在RSA中你已经得到了一个数字。
正如已经提到过的狡猾的ossifrage,你只需要将密文(可以看作是一个非常大的数字)转换为10。
答案 1 :(得分:0)
这个数字肯定大于20位数,因为评论中已经显示出捣蛋。
RSA算法当然产生一个数字,因为主要操作是模幂运算(即ct = m'^ e,其中m'是填充消息)。
但是,RSA PKCS#1规范要求执行一个名为Integer to Octet String Primitive或I2OSP的操作。这会将整数转换为无符号,固定大小的大端编码。八位字符串与字节数组相同。当以最小字节编码时,大小与模数/密钥大小相同。
您的字节数组是基于64位编码的,因此您首先需要对其进行解码,然后将其转换为整数。在默认情况下使用BigEndian编码的Java中,只是执行new BigInteger(1, Base64.decode(encodedCiphertext))
的问题,1
确保将其解释为正数(符号位的值)。
巧妙的小技巧:计算小数位数,只需将位数除以10,然后乘以3(和一位)。所以512位最多可以提供154个十进制数字。这只是不适合20位数字。
要在结果上创建一个数字,首先需要集中二进制结果的随机性,然后从中提取一个数字。
这可以通过以下方式执行:
为了确保二进制结果的分布相对较好,最好确保散列产生的数字远大于最大值。