• 20183411 李丞灏 2020-2021 《python程序设计》 实验三 加密传输文件 实验报告


    20183411 李丞灏 2020-2021 《python程序设计》 实验三 加密传输文件 实验报告

    课程:《Python程序设计》
    班级: 1834
    姓名: 李丞灏
    学号:20183411
    实验教师:王志强老师
    实验日期:2020年5月23日
    必修/选修: 公选课

    1.实验内容

    (1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
    (2)要求包含文件的基本操作,例如打开和读写操作。
    (3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
    (4)程序代码托管到码云。

    2.实验过程及结果

    本实验要求设计服务端和客户端,使得发送方能够加密向接收端发送文件,我使用RSA模块进行加密,可以自主
    选择文件进行发送,接收方能够解密并自动保存。

    代码如下

    import socket
    import rsa
    with open('public.pem', 'r') as f:
       pubkey = rsa.PublicKey.load_pkcs1(f.read().encode())
    with open('private.pem', 'r') as f:
       privkey = rsa.PrivateKey.load_pkcs1(f.read().encode())
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('127.0.0.1', 8001))
    name = input('请输入要传输的文件名:')
    f0 = open(name,mode='r',encoding='utf-8')
    a = f0.readlines()
    for row in a:
       bytes(row,encoding = ('utf-8'))
       info = rsa.encrypt(row.encode(),pubkey)
       print(info)
    s.sendall(info)
    data = s.recv(1024)
    print(data.decode())
    s.close()
    

    (发送方代码)

    '''
    学号:20183411
    姓名:李丞灏
    '''
    import socket
    import rsa
    (pubkey,privkey) = rsa.newkeys(512)
    pub = pubkey.save_pkcs1()
    pri = privkey.save_pkcs1()
    with open('pubkey.pem',mode = 'wb') as f,open('privkey.pem',mode = 'wb') as f1:
        f.write(pub)
        f1.write(pri)
        pubkey = rsa.PublicKey.load_pkcs1(pub)
    with open('private.pem', 'r') as prf:
        pri = prf.read()
    privkey = rsa.PrivateKey.load_pkcs1(pri)
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind(('127.0.0.1',8001))
    s.listen()
    with open('serve_got.txt', 'w') as f:
       pass
    conn,address = s.accept()
    data = conn.recv(1024)
    info = rsa.decrypt(data, privkey).decode()
    print(info)
    with open('serve_got.txt', mode='a') as f:
        f.write(info)
        f.close()
    conn.sendall((bytes('已收到文件:',encoding = ('utf-8')) + bytes(info,encoding = ('utf-8'))))
    s.close()
    

    (接收方代码)
    *代码运行结果如下:
    发送方运行结果:
    alt 发送方
    接收方运行结果:
    alt 发送方
    接收并自动保存的文件:
    alt 发送方
    代码码云的链接:https://gitee.com/Lch6453/game/commit/1ba0d81d8a495cb3e65d46f58c6aa1a2d2f290b4

    3. 实验过程中遇到的问题和解决过程

    这次实验,是一场血泪史,我在一个个bug中疲于奔命,却总有更多的bug站出来摧残我的身心,下面有请这些bug们:
    问题一:无法加密
    导入了RSA加密模块,但在加密的过程中,程序指出需要将导入的文件信息改为字节,而不是字符串,在加入了转换代码
    后,又不厌其烦的指出,还是转换不了,需要指定的格式,用decode、encode等一顿突突,还是出现了问题,如此反复
    由于问题太多,场面血腥,本人不记仇,因此不多赘述。
    解决方法:
    使用格式转换的代码,将txt逐字符转换成字节,再传输给加密部分进行加密,并在加密后封装为统一格式传输。
    问题二:无法解密
    好不容易搞定了加密模块,解密模块又出现了问题,这次有图为证:
    alt 问题
    上面一样,说需要一个类似字节的格式,于是我将其转换成了字节,以为万事大吉,不料运行时又弹出了提示,说需要格
    式,用decode转换,还是不行,因为bytes不支持decode,到了这时,我已经经历了无数打击,于是淡定地关上了电脑,
    平复下心情。
    解决方法:
    分析发送方传输来的格式,然后再根据接收方解密的要求,进行格式变换,最终完美解决!

    其他(感悟、思考等)

    虽然实验中困难种种,但还是通过各种方法一路披荆斩棘,完成了实验,在最后成功的时候内心是非常喜悦的,
    这是一种痛并快乐着的感觉,复杂也简单。如果让我对python说一句话,我想说:人生苦短;如果有再来一次的机
    会,我还是会说:我用python!如果非要加上一个期限的话,我希望是:一辈子!!!

    参考资料

    蓝墨云班课
    网上的经验

  • 相关阅读:
    004---基于TCP的套接字
    003---socket介绍
    002---tcp/ip五层详解
    001---C/S架构
    008---re正则模块
    007---logging日志模块
    006---hashlib模块
    005---json & pickle
    004---os & sys
    22.解决 eclipse 与 AS 共用 SDK 导致 eclipse ADT 无法使用的问题
  • 原文地址:https://www.cnblogs.com/Lch36/p/12942990.html
Copyright © 2020-2023  润新知