RSA加密与解密

RSA加密解密

关于公钥和私钥的加密解密问题

1. 简介

RSA(Rivest-Shamir-Adleman)是当前用于加密和解密信息的算法,它是一种非对称的密码学算法,非对称的含义就是加密和解密用的密钥是不同的,对称的加密算法类似于我们的门锁,加密解密都是通过我们的钥匙来实现的,是同一把钥匙,而对称加密是加密的钥匙是一把,大家都可以拥有这把钥匙,而解密的钥匙是另一把,而这把钥匙只能你有,其他人都没有。

RSA涉及的公钥和私钥,公钥表示每个人都可以知道,都可以使用它来进行加密信息的操作,而采用公钥加密的信息只能使用私钥来解密。而私钥的保存则是秘密性的,通过公钥计算私钥是非常复杂的。

2. RSA加密解密过程

RSA加密解密的过程可以通过以下步骤实现:

  • 选择两个大一些的随机的素数p和q,这两个数应该是保密的
  • 计算两者的乘积,n是公钥和私钥的模数

n = p ∗ q n = p*q n=pq

  • 计算欧拉系数

Φ ( n ) = ( p − 1 ) ( q − 1 ) \Phi(n) = (p-1)(q-1) Φ(n)=(p1)(q1)

  • 选择一个指数e,这个值需要满足下面的条件

$$
1 < e < \Phi(n)

,e与\Phi(n)互为素数
$$

  • 计算私钥d,私钥一般只保存在服务器,只有服务器能够知道私钥

d = ( 1 + x ∗ Φ ( n ) ) / e d = (1 + x*\Phi(n))/e d=(1+xΦ(n))/e

3. 加密解密示例

$$

  1. 选择两个较大的素数,p = 61,q = 53 \
  2. 计算n=pq=3233 \
  3. 计算\Phi(n)=(p-1)(q-1)=3120 \
  4. 选择e>1且与3120互为素数,e=17
  5. 计算d,d=(1+\Phi(n)*x)/17 \
    假设x=15,此时得到d=2753 \
    输出公钥组合(n=3233,e=17),私钥为d=2753

\ \ \
解密过程:假设加密的信息为"HI"=>89,即m=89 \

  1. 计算c=m^e mod n = 89^{17} mod 3233 = 99L \
  2. 利用私钥对传递的c进行解密:\
    m = c^d mod n = 99^{2753}mod 3233 = 89L \
  3. 通过89的映射可以解密出信息为"HI"
    $$

4. 代码示例

因为Python有专门的rsa的库,所以直接使用库来实现,上面的加密解密过程比较简略,大致是提供一个思路,真实的rsa的加密过程会更加的复杂,生成的私钥和公钥也会更加的复杂。

import base64
import rsa


class RSAEncrypt(object):
    """
    generate public and private key (生成公钥和私钥)
    encrypt passwd (加密数据)
    decrypt passwd (解密数据)
    """

    def __init__(self, filepath=None):
        """init filepath 获取公钥或私钥存储路径"""
        if filepath is None:
            filepath = './'
        self.filepath = filepath

    def generatekey(self):
        """public and private keys 生成公钥和私钥到指定的路径"""
        public, private = rsa.newkeys(1024)
        public_key = public.save_pkcs1().decode()
        private_key = private.save_pkcs1().decode()
        with open(self.filepath + 'private.pem', 'w') as f:
            f.write(private_key)
        with open(self.filepath + 'public.pem', 'w') as f:
            f.write(public_key)

    def encrypt(self, enstr):
        """encrypt string 加密数据 返回加密后的值"""
        with open(self.filepath + 'public.pem', 'r') as f:
            result = f.read()
        # 解析公钥赋值
        public = rsa.PublicKey.load_pkcs1(result)
        encrypt_data = rsa.encrypt(enstr.encode('utf-8'), public)
        return base64.b64encode(encrypt_data).decode('utf-8')

    def decrypt(self, destr):
        """decrypt string 解密数据 返回被加密的值"""
        with open(self.filepath + 'private.pem', 'r') as f:
            result = f.read()
        # 解析私钥赋值
        private = rsa.PrivateKey.load_pkcs1(result)
        decrypt_data = rsa.decrypt(base64.b64decode(destr), private)
        return decrypt_data.decode('utf-8')


