计算如何加密和解密算法的时间复杂度?

时间:2013-01-30 22:56:10

标签: performance cryptography encryption-symmetric

我尝试计算以下算法的时间复杂度。

private void encrypt()
{
        M = new BigInteger(64,random);
        C = M.multiply(k).mod(N); // O(n^2)    
}

private void decrypt()
{
        kk= k.modinverse(N); // O(n^3)
        Mp = kk.multiply(c).mod(N); //O(n^2)
}

我计算时间复杂度了吗?

加密的时间复杂度为O(n ^ 2) 解密的时间复杂度为O(n ^ 3)+ O(n ^ 2)= O(n ^ 3)

1 个答案:

答案 0 :(得分:2)

您的分析可能更详细使用更好的界限进行数字倍增。它应该包含更多详细说明您在哪里获得使用过程的复杂性。

对于乘以大数字,您可以使用Karatsuba algorithmSchönhage–Strassen algorithm转到O(n^1.585)或更低(有关详细信息,请参阅链接的维基百科页面)。

构造一个新的整数并计算模N的结果,其复杂性不会比线性更差。

因此,encrypt程序的复杂性取决于所选的乘法算法

decrypt()程序也是如此。我不知道你在哪里得到modinverse的复杂性。 Modular multiplicative inverse最多可以计算O(n^2)

模块化逆向维基百科页面中给出的复杂度为O(log(M)^2),使用数字的值表示,我们计算逆数。您的分析(通常在处理数论算法时完成)使用数字长度而不是它们的值,这使得复杂度O(N^2)