20212312 应万里 Python综合实践——基于国密算法的数字版权确认与管理设计

20212312应万里 2024-05-29 11:03:17

20212312 应万里 Python综合实践

1.实验分析

1.1实验作品背景摘要

随着信息技术的飞速发展,数字化作品的数量不断增多,利用数字版权可以确定数字化产品的归属,增强对作品的保护。但是现行的保护机制仍然存在许多的不足,无论是创新成果被滥用,还是盗取他人版权,都反映出数字版权缺乏管理措施,数字化产品保护体系不成熟,维护数字化产品的版权难度较大的现状。针对数字版权管理上的难题,我们提出了可以登记版权与管理版权的方案。

1.2实验设计

1.2.1实验原理

img

2.实验方案设计

2.1.基于国密算法的数字版权确认方案

基于国密算法的数字版权登记协议的执行过程分为五个阶段:提交申请、验证申请、存储作品、公布版权与返回结果。其中第一个阶段由登记用户完成,第二个阶段与第四个阶段由平台完成,第三个阶段由平台与云存储服务器共同完成,第五个阶段由平台和登记用户完成。下面对上述五个阶段进行具体描述:
(一)提交申请
登记用户注册后生成账户地址与公私钥,对作品、作品相关信息和用户身份编号进行打包,并生成作品登记信息,数字签名和作品信息摘要,随后将作品登记申请发送给登记平台。
(二)验证申请
登记平台收到登记用户的作品登记申请后,主要分三步对登记申请进行验证:
(1)验证用户的数字签名与登记信息的完整性
平台通过用户的身份编号查询到用户的公钥后对签名值进行验证,根据验证结果对作品和作品相关信息的完整性进行验证后生成验签结果,保证用户所发送作品的登记信息没有被修改。若用户的数字签名通过验证,即签名值有效,保证作品登记信息未被篡改,即作品与作品相关信息没有被破坏,继续后续操作,否则终止验证。
(2)验证登记作品的唯一性
平台验证用户的签名值有效后,根据作品信息摘要查询已登记的记录中有无此作品,返回作品的查询结果后平台生成唯一性验证结果,保证作品没有重复登记。
(3)生成验证结果
平台根据验签结果与唯一性查询结果生成作品登记申请的验证结果与数字签名,并将结果返回给用户。
(三)存储作品
平台将作品登记申请的验证信息发送给用户,提醒用户已经接收到作品登记信息,将作品及相关信息完整性的验证结果以及作品唯一性查询的检查结果告知用户,表明用户的作品登记请求受理成功,或者告知用户登记申请的签名无效、登记信息未通过完整性检验或作品已登记。同时平台将通过登记申请验证的作品保存到服务器中。
平台将作品登记申请的验证信息返回给用户,为了保证平台对验证登记申请的不可否认性,平台将数字签名与验证结果一起发送给用户,并将作品保存到云存储服务器中;
对于版权证书的存储,其中包括作品版权信息,完整性证明值,将其公布到版权存储目录上,既能保证版权证书不能被篡改,又保证服务器中存储的作品内容不可篡改,最后登记平台根据版权证书的公布结果,将版权证书的存储结果返回给用户,完成用户的作品登记操作。
(四)公布版权
平台生成作品信息摘要与版权证书编号后,与作品登记申请、登记申请的验证信息、数字签名打包生成作品版权证书,根据版权公布请求将版权公布交易发布到版权目录上,验证平台签名后检查云存储服务器中是否已经保存此作品,若服务器成功保存则将作品版权证书上链存储,否则存储失败,返回版权证书公布的结果。
(五)返回结果
平台将作品版权证书的公布结果返回给用户,提醒用户作品的版权证书已经成功存储到证书目录上并进行公示。
确权方案流程图:

img

2.2.基于国密算法的数字版权验证与查询方案

