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



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

使用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)

您需要的东西叫做"padding"。你应该在谷歌上搜索PKCS#1填充/OAEP填充。在现实世界中,加密消息不是由RSA直接加密的,而是添加了一些其他(伪随机)字节来增强加密,同时也增加了输出的随机性。

最新更新