在任何非对称加密规范中,都有一个步骤我们需要计算 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