基于国密算法的数字版权验证协议的执行过程分为四个阶段:提交申请、验证版权证书、验证作品完整性与返回结果。其中第一个阶段由验证用户完成,第二、三个阶段由平台完成,第四个阶段由平台和用户完成。下面对上述四个阶段进行具体描述:
(一)提交申请
验证用户将版权证书编号和用户编号作为版权验证申请发送给验证平台。
(二)验证版权证书
验证平台收到验证用户的版权验证申请后,对版权证书进行验证的流程如下:生成作品版权证书查询请求后将版权查询交易发送给平台,平台根据发出验证请求的登记用户签名,和版权证书中登记用户数字签名进行验证,根据两次验签结果生成对作品版权证书的验证结果,若不同,则验签失败,那么证明该验证请求是不真实且不可信的,否则签名有效,可以查看版权证书。
(三)验证作品完整性
若平台通过对作品版权证书的验证,平台对该用户的版权证书中各个模块或其中一个模块存储的加密后的作品信息进行哈希运算,再与之前生成证书时存储的摘要值进行比对,如果二者相同,则证书并没有被修改,判断服务器中的作品没有被破坏,执行完成后返回验证结果。
(四)返回结果
平台根据完整性验证结果与数字签名的验证结果生成作品版权的验证结果并发送给用户。

验证方案流程图:

img

3.算法设计

3.1.数字版权确认算法设计

用户提交的作品登记信息PR,其中包括作品Pro,作品信息PI,用户身份ID,平台对用户的作品登记申请的验证算法主要包括三个方面的内容:
其一是对用户数字签名 Sig与登记信息MES的验证,保证用户签名值的有效性与登记申请的完整性:
(1)根据公钥查询函数,通过用户身份编号查询到用户公钥UPK;
(2)根据验签函数verify对数字签名Sig进行验证。验签函数使用公钥UPK对Sig进行解析得到所获取作品登记信息的摘要值,对待验证PR的进行哈希计算生成消息摘要值,对比两个摘要值,若一致则签名有效,否则无效。保证此登记申请确实来自该用户(因为其中包括用户ID),生成验签结果VSA,验证完成后生成验签结果。若用户的签名有效,那么就保证此用户发送的PR未被篡改,也就保证了作品内容与作品相关信息的完整性。否则,签名无效就不进行下一步的唯一性查询操作。
其二是对作品内容进行验证,保证登记作品的唯一性:
(1)根据哈希函数hash,计算作品登记信息中待检查作品的摘要值dig;
(2)遍历所有在云服务器中存储的版权作品,将其中的摘要值与本次登记的作品摘要值比对,若不存在作品使得二者哈希值相同,则说明该作品为首次登记,否则返回已登记作品的版权证书信息,执行完成后平台返回作品唯一性查询结果ans。
其三是对验证结果的确认,利用数字签名保证平台对于登记申请信息的完整性与验证操作的不可否认性:
(1)根据哈希函数 hash 对作品登记信息求摘要值digest;
(2)将digest与用户签名值Sig、平台对用户签名值的验签结果VSA、作
品唯一性查询结果ans和平台身份编号 id 打包生成作品登记申请的验证结果VRA;
(3)根据签名函数sign对VRA求签名值。签名算法sign利用哈希函数hash对VRA取摘要后用私钥sk对其加密生成VRASIG;
(4)将VRASIG与VRA打包生成作品登记申请的验证信息。
最后,平台用自己的公钥对作品的内容进行加密,连同平台的签名值,用户的签名值,登记申请的验证信息和完整性证明值打包存储到云服务器中。

3.2.数字版权验证算法设计

作品的版权证书验证算法定义为testverify,其中验证用户定义为VU(Verify User),验证平台定义为VP(Verify Platform),平台收到用户的版权验证申请后,对数字版权的验证主要包括三个方面的内容,以下是对算法的具体说明:
其一是对作品版权进行查询,保证验证的有效性:
(1)根据用户的版权验证请求AS判断是否进行哈希运算,AS分为两种情况,如下页图:

img

