2022春季学期ncut
《数据安全实验报告》
第二次实验
实验一 安全基础实训
(验证性实验)
班级:__信安20-2班_____
学号:__ mimi_____
姓名:____mimi ________
评语: 日期: |
目录
实验目的:
掌握密码学相关算法的原理。
实验要求:
一、使用加密库实现AES算法
二、使用加密库实现RSA算法
三、使用Python实现加密传输文件
实验过程:
一 、实现AES加密
- 编写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
- 运行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会出现下图的报错)
运行客户端文件
- 输入xxx.txt(图片绿色部分是输入)
- 运行结果为 xxx.txt文档的内容rsa加密后的密文(红色部分1)、密文解密后得到的明文内容(红色部分2)
我们可以打开serve_got.txt文件发现内容和123.txt文件的内容是一样的(最初客户端生成serve_got.txt文件的内容是空白的)
问题总结:
报错显示,无法链接;
寻找原因
l端口被占等问题,比如重复运行客户端
于是将这两个程序重新运行,就可以实现;然后按照步骤,先运行服务端,再运行客户端,就可以了