zoukankan      html  css  js  c++  java
  • 20191204李浩鹏2020-2021-2实验三《Python程序设计》实验报告

    20191204 2020-2021-2 《Python程序设计》实验三报告

    课程:《Python程序设计》
    班级: 1912
    姓名: 李浩鹏
    学号:20191204
    实验教师:王志强
    实验日期:2021年5月27日
    必修/选修: 公选课

    1.实验内容

    创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。

    2. 实验过程及结果

    客户端

    首先设置好AES算法的相关环境,设置key

    然后读取一个文件,对其内容进行加密,然后输出一下加密后结果给用户看一下

    接下来,连接到服务器上,把密文发送给服务器

    最后 ,关闭文件,关闭客户端

    from Crypto.Cipher import AES
    #客户端的Socket初始化
    def splice(text):
        while len(text) % 16 != 0:
            text += b' '
        return text
    # 拼接秘钥,秘钥长度需为16的倍数,不足则拼接空格
    def splice_key(key):
        while len(key) % 16 != 0:
            key += b' '
        return key
    if __name__ == '__main__':
        s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)    #参数1:服务器之间网络通信;参数2:流式socket , for TCP
        s.connect(('127.0.0.1', 8001))#连接,元组的形式,(IP地址,端口)
        f = open(input("请输入文件名:"), "r+")
        f0 = f.readlines()
        f0 = ''.join(f0)
        text = f0
        text = text.encode()
        key = b'20191204'  # 秘钥
        aes = AES.new(splice_key(key), AES.MODE_ECB)  # 根据秘钥初始化加密器
        encrypted_byte = aes.encrypt(splice(text))  # 使用加密器的加密方法对文本进行加密,返回加密结果(byte类型)
        print("encrypted_byte: ", encrypted_byte)
        s.sendall(encrypted_byte)
        f.close()
        s.close()
    

    服务器

    首先设置好 AES的相关环境,设置相同的key

    然后设置好服务器,等待客户端连接

    接受 客户端的密文 ,进行解密

    将解密后的明文 ,写入一个新建的文件里。

    最后 ,输出新建文件中的内容,关闭服务器

    import socket
    from Crypto.Cipher import AES
    def splice(text):
        while len(text) % 16 != 0:
            text += b' '
        return text
    # 拼接秘钥,秘钥长度需为16的倍数,不足则拼接空格
    def splice_key(key):
        while len(key) % 16 != 0:
            key += b' '
        return key
    # 服务器端的socket初始化
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 参数1:服务器之间网络通信;参数2:流式socket , for TCP
    # s = socket.socket()
    s.bind(('127.0.0.1', 8001))  # 绑定. localhost = 127.0.0.1,port=0-65535
    s.listen()  # 监听
    conn, address = s.accept()  # 阻塞
    data = conn.recv(1024)  # 接收
    # print(data.decode())
    key = b'20191204'  # 秘钥
    aes = AES.new(splice_key(key), AES.MODE_ECB)  # 根据秘钥初始化加密器
    decrypt_byte = aes.decrypt(data) # 使用加密器的解密方法对文本进行解密,返回解密结果(byte类型)
    decrypt_byte = decrypt_byte.decode()
    #print("decrypt_str: ", str(decrypt_byte, encoding='utf-8', errors="ignore"))  # 将字节
    # conn.sendall(("服务器已经接收到了数据内容:"+str(data.decode())).encode())
    name = input("请填写解密后明文的文件名称:")
    f = open(name,"w+")
    f.write("
    经服务器解密后的明文是:
    ")
    f.write(decrypt_byte)
    f.close()
    f = open(name,"r+")
    f0 = f.readlines()
    f0 = ''.join(f0)
    print(f0)
    f.close()
    s.close()
    

    gitte开源代码

    https://gitee.com/besti2021python/l20191204/tree/master/

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

    • 问题1:采用何种加密算法,以及算法的加解密算法。
    • 问题1解决方案:通过百度搜所发现了python中要crypto相关的库,采用了python3.6安装pycrypto,pycrytodome和crypto中的方法安装了相关的库,并且根据相关教程配置好了AES算法。
    • 问题2:读取文件并转换成字节的方法还是有点不熟悉。
    • 问题2解决方案:查了查教材和文档,但是由于AES只能加密ascii码中的字符,由于汉字的编码方式不同,现在文件中还无法出现汉字,只能使用英文。转换字节的方法:上链接https://blog.csdn.net/cyan20115/article/details/106548750
    • ...

    其他(感悟、思考等)

    在遇到不会的事情时,首先要想到的通过自己动手解决,我们现在的问题之前肯定要也有好多人遇到过,并且解决。搜集信息的能力很重要。如果是在搜不到的问题,建议返回头在看一眼代码,有可能是自己理解还不到位。

    参考资料

  • 相关阅读:
    ASP.NET中常用的33种代码
    AJAX与URL重写404错误解决方法
    在firefox上运行ajax网页时同步操作的问题
    AjaxPro使用说明
    (转)SQL语句优化的34条建议
    javascript 如何操作框架页中的域
    ASP.NET上传下载文件示例,使用webClient实现
    转载:缓存 Cache
    翻译 一些很酷的.Net技巧
    Firefox和IE之间7个JavaScript的差异
  • 原文地址:https://www.cnblogs.com/lhpshuaibi/p/14820179.html
Copyright © 2011-2022 走看看