若验证申请的发起者提交了作品,那么根据哈希函数 hash 计算待验证版权信息对应的作品 Pro 摘要dig_Pro,若用户没有作品则提交要验证的版权证书编号WID;
(2)平台收到后再利用申请者的公钥进行验签,通过后再进一步查询,否则终止查询。
(3)将AS作为查询的参数,发布版权证书查询交易来对目录中满足条件的版权记录进行查询,若找到则返回版权证书,否则返回空且不再进行下一步的版权验证操作,执行完之后返回版权证书查询结果CLQR。
其二是对登记平台的数字签名进行验证,保证版权信息的真实性、完整性与登记平台的不可否认性:如果平台接收到返回的版权查询结果不为空时,即:CLQR不等于NULL,表示平台从目录上查询到了待验证的作品版权证书,即:存在版权证书PCL。
(1)根据返回的作品版权证书PCL中登记平台编号PID和公钥查询函数search查询到登记平台公钥pk;
(2)根据验签函数verifysign对登记平台签名值Sig_p进行验证。验签算法利用公钥pk
对签名值Sig_p进行解析得到所获取版权证书信息CL的摘要值,对待验证的版权信息进行哈希计算生成摘要值,然后对比两个摘要值,若一致则签名有效,保证作品版权证书确实由此登记平台生成,否则签名无效,版权证书信息不可信。完成对 Sig_p 的验证后生成对登记平台签名值的验证结果VRSP。
其三是对登记用户的数字签名进行验证,保证用户提交作品登记信息的真实性、完整性与登记用户的不可否认性:
(1)根据返回的作品版权证书PCL中登记用户编号IDRU和公钥查询函数search查询到登记用户公钥UPK;
(2)根据验签函数verifysign对登记用户签名值Sig_u进行验证。验签算法利用公钥 UPK 对Sig_u进行解析得到作品登记信息PR的摘要值,然后对比接收到的作品版权证书PCL中的作品登记信息摘要值与登记用户签名的摘要值,若一致则签名有效,保证作品版权登记申请确实由此用户登记,否则签名无效,版权证书信息不可信。完成对Sig_u的验证后生成对登记用户签名值的验证结果 VRSU 。
在整个传输过程中,平台与用户先利用非对称加密体制传输一个用于加解密的对称密钥,然后平台利用此密钥对证书进行加密,再发送给用户,用户接收之后再进行解密,获取证书信息。

4.实验结果以及验证

4.1实验演示视频

4.2.实验截图以及功能实现说明

4.2.1服务选择功能

(点击四个功能按钮跳转至相应功能界面,实现上述确权系统的四个功能)

img

4.2.2证书登记功能

img


①界面输入:想要进行数字作品版权登记的用户的编号(可以是用户名或者是编号)、用户的多媒体作品文件、作品的附加简介、用户用于签名验证自身身份的国密sm2私钥、储存至数据库用于验证用户签名保证完整性和真实性的国密sm2公钥

img


②返回数字作品的国密sm3摘要:

img


③确权系统向用户反馈证书即将登记的信息,请求本地调用用户私钥对信息签名并返回系统储存

img

img

img

img


④登记成功后数字版权证书在数据库的储存形式:

img

4.2.3证书查询功能

img


①界面输入:需要查询的证书编号(可以从公告栏获取证书编号)、查询服务申请用户的编号,该用户的sm2私钥,该用户的sm2公钥
②界面输出:查询到的证书部分信息或者对不合规申请的报错

img

img

4.2.4证书验证功能

img


①界面输入:需要验证的证书编号(可以从公告栏获取证书编号)、查询服务申请用户的编号,该用户的sm2私钥,该用户的sm2公钥
②界面输出:证书验证的结果(根据应用场景的仿真,有以下结果)
A:非证书拥有者验证储存状态正常的证书:

img


B:证书拥有者验证储存状态正常的证书:

img


C:证书拥有者验证被系统储存错误的证书
本次仿真中,系统将证书1的拥有者错写为了凌凌八(\u51cc\u51cc\u516b)

img


仿真结果:

img


D:证书拥有者验证被系统恶意篡改的证书
本次仿真中,系统恶意将数据库中证书1的作品简介改为“确权系统悄咪咪改了证书(\u786e\u6743\u7cfb\u7edf\u6084\u54aa\u54aa\u6539\u4e86\u8bc1\u4e66)

img


仿真结果:

img


E:非证书拥有者验证被系统储存错误的证书
本次仿真中,系统将证书1的拥有者错写为了凌凌八(\u51cc\u51cc\u516b)

img


仿真结果:

img


F:非证书拥有者验证被系统恶意篡改的证书
本次仿真中,系统恶意将数据库中证书1中用户对证书1的确认信息签名进行了修改,把比如把签名最后一个字符从9改为8

img


仿真结果:

img

4.2.5证书公示栏

img

代码模块分析

本项目实现了一个数字证书确权系统,主要功能包括证书登记、查询、验证和公开。代码主要使用了Python的Tkinter库来实现图形用户界面,使用了国密算法库(gmssl和pysmx)来进行加密和签名操作。以下是对代码各个模块的详细分析:

导入模块

