RSA数分解

问题描述

RSA数是两个素数的乘积,例如 156287 = 373×419。问题是已知一个RSA数,如何在可接受的时间内将其分解为两个素数。

问题分析

这个问题是RSA非对称加密算法的核心。非对称的意思就是将一个大数分解质因数的时间远大于将两个素数乘起来的时间。
该问题的难点是指数增长的时间复杂度。即随着两个素数位数的增长,计算量呈指数增长。这被认为是不可解的。

问题求解

设RSA数为n,朴素的方法是穷举,即使用小于n的每一个数去除n,看看能否除尽。
另一个可能的改进是仅用小于n的素数去除n。这要求首先判定一个数是否是素数。
素数判定可用随机算法,虽然不完全准确,但不会影响问题的解决。

//n为大整数,c为概率值,最好设置为0,因为正的概率值显著影响计算时间
//判定是否为素数的方法为:isProbablePrime()
public static BigInteger factor(BigInteger n, int c) {
    BigInteger i = sqrt(n);
    while(true) {
        while (!i.isProbablePrime(c)) {
            n.mod(i).equals(BigInteger.ZERO);
            i = i.subtract(BigInteger.ONE);
        }
        if(n.mod(i).equals(BigInteger.ZERO))        break;
        i = i.subtract(BigInteger.ONE);
    }
    return i;
}

讨论

使用随机算法可以减少除数,但作用有限。因为在n以内的素数个数约为n/lnn个,这依然是指数增长。例如 n=10100n/lnn4.34×1097
因此RSA数分解问题依然难解。当前的记录是分解768位2进制(232位10进制数)。参见:https://en.wikipedia.org/wiki/RSA_Factoring_Challenge
然而,据我测算,使用Tianhe-2算半年,应该可以分解1024位2进制RSA数。

你可能感兴趣的:(算法)