import base64
import time
import json

from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipher
from Crypto.PublicKey import RSA

PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----\n\
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDElMhAUOwyo78M97jDGlYvl1FZ\n\
JZV+/EKZ3G7VDO1T5uUNnXWqgxSSwobbd384/npxvfFznoeJ+PaM/fXFNeOGKL9N\n\
GrswS/jTmSdIUdoMQVbGuzrGUK1liK+L9VGxxCmbvJ1f+6iiOHUwZAx6AXA2Mk2s\n\
8LVtXFCoM5cZWG4GiQIDAQAB\n\
-----END PUBLIC KEY-----'


class RSAService:
    def __int__(self):
        pass

    def encrypt_public(self, phone) -> str:
        """
        使用公钥加密电话号码。

        该方法首先构建一个包含电话号码、时间戳和设备信息的数据字典，
        然后将该字典转换为JSON字符串，并将其编码为UTF-8字节流。
        接着，使用RSA公钥对这些数据进行加密，并将加密后的数据使用Base64进行编码，
        最后返回加密后的字符串。

        参数:
        phone -- 需要加密的电话号码。

        返回:
        加密后的电话号码字符串。
        """
        # 构建数据字典，包含电话号码、当前时间和设备信息
        data = {"phone": phone, "time": int(time.time() * 1000), "device": "python"}
        # 将数据字典转换为JSON字符串，并编码为UTF-8字节流
        msg = json.dumps(data).encode("utf8")
        # 使用RSA公钥创建加密器
        cipher = PKCS1_cipher.new(RSA.importKey(PUBLIC_KEY))
        # 使用RSA公钥加密数据，并使用Base64编码加密后的数据
        encrypt_text = base64.b64encode(cipher.encrypt(bytes(msg)))
        # 返回加密后的数据字符串
        return encrypt_text.decode('utf-8')


if __name__ == '__main__':
    rsaService = RSAService()
    msg = rsaService.encrypt_public(phone='13323232323')
    print(msg)