#导入必要的系统库(os、sys、hashlib、json、binascii)
#导入Tkinter库用于图形用户界面
#导入gmssl和pysmx库中的国密算法(SM2、SM3)用于加密和签名
import os
import sys
import tkinter as tk
from tkinter import messagebox, filedialog
import hashlib
import json
import binascii
from gmssl import sm2, sm3
from pysmx.SM2 import Sign, Verify
from pysmx.SM3 import SM3


全局变量

#定义全局变量以存储文件路径、系统SM2密钥对和加密长度
file_path = "YOUR_FILE_PATH"
system_sm2_private_key = '00B9AB0B828FF68872F21A837FC303668428DEA11DCD1B24429D0C99E24EED83D5'
system_sm2_public_key = 'B9C9A6E04E9C91F7BA880429273747D7EF5DDEB0BB2FF6317EB00BEF331A83081A6994B8993F3F5D6EADDDB81872266C87C018FB4162F5AF347B483E24620207'
system_sm2_crypt = sm2.CryptSM2(public_key=system_sm2_public_key, private_key=system_sm2_private_key)
len_para = 64
sm3_digest = None


弹窗功能

#弹窗显示登记确认信息
def show_popup1(certificate_number, works_digest, works_description, user_number, signature2):
    message = f"登记确认信息:\n\n"
    message += f"版权证书编号: {certificate_number}\n"
    message += f"作品摘要: {works_digest}\n"
    message += f"作品简介: {works_description}\n"
    message += f"登记用户的编号: {user_number}\n"
    message += f"签名2: {signature2}\n"
    messagebox.showinfo("请确认登记信息", message)
def show_popup2():
    popup = messagebox.askyesno("提示", "即将使用您的私钥为登记确认信息签名")
    if popup:
        messagebox.showinfo("正在调用您的私钥签名...", "签名成功")
    else:
        messagebox.showinfo("您已经拒绝了确认", "本次登记中断")
        sys.exit()
def show_popup3(certificate_number, works_description, user_number):
    message = f"查询到的证书信息:\n\n"
    message += f"版权证书编号: {certificate_number}\n"
    message += f"证书拥有者的编号: {user_number}\n"
    message += f"作品简介: {works_description}\n"
    messagebox.showinfo("正在从证书库中查询...", message)

文件摘要计算

#读取文件并计算其SM3摘要
def calculate_sm3(file_path):
    with open(file_path, 'rb') as file:
        data = file.read()
        hasher = hashlib.new('sm3')
        hasher.update(data)
        return hasher.hexdigest()


文件选择

#打开文件对话框以选择文件,并计算其SM3摘要
def browse_file():
    global file_path
    file_path = filedialog.askopenfilename(filetypes=[("All Files", "*.*")])
    if file_path:
        with open(file_path, 'rb') as file:
            data = file.read()
            sm3 = SM3()
            sm3.update(data)
            sm3.hexdigest()
        global sm3_digest
        sm3_digest = sm3


证书登记

#实现证书登记流程,包括签名、验证和存储证书信息
def user_register_copyright(user_number, works_file, works_description, sm2_private_key, sm2_public_key):
    global len_para
    len_para = 64
    certificates = {}
    works_digest = sm3_digest.hexdigest()
    # 使用用户的私钥对作品文件摘要和作品简介进行sm2私钥签名(签名1)
    signature11 = Sign(works_digest + works_description, sm2_private_key, '12345678', len_para)
    signature1 = binascii.hexlify(signature11).decode()
    # 在页面打印签名1
    messagebox.showinfo("签名1: ", signature1)
    # 验证签名1和作品的sm3摘要
    if Verify(signature1, works_digest + works_description, sm2_public_key, len_para):
        # 加载证书信息
        with open("certificates.json", "r") as f:
            certificates = json.load(f)
        # 遍历json文件中储存的作品文件的摘要,检查是否重复
        for certificate in certificates:
            if certificate['works_digest'] == works_digest:
                messagebox.showinfo("该作品已经被登记,拥有者编号:", certificate['user_number'])
                return
        # 储存版权信息
        certificate_number = len(certificates) + 1
        certificate_number_s = str(certificate_number)
        certificate = {
            'certificate_number': certificate_number_s,
            'works_digest': works_digest,
            'works_description': works_description,
            'user_number': user_number,
            'signature1': signature1,
            'user_public_key': sm2_public_key,
        }
        certificate_number_hex = hex(certificate_number)
        # 使用系统的sm2私钥对版权证书的编号的字符串、作品文件的sm3摘要、作品简介、用户的编号、签名1进行签名(签名2)
        signature22 = Sign(certificate_number_s + works_digest + works_description + user_number + str(signature1), system_sm2_private_key, '12345678', len_para)
        signature2 = binascii.hexlify(signature22).decode()
        # 储存签名2
        certificate['signature2'] = signature2
        # 返回登记确认信息
        show_popup1(certificate_number_s, works_digest, works_description, user_number, signature2)
        show_popup2()
        signature33 = Sign(certificate_number_s + works_digest + works_description + user_number + signature2, sm2_private_key, '12345678', len_para)
        signature3 = binascii.hexlify(signature33).decode()
        certificate['signature3'] = signature3
        # 将证书信息添加到列表
        certificates.append(certificate)
        # 更新证书信息到json文件
        with open("certificates.json", "w") as f:
            json.dump(certificates, f)
        # 将作品文件储存在本地
        certificate_number_encoded = certificate_number_s.encode('unicode_escape').decode("utf-8")
        file_path = os.path.join(folder_path, certificate_number_encoded)
        with open(file_path, "w") as f:
            f.write(works_file)
    else:
        messagebox.showinfo("警告", "登记申请并非本人发出")


