草庐IT

20212217刘恒谦 实验三《Python程序设计》实验报告

cyber-explorer 2023-03-28 原文

20212217刘恒谦 《Python程序设计》实验三报告

课程:《Python程序设计》
班级: 2122
姓名: 刘恒谦
学号:20212217
实验教师:王志强
实验日期:2022年4月23日
必修/选修: 公选课

代码链接:
服务器
https://gitee.com/besti-cs/modest-warehouse/blob/master/服务器.py

`

# 服务器
import socket as sk

def decipher(D:int, N:int, data:bytes)->int:
	for i in data:
		yield pow(i,D)%N


s = sk.socket(sk.AF_INET, sk.SOCK_STREAM)

s.bind(("", 5050))
s.listen(2)
conn,addr = s.accept()
data = conn.recv(1024)

f = open("C:\\Users\\Huawei\\Desktop\\write.txt", "a", encoding="utf-8")
info=bytes(decipher(77,259,data)).decode("utf-8")
f.write(info)
f.close()


print("已接收", info)
s.close()

`

客户端
https://gitee.com/besti-cs/modest-warehouse/blob/master/客户端.py
`

# 客户端
import socket as sk


def encrypt(E: int, N: int, string: str) -> int:
	for i in string.encode("utf-8"):
		yield pow(i, E) % N


HOST = "127.0.0.1"
# 这个是电脑自己的IP,和别人的电脑交流时要改成别人的IP
PORT = 5050
# 这个要和服务器的端口号一致

s = sk.socket(sk.AF_INET, sk.SOCK_STREAM)
s.connect((HOST, PORT))

# 读取文件
f = open("C:\\Users\\Huawei\\Desktop\\read.txt", "r", encoding="utf-8")
msg = f.read()
f.close()

# 发送密文
s.sendall(bytes(encrypt(101, 259, msg)))

data = s.recv(1024)
print("已写入", msg)
s.close()

`

1.实验内容

利用socket进行网络通信,并在客户端读取文件,加密传输至服务端,服务端解密并保存。

2. 实验过程及结果

结合知乎上的资料,基本写出了socket制作服务器和客户端的代码。

服务器的代码如下(初级代码,只能在终端你说一句,我说一句)
`

import socket

HOST = ''  #主机
PORT = 5050  #端口
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
	s.bind((HOST, PORT))
	#bind(address), 传输层为AF_INET时address是(主机host,端口port)格式
	s.listen(2)
	conn, addr = s.accept()
	#conn新的套接字对象,用于接收发送数据,
	# addr客户端地址为元组(hostname, port)

	with conn:  #while里面只能有recieve和send
		print('Connected by', addr)
		while True:  #server先接收再发送
			data = conn.recv(1024)
			print(f"{addr}说:{data.decode()}")
			server_msg=input("请输入你想回复的内容,输入exit则退出:\n")
			conn.sendall(server_msg.encode())
			if server_msg=="exit":
				break

`
作为服务器,首先要能够一直等待来响应用户的请求,因此有了listen方法,它接受监听的最大用户数量,在Python中最多设置5个。如果监听到,那么它就会返回客户对象conn,以及它的IP地址。这个IP地址我们目前还用不着。而用户conn却有很大的用处,在这里我们设置一个监听用户的循环,直到服务器发出exit命令我们才退出。

客户端的代码如下(初级代码,只能在终端你说一句,我说一句)
`

# client.py
import socket

# HOST = 'localhost'

HOST = '192.168.10.191'
PORT = 5050

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
	s.connect((HOST, PORT))
	while True:  #while里面只能有send和recieve
		msg=input("请输入你想传达的信息,传入exit则退出\n")
		if msg=="exit":
			break

# client先发送消息再接收
		s.sendall(msg.encode())
		data = s.recv(1024)
		print(f"他说 {data.decode()}")

`
客户端和服务器类似,只不过不用listen。其他部分都是大同小异的。

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

-RSA加密算法

上网查资料,了解到现代加密算法基本包括RSA,Hash,等算法,其中可解密的加密称双向加密。利用这个关键词,我又去网上查阅了大量资料,决定采用RSA加密算法。它赫赫有名,广为流行,使用较多,算法简单,解密困难。

  • 基本思路如下:
    不同数据
    可以用同样的字符排列组合来代表

    加密和解密只需要改变这个字符

  • RSA解密算法
    N为字符总量,如果有一个D
    (密文**D)%N=明文。
    (D,N)称为私钥

  • 加密算法
    如果还有个E
    (明文**E)%N=密文
    (E,N)称为公钥

  • D和E的制作
    选取2个质数:p=3; q=11
    质数相乘:N=p*q=33
    计算欧拉函数 T=(p-1)(q-1)=20
    选取公钥 1st.E是质数;2nd.1<E<T;3st.E不是T的因数
    计算私钥 (D *E)%T=1

字符串与字节串

在Python2中,字符以字节的形式在程序里运行。但在Python3之后,字符的编码变复杂了,出现了不同于于Python2的字符串,复杂的字符和简单的字符用着同一套字节却有着不同的编码规则。
Python3中,在字符的""前加b(表示binary二进制)即可表示字节串。
bytes_string=b'\xe4\xba\x94\xe4\xb8\x80\xe5\x8a\xb3\xe5\x8a\xa8\xe8\x8a\x82\xe5\xbf\xab\xe4\xb9\x90'

在网络传输过程中,为了保证字符能够被正确解读,要求发送方和接受方都必须知道传输过程中字符的编码。如果简单的字符和复杂的字符有不同的规则,那么传输的每一个字都必须标注它的编码格式,极大地占用了传输资源。因此,整个文件要有统一的编码标准,传输过程中要将字符串还原成字节串。

  • 那么,怎么将str变成bytes呢,很简单,调用encode编码方法即可。

    输出如下

字符的数字化不仅使其能在计算机中方便传输,同时也为加密和解密提供了新思路。
本代码中,读取的是明文,写入的是明文。但是发送、传输、接受都用的是密文。我们可以将字符数字化,之后再将其加密,解密。

  • 那么怎么将数字变回字符呢?
    用decode(解码)方法即可

  • 用一张图来表示string和bytes的关系。

    图片来源于CSDN,原文链接https://blog.csdn.net/beyondlee2011/article/details/86159151

其他(感悟、思考等)

密码是门大学问,学习密码要有深厚的数学基础。当然落实到计算机上,代码功底也必不可少。

参考资料

有关20212217刘恒谦 实验三《Python程序设计》实验报告的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  4. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  5. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  6. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  7. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  8. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  9. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  10. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

随机推荐