《数据安全实验报告》

2022春季学期ncut

《数据安全实验报告》

第二次实验

实验一  安全基础实训

(验证性实验)

班级:__信安20-2班_____

学号:__ mimi_____

姓名:____mimi    ________

评语:

日期:

目录

实验目的 3

实验要求 3

实验过程: 3

 、实现AES加密 3

1.编写AES加解密源码 4

2.运行AES加解密源码 5

、实现RSA加密 5

1.安装rsa模块 5

2.编写AES加解密源码 5

3.运行AES加解密源码 6

使用Python实现加密传输文件 8

1.编写服务端代码 8

2.编写客户端代码 9

3.运行服务端 9

4.运行客户端 10

问题总结: 11

一、rsa模块的安装和引入 11

客户端或服务端目标积极拒绝 15

实验目的

掌握密码学相关算法的原理。

实验要求

一、使用加密库实现AES算法

二、使用加密库实现RSA算法

三、使用Python实现加密传输文件

实验过程:

 、实现AES加密

  1. 编写AES加解密源码

import base64

# 需要补位, str不是16的倍数那就补足为16的倍数

from Cryptodome.Cipher import  AES

# 需要补位, str不是16的倍数那就补足为16的倍数

from Cryptodome.Cipher import  AES

def add_to_16(value):

    while len(value) % 16 != 0:

        value += '\0'

    return str.encode((value))  # 返回bytes

def encrypt(key, text):

    aes = AES.new(add_to_16(key), AES.MODE_ECB) # 初始化加密码

    encrypt_aes = aes.encrypt(add_to_16(text))  # 先进行aes加密

    encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8') # 执行加密并转码返回bytes

    return encrypted_text

# 解密方法

def decrypt(key, text) :

    aes = AES.new(add_to_16(key),AES.MODE_ECB) # 初始化加密码

    base64_decrypted = base64.decodebytes(text.encode(encoding = 'utf-8'))  #优先逆向解密base64成bytes

    decrypted_text = str(aes.decrypt(base64_decrypted), encoding = 'utf-8').replace('\0','')  # 执行解密密并转码返回str

    return decrypted_text

secret_str = encrypt('12345679', 'cool girl 20101110227!') # des 的尺寸为8

print(secret_str)

clear_str = decrypt('12345679', secret_str) # 解密的过程跟加密的过程密钥应该是一致的

print(clear_str) # 输出明文

def add_to_16(value):

    while len(value) % 16 != 0:

        value += '\0'

    return str.encode((value))  # 返回bytes

def encrypt(key, text):

    aes = AES.new(add_to_16(key), AES.MODE_ECB) # 初始化加密码

    encrypt_aes = aes.encrypt(add_to_16(text))  # 先进行aes加密

    encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8') # 执行加密并转码返回bytes

    return encrypted_text

# 解密方法

def decrypt(key, text) :

    aes = AES.new(add_to_16(key),AES.MODE_ECB) # 初始化加密码

    base64_decrypted = base64.decodebytes(text.encode(encoding = 'utf-8'))  #优先逆向解密base64成bytes

    decrypted_text = str(aes.decrypt(base64_decrypted), encoding = 'utf-8').replace('\0','')  # 执行解密密并转码返回str

    return decrypted_text

secret_str = encrypt('12345679', '20101110227') # des 的尺寸为8

print(secret_str)

clear_str = decrypt('12345679', secret_str) # 解密的过程跟加密的过程密钥应该是一致的

print(clear_str) # 输出明文

# 需要补位, str不是16的倍数那就补足为16的倍数

from Cryptodome.Cipher import  AES

  1. 运行AES加解密源码

 

、实现RSA加密

1.安装rsa模块

打开pycharm中的设置,找到Python解释器,点击加号

 

在其中搜索rsa,点击安装软件包,如上图软件包中出现rsa则为成功

 

2.编写RSA加解密源码

import rsa
 # rsa加密
def rsaEncrypt(str) :
    # 生成公私钥
    (pubkey, privkey) = rsa .newkeys(512)
    print("公钥:\n%s\n私钥:\n:%s" %(pubkey, privkey))
    # 明文编码格式
    content = str.encode("utf-8")
    # 公钥加密
    crypto = rsa.encrypt(content, pubkey)
    return (crypto, privkey)
 # rsa解密
def rsaDecrypt(str, pk):
    # 私钥解密
    content = rsa.decrypt(str, pk)
    con = content.decode("utf-8")
    return con
if __name__ == "__main__":
    str, pk = rsaEncrypt("20101110227")
    print("加密后密文: \n%s" % str)
    content = rsaDecrypt(str, pk)
    print("解密后明文: \n%s" % content)

3.运行RSA加解密源码

公钥:

PublicKey(7718841789902084320922372641815541799414724464210553503397062274842581127404909583872193367688654670645844873897912269666444031567155669764452979415292937, 65537)

私钥:

:PrivateKey(7718841789902084320922372641815541799414724464210553503397062274842581127404909583872193367688654670645844873897912269666444031567155669764452979415292937, 65537, 4925374136928990710845060065429973030650233644640754641783446713637211039387883750330680678163502078547561434750586156118623521197376123267903594668626945, 6661617362779444699296875105668224295874036349996803696522586380269803428013946753, 1158703865675276642340265936610901795143797304156397908289728393941870729)

加密后密文:

b'\x8a[q\xa4\xb0\x86\x9e\x9e}\xe3\x8e\xd0O\x01\xcf\x94\xfbV\x80\x18\xb2\x03<sh\xc5\xfa\x1b\xc5\xd9\xb4\xd7\x9ec\x15\xf6?\x87\xda8(\x0f\xdd\xe5\xb3\xbeqZA\x06\xcf\x08\xd9|\xe34\xcd\x04\x89\xb4\xdc\x7f\xb8\x06'

解密后明文:

20101110227

进程已结束,退出代码0

 

使用Python实现加密传输文件

1.编写服务端代码

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('privkey.pem', 'rb') 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('file reveived',encoding = ('utf-8')) + bytes(info,encoding = ('utf-8'))))
s.close()

2.编写客户端代码

import socket

import rsa

(pubkey,privkey) = rsa.newkeys(512)
pub = pubkey.save_pkcs1()
pri = privkey.save_pkcs1()

with open('pubkey.pem','rb') as f:
    pubkey = rsa.PublicKey.load_pkcs1(f.read())
with open('privkey.pem','rb') as f:
    privkey = rsa.PrivateKey.load_pkcs1(f.read())
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8001))
name = input('input filename: ')
f0 = open(name,mode='r',encoding='utf-8')
a = f0.read()

info = rsa.encrypt(a.encode(),pubkey)
print(info)
s.sendall(info)
data = s.recv(1024)
print(data.decode())
s.close()

3.运行服务端

自动生成三个文件

  

4.运行客户端

创建一个xxx.txt文本文档,并输入以下内容(内容不可以太长,否则会有溢出报错,比如写入20101110227会出现下图的报错)

  

运行客户端文件

  1. 输入xxx.txt(图片绿色部分是输入)
  2. 运行结果为 xxx.txt文档的内容rsa加密后的密文(红色部分1)、密文解密后得到的明文内容(红色部分2)

我们可以打开serve_got.txt文件发现内容和123.txt文件的内容是一样的(最初客户端生成serve_got.txt文件的内容是空白的)

 

问题总结

报错显示,无法链接;

寻找原因

l端口被占等问题,比如重复运行客户端

于是将这两个程序重新运行,就可以实现;然后按照步骤,先运行服务端,再运行客户端,就可以了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光而不耀-2001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值