证书查询


def query_certificate(certificate_number, user_number, user_sm2_private_key, user_sm2_public_key):
    global len_para
    len_para = 64
    # 生成对用户编号和证书编号的sm2私钥签名(签名4)
    signature4 = Sign(user_number + certificate_number, user_sm2_private_key, '12345678', len_para)
    # 验证签名4与申请信息是否一致
    if Verify(signature4, user_number + certificate_number, user_sm2_public_key, len_para):
        # 加载证书信息
        with open("certificates.json", "r") as f:
            certificates = json.load(f)
        for certificate in certificates:
            if certificate["certificate_number"] == certificate_number:
                # 输出证书信息
                show_popup3(certificate_number, certificate["works_description"], certificate["user_number"])
                return
        messagebox.showinfo("提示", "该证书不存在,请确认后再查询")
    else:
        messagebox.showinfo("警告", "查询申请有误,查询申请被篡改")

证书验证

def verify_certificate(certificate_number, verifier_number, verifier_sm2_private_key, verifier_sm2_public_key):
    global len_para
    len_para = 64
    # 验证用户的sm2签名与版权证书验证申请信息是否一致
    signature5 = Sign(verifier_number + certificate_number, verifier_sm2_private_key, '12345678', len_para)
    # 加载证书信息
    with open("certificates.json", "r") as f:
        certificates = json.load(f)
    for certificate in certificates:
        if certificate["certificate_number"] == certificate_number:
            if certificate["user_number"] == verifier_number:
                # 使用拥有者的sm2公钥对签名1和签名3进行验签
                if Verify(certificate["signature1"], certificate["works_digest"] + certificate["works_description"], certificate["user_public_key"], len_para) and Verify(certificate["signature3"], certificate_number + certificate["works_digest"] + certificate["works_description"] + verifier_number + str(certificate["signature2"]), certificate["user_public_key"], len_para):
                    messagebox.showinfo("亲爱的证书拥有者:", "您的证书并未被恶意修改")
                else:
                    messagebox.showinfo("亲爱的证书拥有者:", "该证书疑似系统恶意生成")
            else:
                # 使用确权系统的sm2公钥验证签名2
                if Verify(certificate["signature2"], certificate_number + certificate["works_digest"] + certificate["works_description"] + certificate["user_number"] + str(certificate["signature1"]), system_sm2_public_key, len_para):
                    # 使用证书拥有者的公钥验证签名3
                    if Verify(certificate["signature3"], certificate_number + certificate["works_digest"] + certificate["works_description"] + certificate["user_number"] + str(certificate["signature2"]), certificate["user_public_key"], len_para):
                        show_popup4(certificate_number, certificate["works_digest"], certificate["works_description"], certificate["user_number"], certificate["signature3"])
                    else:
                        messagebox.showinfo("警告", "该证书信息疑似被系统篡改,请勿相信")
                else:
                    messagebox.showinfo("警告", "该证书信息损坏,请勿相信")
            return
    messagebox.showinfo("提示", "证书不存在,请确认后再验证")


证书公开

