zoukankan      html  css  js  c++  java
  • python tkinter 实现 带界面(GUI)的RSA加密、签名

    代码环境,python3.5.2

    RSA加密的过程是:使用公钥加密,私钥解密

    RSA签名的过程是:使用私钥签名,公钥验证

    所以核心代码就是,生成公钥私钥,使用公钥私钥分别进行加密解密。

    在实际编码的时候,使用python自带的RSA库,需要特别处理编码问题,因为默认的加密解密函数是接收bytes类型的数据。

    加密的核心代码如下:

    # -*- coding: utf-8 -*-
    import rsa
    import base64
    (public_key, private_key) = rsa.newkeys(1024)
    msg = "M2Crypto python关于RSA的库还是蛮多的,当然也可以直接用openSSLqweasasd123"
    msg = msg.encode(encoding="utf-8")
    encrypt_msg = rsa.encrypt(msg, public_key)
    
    decrypt_msg = rsa.decrypt(encrypt_msg, private_key)
    print("公钥:")
    print(public_key.save_pkcs1().decode('utf8'))
    print("
    私钥:")
    print(private_key.save_pkcs1().decode('utf8'))
    print("
    原始文本:")
    print(msg.decode('utf8'))
    print("
    加密后的文本:")
    print(base64.encodebytes( encrypt_msg).decode('utf8'))
    print("
    解密后的文本:")
    print(decrypt_msg.decode('utf8'))

    输出结果如下:

      

    结合tkinter的代码如下,使用tkinter是因为绘制界面很简单:

    # -*- coding:utf-8 -*-
    from tkinter import *
    import rsa
    import base64
    
    def GenerateKey():
        (public_key, private_key) = rsa.newkeys(1024)
        print("
    生成公钥:"+public_key.save_pkcs1().decode('utf8'))
        print("
    生成私钥:"+private_key.save_pkcs1().decode('utf8'))
        publicKeyText.delete(0.0, END)
        publicKeyText.insert(END, public_key.save_pkcs1().decode('utf8'))
        
        privateKeyText.delete(0.0, END)
        privateKeyText.insert(END, private_key.save_pkcs1().decode('utf8'))
    
    def EncryptionByPublickey():           #用公钥加密
        public_key_str = publicKeyText.get("0.0", "end").encode(encoding="utf-8")
        public_key = rsa.PublicKey.load_pkcs1(public_key_str)
        
        entry_str = entryText.get("0.0", "end").encode(encoding="utf-8")
        
        encrypt_msg = rsa.encrypt(entry_str, public_key)
        print("公钥加密后的文本为:
    "+base64.encodebytes(encrypt_msg).decode('utf8'))
        outputText.delete(0.0, END)
        outputText.insert(END, base64.encodebytes(encrypt_msg).decode('utf8'))
        
    def EncryptionByPrivatekey(): 
        private_key_str = privateKeyText.get("0.0", "end").encode(encoding="utf-8")
        private_key = rsa.PrivateKey.load_pkcs1(private_key_str)
        
        entry_str = entryText.get("0.0", "end").encode(encoding="utf-8")
        
        encrypt_msg = rsa.encrypt(entry_str, private_key)
        print("私钥加密后的文本为:
    "+base64.encodebytes(encrypt_msg).decode('utf8'))
        outputText.delete(0.0, END)
        outputText.insert(END, base64.encodebytes(encrypt_msg).decode('utf8'))  
        
    def DeryptionByPublickey(): 
        public_key_str = privateKeyText.get("0.0", "end").encode(encoding="utf-8")
        public_key = rsa.PrivateKey.load_pkcs1(public_key_str)
        
        entry_str = entryText.get("0.0", "end").encode(encoding="utf-8")
        encrypt_msg = base64.decodebytes( entry_str)
        outputText.delete(0.0, END)
        
        try:
            decrypt_msg = rsa.decrypt(encrypt_msg, public_key)
            print("公钥解密后的文本为:
    "+decrypt_msg.decode('utf8'))
            outputText.insert(END,decrypt_msg.decode('utf8'))
        except:
            decrypt_msg = "公钥解密失败"
            print(decrypt_msg)
            outputText.insert(END,decrypt_msg)
    def DecryptionByPrivatekey(): 
        private_key_str = privateKeyText.get("0.0", "end").encode(encoding="utf-8")
        private_key = rsa.PrivateKey.load_pkcs1(private_key_str)
        
        entry_str = entryText.get("0.0", "end").encode(encoding="utf-8")
        encrypt_msg = base64.decodebytes( entry_str)
        outputText.delete(0.0, END)
        
        try:
            decrypt_msg = rsa.decrypt(encrypt_msg, private_key)
            print("私钥解密后的文本为:
    "+decrypt_msg.decode('utf8'))
            outputText.insert(END,decrypt_msg.decode('utf8'))
        except:
            decrypt_msg = "私钥解密失败"
            print(decrypt_msg)
            outputText.insert(END,decrypt_msg)
    
    
    window = Tk()    
    window.title("RSA加密解密软件")
    
    frame = Frame(window)
    frame.pack()
    
    label = Label(frame, text = "公钥:")
    label.grid(row = 1, column = 1,columnspan= 4)
    
    publicKeyText = Text(frame,width=50,height=8)
    publicKeyText.grid(row = 2, column = 1,columnspan = 4)
    
    label = Label(frame, text = "私钥:")
    label.grid(row = 3, column = 1,columnspan= 4)
    
    privateKeyText = Text(frame,width=50,height=12)
    privateKeyText.grid(row = 4, column = 1,columnspan = 4)
    
    btGenerateKey = Button(frame, text = "生成公钥/私钥",command=GenerateKey)
    btGenerateKey.grid(row = 5, column = 1,columnspan = 4)
    
    label = Label(frame, text = "请输入加密/解密的文本:")
    label.grid(row = 6, column = 1,columnspan = 4)
    
    entryText = Text(frame,width=50,height=5)
    entryText.grid(row = 7, column = 1,columnspan = 4)
    
    btEncryptionByPublickey = Button(frame, text = "公钥加密",command=EncryptionByPublickey)
    btEncryptionByPublickey.grid(row = 8, column = 1,pady = 10)
    
    btDeryptionByPublickey = Button(frame, text = "公钥解密",command=DeryptionByPublickey)
    btDeryptionByPublickey.grid(row = 8, column = 2)
    
    btEncryptionByPrivatekey = Button(frame, text = "私钥加密",command=EncryptionByPrivatekey)
    btEncryptionByPrivatekey.grid(row = 8, column = 3)
    
    btDecryptionByPrivatekey = Button(frame, text = "私钥解密",command=DecryptionByPrivatekey)
    btDecryptionByPrivatekey.grid(row = 8, column = 4)
    
    outputText = Text(frame,width=50,height=5)
    outputText.grid(row = 9, column = 1,columnspan = 4)
    
    print("欢迎使用本软件……")
    GenerateKey();
    mainloop()
    
    print("欢迎再次使用本软件……")

    加密过程:

      使用公钥加密:

       使用私钥解密:

    数字签名过程:

      使用私钥签名:

     

      使用公钥验证:

     

  • 相关阅读:
    JAVA中的内存分配精讲
    java.util.date与java.sql.date
    Java的(PO,VO,TO,BO,DAO,POJO)解释
    Java 编程技术中汉字问题的分析及解决
    Java快捷键制作
    java常用类的使用方法
    高并发之——SimpleDateFormat类的线程安全问题和解决方案
    线程不安全的SimpleDateFormat
    Session不香吗,为什么还要Token?
    Cookie、Session和Token的区别
  • 原文地址:https://www.cnblogs.com/youmuchen/p/8274783.html
Copyright © 2011-2022 走看看