目录

看RSA加解密源码有感

目录
注意
本文最后更新于 2022-04-16,文中内容可能已过时。

看了下python对于RSA算法的实现,不由得感叹,用算法解决的问题的强大在于复杂理论的支撑。在工程上的实现反而极为简单。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def encrypt_int(message: int, ekey: int, n: int) -> int:
    """Encrypts a message using encryption key 'ekey', working modulo n"""

    assert_int(message, 'message')
    assert_int(ekey, 'ekey')
    assert_int(n, 'n')

    if message < 0:
        raise ValueError('Only non-negative numbers are supported')

    if message > n:
        raise OverflowError("The message %i is too long for n=%i" % (message, n))

    return pow(message, ekey, n)


def decrypt_int(cyphertext: int, dkey: int, n: int) -> int:
    """Decrypts a cypher text using the decryption key 'dkey', working modulo n"""

    assert_int(cyphertext, 'cyphertext')
    assert_int(dkey, 'dkey')
    assert_int(n, 'n')

    message = pow(cyphertext, dkey, n)
    return message

加密: 对明文数字乘ekey次方再模上n得到密文数字。

解密: 对密文数字乘dkey次方再模上n得到明文数字。

若想要破解: n是公开的。未知的是明文数字和dkey。由于存在两个未知数,在不知道dkey的情况下求解不出正确的明文数字。 ekey和dkey两个数字就是一对公私钥。


首先要明确一点,私钥加密的数据,公钥能解密。公钥加密的数据,私钥可以解密。原理就是如上所说的数学原理。但是要根据使用场景按照规则来玩。

  • 加密数据场景

公钥加密,私钥解密。公钥是公开的,私钥是保密的。在这种场景下,私钥不能用来加密数据,否则别人使用公开的公钥,是可以解密数据的。如果要互相加密通讯,保证数据安全性,则双方需要持有对方的公钥。

  • 验证签名场景

私钥加密,公钥解密。即私钥对明文内容做签名,然后把签名结果,内容和公钥一起公布出去。公钥可以解密私钥加密的东西,进而能验证内容是否和签名解密出来的是否是否一致。这里利用了私钥的私有性。也叫数字信封。证实了内容确实是由私钥的持有人发出的。这种场景不能保证数据的安全性,因为内容已经明文公布。

结合这两种场景,在实际运用中就是先 签名加密