哈希值+非对称加密+网络+数字签名,你真的知道怎么给游戏充钱吗

前文
使用socket实现局域网不同主机通信
SHA256算法的实现和消息的哈希散列值计算
python实现RSA算法,对数据进行加密认证

文章目录

  • 数字签名与认证
  • 攻击类型
  • 算法选择
  • 实现流程
  • 总结


数字签名与认证

什么是数字签名?

  签名我们大家都知道,A在纸上签上自己的名字,其余人在纸上看到A的签名,确认是A的字迹,那么就可以确定这个签名是A留下的。
  但是如何确保这是A本人签上去的而不是第三方伪造的呢?
  这要依赖于A的习惯和字迹是有鲜明特征,与他人不同的。可在经过反复训练后,第三方仍然可以模仿A的字迹进行签名。
  数字签名同样是代表A身份的一个签名,但是由于数据量的庞大,第三方几乎不可能(或者说短时间内不可能)伪造出A的签名,这在一定程度上比我们一般知道的手写签名要安全、可靠。

加密和解密
  在密码学中,我们有一套加密方法,与之对应有一套解密方法,发送方使用加密方法对信息(称作明文)加密,加密后的信息形成密文,将密文暴露在公共环境下,任何人都可以有机会获得这条密文。但是加密后的密文与明文几乎没有关联,没有经过授权的人无法解读密文的内容,而授权用户对密文进行解密,得到明文(原文),才能读懂信息。

认证
  上述已经了解到什么是解密和解密,但是在这个过程中,发送方无法确定接收方能否接收到信息并解密。接收方也无法确定消息是否真的是发送方发送,而不是第三方伪造。
  也就是说,发送方可以抵赖发送这条消息的真实性,接收方无法确认这条消息是否被主动攻击过(伪造、篡改)。
  或许你已经想到,有一个可靠的第三方来确认双方的身份和消息的安全,但这也不是绝对安全,因为问题转到了如何确认可靠的第三方是否可靠上面。
  现在介绍一种方法:先将要发送的消息M经过不可逆的运算变成H。确保在得到H后,无法反推出原文M;确保每一个原文M,都只对应唯一一个H,当原文发生任何改变后,得到的H都完全不一样。随后,发送方使用自己的签名方法对H进行加密形成密文C。原文M和密文C一起发送给接收方。接收方接收到M和C,使用同样的不可逆算法计算M得到H,再对C使用与发送方签名方法相对应的解密方法进行解密,得到D,对比D和H,如果D和H一样,则认证成功。
  在这个过程中,这条消息无法被修改,因为任何一点的改动都会导致产生很大差别的H。同时,发送方无法抵赖他发送过这条消息的存在性,因为H唯一而且只有发送方才能对H签名成C,C也是不可修改的,接收方收到的C解密后与H一致。

  那么这和游戏充值有什么关系呢?不难发现,网络支付都需要这种手段去认证支付记录。假设A要想B发起一笔交易,B想要认证这笔交易的完整性和这笔交易确实是A发起的,就需要上述签名认证技术。

攻击类型

  如果第三方要伪造信息和签名方法,需要找到一条和发送方发送的信息不一样,但是经过不可逆算法计算出来的H一样。或者根据已知的发送信息M和H签名后的C,逆推出发送方使用的签名方法。

算法选择

  计算消息的唯一对应值,可以说是信息摘要,可以使用的是MD5、DES、SHA等算法,但是这些算法不是绝对可靠的,表现在他们会发生碰撞(两个不同的消息得到相同的信息摘要)。对摘要进行加密,可以使用RSA和ECC。
  在本文实现中采用SHA256和RSA方法,前文链接SHA、RSA。同时,我们要模拟发送方和接收方在网络上进行数据的传输,使用到网络连接的方法。

实现流程

  首先需要模拟一个发送方和一个接收方,它们在网上进行在线支付,那就使用网络连接协议,创建一个游戏官方服务器和一个终端玩家。
  当玩家在游戏内点击充值时,游戏的服务器给玩家发送这样的请求:你给我支付648人民币,我给你时装道具。游戏官方确认这笔交易并对它进行签名,发送给玩家。玩家接收到后,确认这笔交易的完整,确认发起方是游戏官方,才进行交易的下一步。
  在服务器端,服务器对交易的内容实验SHA256计算散列值,根据RSA算法使用自己的秘钥对散列值签名,将交易和签名后的数据拼接在一起回送给玩家。
  玩家接收到回送数据后,检验该数据是否正确,如果服务器的身份合法,则进行后续操作。

服务器端:

