gpt4 book ai didi

python - 为简单的 RSA 加密示例添加随机性

转载 作者:太空狗 更新时间:2023-10-30 02:32:22 25 4
gpt4 key购买 nike

我刚刚开始研究密码学和公钥加密。我创建了一个小的 python 程序,它是 http://gnosis.cx/publish/programming/cryptology2.pdf 中给出的算法的直译。 (参见 RSA 示例部分)。代码如下。

使用 GPG,如果您使用相同的 key 多次加密相同的文本,每次都会给出不同的密文。是否可以将这种随机性添加到下面的程序中(无需求助于复杂的高级数学:P)?这样我每次加密都会得到不同的密文,并且仍然能够解密它?

def enc(message, pubkey) :
msg = [ord(char) for char in message]
e,n = pubkey
c = [m**e%n for m in msg]
return c

def dec(cipher, prikey) :
d,n = prikey
msg = [c**d%n for c in cipher]
msg = [chr(m) for m in msg]
message = ''.join(msg)
return message


p, q = 47, 71
n = p*q
e = 79
d = 1019

pubkey = (e, n)
prikey = (d, n)

msg = 'Hello World!'
print msg
cipher = enc(msg, pubkey)
for c in cipher : print c,
decipher = dec(cipher, prikey)
print '\n', decipher

它给出以下输出:

Hello World!
285 1113 1795 1795 2237 1379 1848 2237 2560 1795 1287 1260
Hello World!

最佳答案

Using GPG, if you encrypt the same text using the same key more than once, it gives different ciphertext each time.

大多数公钥密码系统实际上并不使用您的公钥加密您的数据。相反,他们会做这样的事情:

  • 生成一个随机的“ session key ”。
  • 使用您的公钥加密 session key (使用 RSA 或 ElGamal 等非对称密码)。
  • 使用 session key 加密明文(使用像 IDEA 或 CAST5 这样的对称密码)。
  • 将加密的 session key 和有关该过程的一些元数据附加到密文。

这样做的原因与其说是为了使结果随机,不如说是为了使加密和解密更快——例如,IDEA 比 RSA 快得多,所以在 100KB 数据上使用 IDEA,在你的数据上使用 RSA 32 字节的 session key 比在整个 100KB 上使用 RSA 快得多。

Is it possible to add that kind of randomness to the program below?

嗯,显然不可能在不更改程序以执行相同类型算法的情况下添加相同类型的随机性。但这可能正是您想要做的。

为简单起见,您可以只使用 PK 算法来加密 session key 和使用 session key 加密明文。您当然需要进行调整以生成 session key 对,使用私有(private) session key 加密明文,并加密公共(public) session key 以附加到消息中(反之亦然)。这对于学习目的可能很有用,即使它对现实生活中的程序没有用。

但是,即使出于学习目的,创建一个玩具对称算法可能仍然更好。因此,让我们创建一个 super 简单的 8 位 XOR 加密:

def symmetric_enc(message, key):
return [ord(char) ^ key for char in message]

def symmetric_dec(cipher, key):
return ''.join(num ^ key for num in cipher)

def asymmetric_enc(message, pubkey) :
msg = [ord(char) for char in message]
e,n = pubkey
c = [m**e%n for m in msg]
return c

def asymmetric_dec(cipher, prikey) :
d,n = prikey
msg = [c**d%n for c in cipher]
msg = [chr(m) for m in msg]
message = ''.join(msg)
return message

def enc(message, pubkey):
session_key = random.randrange(1, 256)
return (asymmetric_enc(session_key, pubkey),
symmetric_enc(message, session_key))

def dec(message, prikey):
session_key, body = message
session_key = asymmetric_dec(session_key, prikey)
return symmetric_dec(body, session_key)

关于python - 为简单的 RSA 加密示例添加随机性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18519441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com