def publish_certificates():
    with open("certificates.json", "r", encoding="utf-8") as f:
        certificates = json.load(f)
    message = "确权系统的sm2公钥:B9C9A6E04E9C91F7BA880429273747D7EF5DDEB0BB2FF6317EB00BEF331A83081A6994B8993F3F5D6EADDDB81872266C87C018FB4162F5AF347B483E24620207\n\n\n"
    for certificate in certificates:
        message += "证书编号:{}\n拥有者编号:{}\n拥有者公钥:{}\n作品描述:{}\n用户对作品摘要和简介签名:{}\n系统对用户登记请求的签名:{}\n用户对系统登记行为的确认签名:{}\n作品摘要:{}\n".format(
            certificate["certificate_number"],
            certificate["user_number"],
            certificate["user_public_key"],
            certificate["works_description"],
            certificate["signature1"],
            certificate["signature2"],
            certificate["signature3"],
            certificate["works_digest"]
        )
    messagebox.showinfo("证书公示栏", message)


图形用户界面

def open_app1():
    global len_para
    def user_register_function():
        global len_para
        user_id = user_id_entry1.get()
        works_file = file_path
        work_description = work_description_entry1.get()
        user_prk = user_prk_entry1.get()
        user_puk = user_puk_entry1.get()
        user_register_copyright(user_id, works_file, work_description, user_prk, user_puk)
    global work_file_path1
    app1 = tk.Tk()
    app1.title("证书登记")
    # 登记功能界面
    user_id_label1 = tk.Label(app1, text="用户编号")
    user_id_label1.grid(row=0, column=0)
    user_id_entry1 = tk.Entry(app1)
    user_id_entry1.grid(row=0, column=1)
    work_file_label1 = tk.Label(app1, text="作品文件")
    work_file_label1.grid(row=1, column=0)
    work_file_button1 = tk.Button(app1, text="请选择本地文件", command=browse_file)
    work_file_button1.grid(row=1, column=2)
    work_description_label1 = tk.Label(app1, text="作品简介")
    work_description_label1.grid(row=2, column=0)
    work_description_entry1 = tk.Entry(app1)
    work_description_entry1.grid(row=2, column=1)
    user_prk_label1 = tk.Label(app1, text="用户私钥")
    user_prk_label1.grid(row=3, column=0)
    user_prk_entry1 = tk.Entry(app1)
    user_prk_entry1.grid(row=3, column=1)
    user_puk_label1 = tk.Label(app1, text="用户公钥")
    user_puk_label1.grid(row=4, column=0)
    user_puk_entry1 = tk.Entry(app1)
    user_puk_entry1.grid(row=4, column=1)
    register_button1 = tk.Button(app1, text="登记", command=user_register_function)
    register_button1.grid(row=6, column=0)
def open_app2():
    global len_para
    def query_function():
        global len_para
        cer_id = cer_id_entry2.get()
        user_id = user_id_entry2.get()
        user_prk = user_prk_entry2.get()
        user_puk = user_puk_entry2.get()
        query_certificate(cer_id, user_id, user_prk, user_puk)
    app2 = tk.Tk()
    app2.title("证书查询")
    # 查询功能界面
    cer_id_label2 = tk.Label(app2, text="证书编号")
    cer_id_label2.grid(row=0, column=0)
    cer_id_entry2 = tk.Entry(app2)
    cer_id_entry2.grid(row=0, column=1)
    user_id_label2 = tk.Label(app2, text="用户编号")
    user_id_label2.grid(row=1, column=0)
    user_id_entry2 = tk.Entry(app2)
    user_id_entry2.grid(row=1, column=1)
    user_prk_label2 = tk.Label(app2, text="用户私钥")
    user_prk_label2.grid(row=2, column=0)
    user_prk_entry2 = tk.Entry(app2)
    user_prk_entry2.grid(row=2, column=1)
    user_puk_label2 = tk.Label(app2, text="用户公钥")
    user_puk_label2.grid(row=3, column=0)
    user_puk_entry2 = tk.Entry(app2)
    user_puk_entry2.grid(row=3, column=1)
    query_button2 = tk.Button(app2, text="查询", command=query_function)
    query_button2.grid(row=6, column=1)
