PHP非对称加密(公钥加密私钥解密):RSA (RSA/ECB/PKCS1Padding)+base64_encode/bin2hex加密

所谓非对称,就是使用公钥/私钥加密,然后用对应的私钥/公钥解密

 1.配对的公钥,私钥:

//公钥(注意包括头(-----BEGIN PUBLIC KEY-----)尾(-----END PUBLIC KEY-----)标志)
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDbdq5NjtUEkAQ6wucPuhC0aRvSMsaX3GrhkwsLLdWZnVNVpkJRw
yPFq9HJNuntRw7P9Sb3TkwrpN60x62kZ6qV8h1GoG4jIfofuVWPv1VzudAV6kWJWMl3sc
+DtV5q1dy1KQLb6e90cuOynzxVT3j+Fx7ZOzovmdTkEcoRiYWV1QIDAQAB
-----END PUBLIC KEY-----


//私钥(注意包括头(-----BEGIN RSA PRIVATE KEY-----)尾(-----END RSA PRIVATE KEY-----)标志)
-----BEGIN RSA PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKBc0G8WmfydUuX6TnO5M3lSmNYqy8beEgBn24vWk6sWCZ2va+TRIWEew5dxmMXg5+N40a2XOJfyTxCALvzts+/J0q8efi2WIecPecWGNoDB8ZehGfzv3BQD5skk9sf1tL6ztU5tquPFajwmO85WR2pTFfk0CXgPEtLzPxntYfHpAgMBAAECgYB6DSo24qTgt3zYvOHpAhRDSrI4jun5uhtJY8Kdc/uAQ42eDl24EdOt75Q+N59nO/5CCzrLPEU+oJW8oVMh/mjr6gMv7QxhEr1iUrZmvAGTO2kB5sMgWfqPkiHeGddYWawcWGhAwQEJrrgGVldzaslY9FvWcmTjCjypEVvB7l1BgQJBAOJwB2RbRbI+z0d1M6DOawyu+J7JleMAQ42x9KyhiwYc/D0CZX0gkuyqGcwSh+c1CYjjdoRIh/531e1OZyBmRG0CQQC1TG68k+iXuz14+fgpHEttl2E3lQ6VfIzv+oaQHnRmmT92t2Eci70zkDFjVCGXxwQ279EokmP6RWfJG5Z1nV3tAkAZkHpVKzTQLeUq9SFyCzvsv6hUDQA+E56M1cWA4/AVLZqQrL+Wg+HylDW7Y3AyeztrV/rebm3kHdVqKEreTo11AkBPUou40nYXvQKeZbAgPJL79hnA+eSRnxcDAHfTop+HLFHKHV3N4Y38e4BAV1UDVT4Q00iOGc7Id4l7QijIePvZAkEA1OmJfbsaCx3T+4lZahzo8k7NzP5BS6izPVAVk8O3LHo3TggJZMa69Nc+8O82ZXOiOSt7bSONaST54ejjN8yhtg==
-----END RSA PRIVATE KEY-----

 2.判断openssl扩展是否安装

 extension_loaded('openssl') or die('PHP加密需要openssl扩展支持');

3.判断公钥和私钥是否可用 

//私钥文件路径   
$this->privateKey = file_get_contents(dirname(__FILE__) .'libraries/YCPAY/account/rsa_private_key.pem');

//公钥文件路径   
$this->publicKey = file_get_contents(dirname(__FILE__) . 'libraries/YCPAY/account/rsa_public_key.pem');  

/**
* 生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false
*/
$privateKey = openssl_pkey_get_private($this->privateKey);


/**
* 生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false
*/
$publicKey = openssl_pkey_get_public($this->publicKey);

($privateKey) or die('密钥不可用');
($publicKey) or die('公钥不可用');

4.公钥加密

由于openssl_public_encrypt()加密对加密串有字符限制(117字节),所有需要分段加密(每段32个字符,加密后拼接起来)

    define("BAOFOO_ENCRYPT_LEN", 32);    
    // 公钥加密
    function encryptedByPublicKey($data_content)
    {
        $publicKey = openssl_pkey_get_public($this->publicKey);
        $encrypted = "";
        $totalLen = strlen($data_content);
   
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供一些指导。 首先,您需要安装 PyCryptodome 库来实现 RSA 加密解密。可以使用以下命令安装: ``` pip install pycryptodome ``` 接下来,您需要编写 Python 代码来实现 RSA 加密解密。以下是一个示例代码: ```python from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP # 生成密钥对 key = RSA.generate(2048) # 获取公钥私钥 private_key = key.export_key() public_key = key.publickey().export_key() # 加密 def encrypt(message, public_key): cipher = PKCS1_OAEP.new(RSA.import_key(public_key)) ciphertext = cipher.encrypt(message.encode()) return ciphertext # 解密 def decrypt(ciphertext, private_key): cipher = PKCS1_OAEP.new(RSA.import_key(private_key)) message = cipher.decrypt(ciphertext).decode() return message ``` 您可以使用这个代码来加密解密文本消息。例如: ```python message = "Hello World!" ciphertext = encrypt(message, public_key) plaintext = decrypt(ciphertext, private_key) print(plaintext) ``` 最后,您可以使用 Python 的 GUI 库(如 tkinter、PyQt、wxPython 等)来创建一个图形化用户界面(UI),以便用户可以轻松加密解密文本消息。以下是一个使用 tkinter 的示例代码: ```python import tkinter as tk root = tk.Tk() # 输入框 input_label = tk.Label(root, text="Message:") input_label.pack() input_entry = tk.Entry(root) input_entry.pack() # 加密按钮 encrypt_button = tk.Button(root, text="Encrypt") encrypt_button.pack() # 输出框 output_label = tk.Label(root, text="Ciphertext:") output_label.pack() output_entry = tk.Entry(root) output_entry.pack() # 解密按钮 decrypt_button = tk.Button(root, text="Decrypt") decrypt_button.pack() def encrypt_message(): message = input_entry.get() ciphertext = encrypt(message, public_key) output_entry.delete(0, tk.END) output_entry.insert(0, ciphertext.hex()) def decrypt_message(): ciphertext_hex = output_entry.get() ciphertext = bytes.fromhex(ciphertext_hex) plaintext = decrypt(ciphertext, private_key) input_entry.delete(0, tk.END) input_entry.insert(0, plaintext) encrypt_button.config(command=encrypt_message) decrypt_button.config(command=decrypt_message) root.mainloop() ``` 这个示例代码创建了一个简单的 UI,其中包含一个输入框、一个加密按钮、一个输出框和一个解密按钮。当用户在输入框中输入文本消息并单击加密按钮时,该消息将被加密并显示在输出框中。当用户在输出框中输入密文并单击解密按钮时,该密文将被解密并显示在输入框中。 希望这些信息能够帮助您实现您的项目!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值