4

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

使用 GPG,如果您多次使用相同的密钥加密相同的文本,则每次都会给出不同的密文。是否可以在下面的程序中添加这种随机性(不诉诸复杂的高级数学: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!
4

2 回答 2

4

使用 GPG,如果您多次使用相同的密钥加密相同的文本,则每次都会给出不同的密文。

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

  • 生成一个随机的“会话密钥”。
  • 使用您的公钥加密会话密钥(使用 RSA 或 ElGamal 等非对称密码)。
  • 使用会话密钥加密明文(使用对称密码,如 IDEA 或 CAST5)。
  • 将加密的会话密钥和有关进程的一些元数据附加到密文中。

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

是否可以在下面的程序中添加这种随机性?

好吧,如果不改变程序来执行相同的算法,显然不可能添加相同的随机性。但这可能就是你想要做的。

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

但是,即使出于学习目的,创建玩具对称算法可能仍然更好。所以,让我们创建一个超级简单的 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)
于 2013-08-29T20:16:28.943 回答
2

您需要它称为“填充”。你应该用谷歌搜索 PKCS#1 填充/OAEP 填充。在现实世界中,加密消息不是由 RSA 直接加密的——添加了一些其他(伪随机)字节以增强加密,同时也增加了输出的随机性。

于 2013-08-29T20:02:58.000 回答