if __name__ == '__main__':
    # 需要加密的信息
    message = 'encrypt the message'
    # 创建密钥生成对象
    rsa_obj = RSAEncrypt()
    # 生成公钥和私钥
    rsa_obj.generatekey()
    # 加密数据
    encrypt_data = rsa_obj.encrypt(message)
    print(encrypt_data)
    # 解密数据
    decrypt_data = rsa_obj.decrypt(encrypt_data)
    print(decrypt_data)

具体生成的公钥

-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAII5fBjZIqyipAsLcNbrcaRKO26UFj++WSSZbR/BSTYBHduI/6mcycYp
b1OobJlg6/6b3qQz72Yf7niEALMEtBIqE5Q5Gh30If4zV30VYcZybvLkeFKWaAJ5
8IGNL4KLc4+zXXxxloZ1KXSisFlVfqTLtJuDf5AZTpc/DaspBturAgMBAAE=
-----END RSA PUBLIC KEY-----

私钥

-----BEGIN RSA PRIVATE KEY-----
MIICYAIBAAKBgQCCOXwY2SKsoqQLC3DW63GkSjtulBY/vlkkmW0fwUk2AR3biP+p
nMnGKW9TqGyZYOv+m96kM+9mH+54hACzBLQSKhOUORod9CH+M1d9FWHGcm7y5HhS
lmgCefCBjS+Ci3OPs118cZaGdSl0orBZVX6ky7Sbg3+QGU6XPw2rKQbbqwIDAQAB
AoGAG16VlGtefEYakC+xYZpOYicv4ofBPVh2R9jvNHNdPbpyWgerJCzNw5ZFzaFi
YcIbF4IPAxffQumHJ1Em4M7l/qty1IRyaCYKQRvlO14AUutgkZeVQY0QYxuf0Uur
4uUtG4eD0oQc4Y/oSz6uTokqUxTsf8ai3ytorACEsZgOvQECRQDPwY6JKR6LkrXb
9FC8sSRih0Ce+J4Ue5IWXL4W2jNHoyJPjSyIHMkjCJ49l1vUgnUtF9/QkqzbBTPO
zsn4azD1g+IyawI9AKB27FUB58hvbpOgENDjUEaslrSC1l0x+BSV9hAAsy0pIB/9
ZMaKn2cyyu4vfiPNqwnRAmiHnEchIYzLwQJEVjGhpzpOF+4YUVc9n+uGgvJGVy4i
t7DE3U5A904z9Ea0V3jkvtvifwx2Smtfh/1QDBNZojkYSg4Qfn7AwLYIK/Q5hl0C
PQCOl99/0wejx9IdgXowBjAJ/ciWdEYF3yezM2fL5LNUiF0x0D1DaWAplqtaaf3P
1y4MtR1MwmWPl9N2iIECRA1RuoL/g81/K2PF0Ku9D30mM4SRejkTYEXCu4UUjZOK
AieW6qLrViU9Se0Bre/LIvrh4KkjEJhQCBrmrgNFYcDeb7ZE
-----END RSA PRIVATE KEY-----

4. 小结

RSA可能是平常用的比较多的,一直对加密解密就挺好奇的,从之前的面试HTTPs的过程中涉及到的非对称加密开始,就接触到关于公钥和私钥的两个概念,一直也没有去查找相关的加密解密的资料,这次是想起来了,所以谷歌上看了一些关于RSA算法的由来以及具体的实现,也加深了对RSA加密算法的理解,以及对对称加密和非对称加密的了解。

Keep thinking, keep coding! 2021年06月20日12:41:51 写于深圳

参考:

https://simple.wikipedia.org/wiki/RSA_algorithm#:~:text=RSA%20(Rivest%E2%80%93Shamir%E2%80%93Adleman,can%20be%20given%20to%20anyone.

RSA加密与解密_第1张图片

你可能感兴趣的:(Python,密码学,python)