def open_app3():
    global len_para
    def verify_function():
        global len_para
        cer_id = cer_id_entry3.get()
        user_id = user_id_entry3.get()
        user_prk = user_prk_entry3.get()
        user_puk = user_puk_entry3.get()
        verify_certificate(cer_id, user_id, user_prk, user_puk)
    app3 = tk.Tk()
    app3.title("证书验证")
    # 验证功能界面
    cer_id_label3 = tk.Label(app3, text="证书编号")
    cer_id_label3.grid(row=0, column=0)
    cer_id_entry3 = tk.Entry(app3)
    cer_id_entry3.grid(row=0, column=1)
    user_id_label3 = tk.Label(app3, text="用户编号")
    user_id_label3.grid(row=1, column=0)
    user_id_entry3 = tk.Entry(app3)
    user_id_entry3.grid(row=1, column=1)
    user_prk_label3 = tk.Label(app3, text="用户私钥")
    user_prk_label3.grid(row=2, column=0)
    user_prk_entry3 = tk.Entry(app3)
    user_prk_entry3.grid(row=2, column=1)
    user_puk_label3 = tk.Label(app3, text="用户公钥")
    user_puk_label3.grid(row=3, column=0)
    user_puk_entry3 = tk.Entry(app3)
    user_puk_entry3.grid(row=3, column=1)
    query_button = tk.Button(app3, text="验证", command=verify_function)
    query_button.grid(row=6, column=1)



图形化入口

   #初始化主界面并提供各功能入口按钮
app0 = tk.Tk()
app0.title("确权系统")
wc_label1 = tk.Label(app0, text="欢迎使用数字证书确权系统", anchor="center")
wc_label1.grid(row=0, column=0)
wc_label2 = tk.Label(app0, text="我们将保护您的私人信息和数字作品安全", anchor="center")
wc_label2.grid(row=1, column=0)
wc_label3 = tk.Label(app0, text="请选择您需要的服务", anchor="center")
wc_label3.grid(row=2, column=0)
app1_button = tk.Button(app0, text="证书登记", command=open_app1)
app1_button.grid(row=4, column=0)
app2_button = tk.Button(app0, text="证书查询", command=open_app2)
app2_button.grid(row=5, column=0)
app3_button = tk.Button(app0, text="证书验证", command=open_app3)
app3_button.grid(row=6, column=0)
app4_button = tk.Button(app0, text="证书公开", command=publish_certificates)
app4_button.grid(row=7, column=0)
folder_path = r"works_folder"
if not os.path.exists(folder_path):
    os.makedirs(folder_path)
app0.mainloop()

实验遇到的问题和心得

这个作品是我去年参加密码竞赛复赛使用python开发的一个确权系统,原本准备做一个基于区块链确权的作品的,但由于组员分工、课业压力等因素,我们无法进行作品算法设计和区块链技术学习双线进行,于是放弃了区块链,寻找别的可靠的方法作为数据存储公示的载体,经过反复尝试,我们小组决定使用json文件模拟轻量级数据库来支撑确权功能(其实是我确定的哈哈哈哈,代码开发就是我一个人嘻嘻),里面进行密码运算的算法就是一些之前课程里老用的sm3,sm4,python有强大的库进行支持(我在网上GitHub找的国密库,以前的国密库里的函数好像没法适配复杂的功能)

全课总结以及体会和建议

从大一下学期开始,我正式接触并学习了Python编程。虽然在大一上学期娄老师就已经开始教授Python,但当时我对编程并不感兴趣。然而,随着大创项目的推进,我逐渐发现了Python的魅力,特别是在人工智能学习过程中,Python丰富多样的库让我感到惊叹。在课程中,我学会了Python的基本语法、数据结构、函数与模块、面向对象编程等基础知识。此外,我还深入学习了Numpy、Pandas、Matplotlib、Scikit-learn等常用库,为后续的机器学习和数据分析打下了坚实的基础。
学习Python的过程不仅让我掌握了编程技能,还培养了我的逻辑思维和问题解决能力。在人工智能学习中,Python的简洁语法和强大的库支持让我在编写代码时更加得心应手。记得有一次,我们需要处理大量数据并进行分析,如果没有Pandas和Numpy库的支持,整个过程将变得非常繁琐。Python让我体会到编程的乐趣,特别是在解决实际问题时那种成就感是无法替代的。
虽然课程涵盖了Python编程的方方面面,但我认为可以增加一些实际项目的实践环节。例如,开学就让学生选题,设计一些小型的组队项目,让学生在实践中巩固所学知识。通过完成项目,学生不仅可以更好地理解理论知识,还能提升编程能力。

...全文
74 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

110

社区成员

发帖
与我相关
我的任务
社区描述
人生苦短,我用Python!
python3.11 高校
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