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

标签 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)

最佳答案

您的分析可以更详细,并使用更好的界限进行数字乘法。它应该包含更多关于您从哪里获得所用过程的复杂性的详细说明。

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

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

因此,加密过程的复杂性将取决于所选的乘法算法

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

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

关于performance - 如何计算算法的加密和解密时间复杂度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14615444/

相关文章:

javascript - 在 JavaScript 中搜索子字符串时,哪种解决方案执行得更快?

encryption - AES 输出 block 大小

可以在 C 中优化通过将数据与自身进行异或运算来对内存进行归零吗?

c - AES CTR对称加解密

encryption - HTTPS 使用非对称或对称加密?

php - 一个文件夹中有 100 万个或更多文件,用于包含(缓存)

c++ - 为什么 {fmt} 比 std::stringstream 慢?

performance - 在 Akamai 中压缩内容

java - 为什么人们使用 bouncycaSTLe 而不是 Java 的内置 JCE 提供程序?有什么区别?

java - 仅根据密码生成 AES key