def udpServer(address,port=8686):# dgram代表udp方式server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server.bind((address, port))print('Server start')while True:data, ad = server.recvfrom(1024)# 处理接收到的数据print('receive from : ', ad, ' data: ', data)ret = serverProcess(data)print('send back: ',ret)server.sendto(ret,ad)c = [chr(data[i]) for i in range(5)]if ''.join(c) == 'close':breakserver.close()print('Server close')def serverProcess(msg):msg = msg.decode('gbk')ret = ''if msg == '充钱!648块钱':deal = '你给我648块我就给你道具'bt = deal.encode('gbk')bt = byte2str(bt)ret += 'charge'l = len(bt)if len(str(l)) < 8:l = '0'*(8-len(str(l))) + str(l)else:l = str(l)ret += l + bthash_index = int(mySHA256(bt),16)e = n = 0with open('e.txt', 'r') as f:e = int(f.read())with open('n.txt', 'r') as f:n = int(f.read())c = quickPowerMod(hash_index,e,n)ret += str(c)return ret.encode('utf-8')if __name__ == "__main__":address = "localhost"port = 8686udpServer(address,port)

玩家端

def process(msg):msg = msg.decode('utf-8')if msg[:6] == 'charge':deal_len = int(msg[6:14])deal = msg[14:deal_len+14]print('deal detail: ', str2byte(deal).decode('gbk'))c = int(msg[deal_len+14:])cal_index = mySHA256(deal)with open('d.txt', 'r') as f:d = int(f.read())with open('n.txt', 'r') as f:n = int(f.read())de_index = quickPowerMod(c,d,n)de_index = hex(de_index)[2:]print('计算的哈希值: ',cal_index)print('解密的哈希值: ', de_index)if de_index == cal_index:print('是合法的官方')else:print('非法数据')if __name__ == '__main__':address = 'localhost'port = 8686message = '充钱!648块钱'bt = message.encode('gbk')receive = udpSend(address, port, bt)process(receive)

玩家端结果
支付认证结果


总结

使用了SHA、RSA和SOCKET实现网络支付的一般流程,不足之处是欠缺许多功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2017 年脑机接口研发热点回眸

来源&#xff1a;科技导报概要&#xff1a;脑机接口&#xff08;brain-computer interface&#xff0c;BCI&#xff09;通过解码人类思维活动过程中的脑神经活动信息&#xff0c;构建大脑与外部世界的直接信息传输通路&#xff0c;在神经假体、神经反馈训练、脑状态监测等领域有…

Visual Studio“Orcas”October 2006 CTP版下载

Visual Studio “Orcas” October 2006 CT版可以下载了&#xff0c;但这次Release的是一个虚拟机的镜像&#xff0c;所以需要在虚拟PC上运行&#xff0c;文件的大小是4150.5 MB&#xff0c;有点太大了。下载地址&#xff1a;http://www.microsoft.com/downloads/details.aspx?…

C++学习之路 | PTA乙级—— 1010 一元多项式求导 (25分)(精简)

1010 一元多项式求导 (25分) 设计函数求一元多项式的导数。&#xff08;注&#xff1a;x ​n ​​ &#xff08;n为整数&#xff09;的一阶导数为nx ​n−1 ​​ 。&#xff09; 输入格式: 以指数递降方式输入多项式非零项系数和指数&#xff08;绝对值均为不超过 1000 的整数…

简明 Python 教程学习笔记_7_文件操作(os、shutil、pathlib )

参考 &#xff1a;http://www.cnblogs.com/nulige/archive/2016/12/06/6037752.html 在很多时候&#xff0c;你会想要让你的程序与用户&#xff08;可能是你自己&#xff09;交互。你会从用户那里得到输入&#xff0c;然后打印一些结果。我们可以分别使用 raw_input 和 print 语…

地牢房间迷宫走廊生成(二),Python实现洪水法、完美迷宫

文章目录前言1 随机房间和房门2 生成走廊2.1生成迷宫2.4 使用循环改进2.3 走廊缩减2.3 走廊再简化总结前言 前面通过随机房间、房门&#xff0c;对房门寻路生成走廊。由于使用A星算法&#xff0c;寻到的是最短路径&#xff0c;这样生成的走廊过直和简单。如果需要生成弯曲的走廊…

Introduce Parameter Object(引入参数对象)

某些参数总是很自然地同时出现 重构&#xff1a;以一个对象取代这些参数

深度解析,马斯克最新发射的先进火箭

来源&#xff1a;环球时报概要&#xff1a;就在几个小时前&#xff0c;美国人成功发射了目前全世界运载能力最强的超级火箭——“猎鹰重型”。就在几个小时前&#xff0c;美国人成功发射了目前全世界运载能力最强的超级火箭——“猎鹰重型”。虽然中芯级火箭在回收过程中坠毁&a…

发现还是 True Image Server v8.1.941 比较好用

今天下了 True Image Server 9.1 并安装使用&#xff0c;发现9.1版本的用起来似乎更麻烦了&#xff0c;还是喜欢 8.1 的&#xff0e;于是卸载了 9.1 版本重新安装 8.1 版的 但是我发现 8.1 版本的安装使用时总是提示已经过期了&#xff0c;失效了&#xff0e;搞了半天&#xff…

