一、实验目的 掌握产生公钥密钥对的程序设计方法 掌握产生公钥加密/解密的程序设计方法 二、实验场景 模拟实现 128 位信息的加密通信过程。 实验对象包含三方:A,B,C。 其中,A 与 B 之间进行 128 位消息的安全交换,这样的信息交换通过公钥密码算法实现。 第三方 C 负责为 A 和 B 各生成一对公私钥对,并分别把对应的私钥传给 A 和 B,并把他们的公钥公开。 当 A 向 B 发送消息时,A 用 B 的公钥加密,加密的信息发送给 B 后,B 再用自己的私钥来解,从而获得 A 发给 B 的消息。 三、实验步骤 0 实现 A,B,C 三方分别拥有的函数;定义公钥体系环境配置; 1 编写生成一对公钥密钥的程序; 2 生成实验用的 128 位信息; 3 设计生成对上述信息的公钥加密/解密的程序; 四、消息传递及公钥分发探索性步骤 设计客户端-服务器程序,实现 128 位消息的传递,实现公钥与私钥的分发。 五、实验思考 1 公钥密码算法有哪些应用场合? 2 实际应用中,公钥如何传送及如何确定公钥拥有者的身份? 说明: 1 编程语言任意 2 可以使用已有的公钥密码函数库 实验内容 1、本次实验我采用的是socket编程,实现服务端与客户端的交互。 C作为服务器端,负责生成公私钥对,将客户端的公钥公开,将私钥传递给客户端A和B。在这里虽然把公钥公开,但是这里我还是进行了对公钥进行了传递,以便后期A和B的交互。 C绑定localhost的端口,用listen函数开始监听,运用accept函数接收客户端传送的消息,分别与客户端A,B建立联系。 服务端C生成公钥与私钥, 之后便是运用send函数传送公钥与私钥。 在这次实验中,对公钥的传输过程中,一开始直接采用了str(publickey).encode(encoding=“utf-8”),但是在这种情况下,传输后的公钥却没有办法用来加密,在这个过程中,一直出现一个bug, 后来我采用了pickle序列化的办法,依旧是无法用公钥加密,仍热是以下这种情况: 最后我采用了pickle加上哈希函数的办法,在这种情况下,公钥终于可以加密成功。我查询了很多资料,关于为何会出现这种问题,始终没有确定的答案。不过采用哈希函数,保证了数据的完整性。 2、B负责接收C为B生成的公私钥对,考虑到B要传送公钥给A,以及接收A的消息,因此,B应该是C的客户端,又是A的服务端。 因此设计的时候,我将B设计成两个线程并行,我把B分为两个部分:RecvData和Recvmsg。 RecvData作为C传送公私钥时,接收公私钥的工具,同时为保证公钥能传送给A,以及解密信息,需要将公钥和私钥设为全局变量。 Recvmsg则是重新调用了socket程序,绑定端口,视为一个服务端,等待A的connect。当A与之建立连接之后,B传递自己的公钥给A,等待A用公钥加密的信息传送过来,之后B再用自己的私钥进行解密。(红框是解密过程) 3、客户端A负责接收C传来的自己拥有的公私钥对,发送信息给B,接收B的公钥,并用于加密。根据这个思路,A也是两个线程并行,设置了两个函数,分别是:Recvmsg(), Sendmsg()。 Recvmsg(),A作为C的一个客户端,用于接收公私钥对。(这里思路与B一致) Sendmsg(),此函数负责A与B交互,A作为B的客户端,接收B发过来的公钥,运用B的公钥进行加密,向B发送加了密的信息。(第二个红框是加密过程) 这里生成128位消息,运用了os库,生成16byte的消息,也就是128位。 4、运行截图:
运行C程序后,再运行b和a的程序,C分别生成公钥和私钥,并向他们传送。 B接收公钥和私钥后:
A接收公钥和私钥后:
B开始监听,与A建立连接,并通讯: A与B之间的通信: 5、实验与思考 (1)公钥密码算法的应用: ①加密/解密:发送方用接收方的公钥对消息加密。 ②数字签名:发送方用自己的私钥对消息签名。签名可以通过对整条消息加密或对消息的小数据块加密来生成,其中的小数据块是整条消息的函数。 ③密钥交换:通信双方交换会话密钥。密钥交换有几种不同的方法,这些方法都使用通信一方或双方的私钥。 (2) 公开密钥系统需要一个值得信赖而且独立的第三方机构充当认证中心(CA),来确认声称拥有公开密钥的人的真正身份。 要确认一个公共密钥,CA首先制作一张“数字证书”,它包含用户身份的部分信息及用户所持有的公开密钥,然后CA利用本身的私钥为数字证书加上数字签名。 任何想发放自己公钥的用户,可以去认证中心(CA)申请自己的证书。CA中心在认证该人的真实身份后,颁发包含用户公钥的数字证书,它包含用户的真实身份、并证实用户公钥的有效期和作用范围(用于交换密钥还是数字签名)。其他用户只要能验证证书是真实的,并且信任颁发证书的CA,就可以确认用户的公钥。 |