非对称加密如何快速完成

计算科学 效率
2021-12-12 04:23:33

在任何非对称加密规范中,都有一个步骤我们需要计算 data ^ public_key mod e以获取encrypted_data,并且还需要使用 解密encrypted_data ^ private_key mod e建议密钥长度约为 2048 位,考虑到我们要加密一些小的东西,比如说 256 位数据,并且根据规范,我们必须计算(2^256) ^ (2^2048),其中,(2^256)我们的数据有多大, 而且,(2^2048)我们的 public_key 有多大。我什至无法想象结果会有多大,它似乎不可能在几秒钟内计算出来,但是另一方面,如果你尝试下面的代码,它的计算不到一秒钟。

那么,它是如何完成的呢?如何计算像这样具有非常高指数的数字?我错过了什么还是有一个技巧可以快速计算出来?


from time import time
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa
message = b"encrypted data encrypted data encrypted data"

private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
)
start_time = time()
ciphertext = private_key.public_key().encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
end_time = time()
print(type(private_key))
end_time-start_time
1个回答

假设底数和指数都是整数,并且指数是非负数,那么进行取幂的标准方法是通过平方取幂。这种技术在进行模幂运算时特别有效(这是非对称密码学应用程序所需要的)。

此外,假设指数是先验已知的并且是固定的,我们可以通过计算它的加法链来做得更好。对于某些指数,这节省了大量计算时间,但代价是(有时)显着增加了内存使用量。

如果除法可以很便宜地完成——在模算术中,除法是乘法逆运算,这通常计算成本很高——你可以通过使用加减链来节省另外 1 或 2 个基本运算。根据明文的大小,这也可以显着减少计算时间。

您还可以进行低级(CPU 指令级)优化来加快代码速度。