C++学习之路 | PTA乙级—— 1011 A+B 和 C (15分)(精简)

1011 AB 和 C (15分) 给定区间 [−2 ​31 ​​ ,2 ​31 ​​ ] 内的 3 个整数 A、B 和 C&#xff0c;请判断 AB 是否大于 C。 输入格式&#xff1a; 输入第 1 行给出正整数 T (≤10)&#xff0c;是测试用例的个数。随后给出 T 组测试用例&#xff0c;每组占一行&#xff0c;顺…

Encapsulate Downcast(封装向下转型)

某个函数返回的对象&#xff0c;需要由函数调用者执行向下转型&#xff08;downcast&#xff09; public Object lastReading() {return readings.lastElement(); } 重构&#xff1a;将向下转型动作移动到函数中。 public Reading lastReading() {return (Reading) readings…

简明Python教程学习笔记_8_异常

菜鸟教程 之 Python 异常处理&#xff1a;http://www.runoob.com/python/python-exceptions.html Python 一篇搞定所有的异常处理&#xff1a;https://www.cnblogs.com/wj-1314/p/8707804.html Python 捕捉详细异常堆栈的方法 Python 中使用 try except 的方法捕获异常&#…

咖啡的味道

转自http://bbs.21our.com/main.asp一直就这样的静静的呆着&#xff0c;看着人来人往&#xff0c;听着笑语悲歌&#xff0c;却什么也不想说&#xff0c;什么也不想做。  下午有段时间&#xff0c;莫名其妙的烦躁起来&#xff0c;脑袋绷的紧紧的&#xff0c;甚至有种要窒息的感…

技术专栏 | 两万字深度长文!从原理到趋势 解剖风口上的区块链技术

来源&#xff1a;芯师爷概要&#xff1a;区块链不是一项新技术&#xff0c;而是一个新的技术组合。其关键技术包括P2P动态组网、基于密码学的共享账本、共识机制、智能合约等技术。区块链不是一项新技术&#xff0c;而是一个新的技术组合。其关键技术包括P2P动态组网、基于密码…

C++学习之路 | PTA乙级—— 1012 数字分类 (20分)(精简)

1012 数字分类 (20分) 给定一系列正整数&#xff0c;请按要求对数字进行分类&#xff0c;并输出以下 5 个数字&#xff1a; A ​1 ​​ 能被 5 整除的数字中所有偶数的和&#xff1b; A ​2 ​​ 将被 5 除后余 1 的数字按给出顺序进行交错求和&#xff0c;即计算 n ​1 ​​…

Replace Error Code with Exception(以异常取代错误码)

某个函数返回一个特定的代码&#xff0c;用来表示某种错误情况 public int withdraw(int amount) {if (amount > balance) {return -1;} else {balance - amount;return 0;} } 重构&#xff1a;改用异常 public int withdraw(int amount) {if (amount > balance) {thr…

Python 进阶

​Python 进阶&#xff1a;https://eastlakeside.gitbook.io/interpy-zh/ Python 经典教程 专题 系列&#xff1a;https://www.jb51.net/Special/520.htm Python 黑魔法指南&#xff1a;https://magic.iswbm.com/ Python 中文指南&#xff1a;https://python.iswbm.com/ Python…

太闷了,换个样子!

真的很闷&#xff0c;Blog换个样子&#xff0c;以前的黑色&#xff0c;太沉闷了&#xff01; 转载于:https://www.cnblogs.com/lovenets/archive/2006/11/18/564736.html

2018年中国65家机器人产业园布局与规划汇总盘点

来源&#xff1a;机器人创新生态概要&#xff1a;“机器人换人”大潮下&#xff0c;中国已连续两年坐上世界机器人最大消费国的宝座&#xff0c;根据国际机器人联合会&#xff08;IFR&#xff09;发布的数据&#xff0c;2016年中国工业机器人的销量为9万台&#xff0c;同比增长…

C++学习之路 | PTA乙级—— 1013 数素数 (20分)(精简)

1013 数素数 (20分) 令 P ​i ​​ 表示第 i 个素数。现任给两个正整数 M≤N≤10 ​4 ​​ &#xff0c;请输出 P ​M ​​ 到 P ​N ​​ 的所有素数。 输入格式&#xff1a; 输入在一行中给出 M 和 N&#xff0c;其间以空格分隔。 输出格式&#xff1a; 输出从 P ​M ​​…

Replace Exception with Test(以测试取代异常)

面对一个可以预先检查的条件&#xff0c;却抛出了一个异常 public double getValueForPeriod(int periodNumber) {try {return values[periodNumber];} catch (ArrayIndexOutOfBoundsException e) {return 0;} } 重构&#xff1a;调用函数之前先做检查 public double getVal…