将随机性添加到简单的RSA加密示例中

时间:2013-08-29 19:25:17

标签: python encryption cryptography public-key-encryption

我刚开始玩密码学& amp;公钥加密。我创建了一个小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!

2 个答案:

答案 0 :(得分:4)

  

使用GPG,如果您使用同一个密钥多次加密相同的文本,它每次都会提供不同的密文。

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

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

这样做的原因并不是使结果随机化,以便加密和解密速度更快 - 例如,IDEA比RSA快得多,因此在您的100KB数据和RSA上使用IDEA在整个100KB上,32字节的会话密钥比使用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)

答案 1 :(得分:2)

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