找回密码
 点一下
查看: 5450|回复: 22

实用加密算法入门

[复制链接]
发表于 2014-9-23 22:40:20 | 显示全部楼层 |阅读模式
本帖最后由 yxxiaobin 于 2019-7-3 11:09 编辑

星际2编辑器比起魔兽3编辑器强大无比,这一点已经没有人怀疑了,其中非常重要的一点就是,星际2原生支持多人数据集,这个可比魔兽3的缓存强多了。既然要用数据集,那么就要考虑数据加密问题,我想大部分不太菜的玩家都知道修改bank文件以快速提升自己的实力吧。也许玩家是很喜欢明文数据集的,但是这种行为绝对严重缩短游戏的寿命,是作者非常不想看到的。怎么解决这一矛盾呢?给数据集加密是个不错的方法,而且星际2编辑器自己本身就支持加密数据集。使用自带的加密方法加密后,数据集变成一行不可读的字符串,对于我们这类强迫症的人恐怕也是很难接受的。我们喜欢清晰明朗的可读明文,但是又不希望玩家自己随便修改里边的数据,怎么办呢?其实方法很多,这里我就介绍一种简单实用的加密方法。

其实题目想叫做加密算法简介来着,但是觉得文不对题,想来想去,“实用”和“入门”两个词比较合适,于是就叫实用加密算法入门吧。
其实加密算法这东西历史可真悠久了,据说在我国春秋时期就有简单的加密方法了,到近代,计算机技术发展以前,已经形成了一个完整的体系,有专门的学者研究加密和破解技术,这门学问现在被称为经典密码学。在计算机技术发展起来以后,加密和破解技术都发生了翻天覆地的变化,各种算法层出不穷,那真是复杂无比。比较值得一提的是,现代密码学几乎都是以数学计算为基础的,所以现代密码学的加密方法又叫做加密算法。不过在这里,我不打算详细的介绍每种经典加密方法和现代加密方法,基于实用性,我们用不着都了解它们,知道几个简单有用的就可以了。

进入正题,先说一下我推荐的加密思路:玩家数据仍然使用明文记录,同时用两三种简单的经典加密方式来产生加密过的摘要,将此摘要附在数据集之后,载入数据集文件后,只要利用明文数据重新生成一遍摘要,比较和数据集中记录的是否相同就好了。对于这种加密方法有这么几点好处:1.加密算法超简单,几乎略有一点点算法基础的都能搞定;2.加密过程简单,不需要对每项数据都进行加密,只加密摘要就可以了,这样加密步骤从十几步甚至数十步一下就减少到一步;3.破解困难,摘要密文极短,靠猜解几乎是不可能的。当然也不是无解,如果对方提取你的地图,看懂加密算法后自己用工具重现你的加密过程,就能重新生成数据集文件。对于有这种能力和兴趣的人来说,你弄个银行中央数据库的加密算法都白搭。这样我们加密针对的主要人群就是有兴趣改存档,但是有不愿意或不会破地图的玩家,所以只要密文足够难以猜解就好了。4.仍然保留清晰可读的明文,能满足一大批和我一样患“强迫症”的地图作者。

下面介绍几种简单有效的加密手段。因为我介绍的方法无需对密文进行解密,所以一律略过解密算法(不是破解算法)和密钥的介绍,如果有人想了解,可以私下联系我。
1.替代法。这个是经典加密方法中非常重要的一类了,简单的思路就是分别用一个字去替换原文中的字,比如原文是
www.islga.org,我们用x替代w,o替代点,e替代i....,最后就得到密文:xxxoexitmopuv,基本上没人能看懂这是地精研究院的网址吧。根据密码表数量不同,有单表法、多表法等,多表法这里不多介绍了。我推荐使用单表法,因为这个最简单,只要一张密码表就好了。首先,建立一张大小和原文字符集大小一样密码表,比如加密小写字母,就要建立由26个不同元素组成的密码表,这样才能保证和原文能实现一一对应。如果你的原文字符集太大,则不适合本类加密算法,比如你的原文要是由汉字组成的,显然建立一张数万元素的密码表不合理,这时最好先对原文进行处理,比如将文字转换成ascII码,元素数一下就变成11个了(汉字的ascII码是负整数)。因为多数数据是用于记录经验、金钱等数值的,所以这里我以加密一个实数来举例:我们可以这样建立密码表,声明一个1*12的字符串数组,然后每个元素填入一个英文字母,要求不能重复,这样元素0-9的字母分别用于替代数字0-9,元素10用于替代小数点,元素11用于替代负号。然后将要加密的实数转换成字符串,逐一取出字符,并替换,最后得到一个和原实数字符数一样的字母串,就是我们要的密文了。举例:我们取这样12个字符依次填入密码表:a b c d e f g h i j k l,用他们加密-12.4,结果就是labkd。因为玩家不知道你具体填入哪些字符,所以即便知道这种方法,也不容易直接破解你的密文。但是如果只这样处理,仍然不保险,毕竟有一定规律,比如第一个字符绝对不是0,最后一个字符绝对不是小数点,如果某个字符频繁出现在第一位上,则它极有可能是代表负号等等。所以还要配合其他加密方法。当然,可能有时候需要加密字母,只要将变量数组扩展到1*26,在将26个字母乱序后写入数组就好了,不一定非要弄一套不同体系的字符出来。一般的密码表思路就是,用原文的字符集组合到一起,打乱顺序作为替换码,比如单纯英文字母,就用英文字母打乱顺序,如果还包括数字,就用英文字母加数字打乱顺序,不必追求是字母替代数字,还是数字替代数字。
2.移位法。这个容易理解,比如将字符串从某个位置截断,然后前后对调,或者将字符串翻转,或者每隔一定字符抽取一个字符出来重新排序。这样一来字符串顺序就乱掉了,内容会变得不可读。比如还是www.islga.org,我们用隔1抽1法来移位加密,得到的密文就是wwilaogw.sg.r。
3.计算法。用计算的方法来改变原文是现代密码学的主要方法,算法也多种多样,简单的有异或算法,复杂的有哈希算法等,但是它们都要求算法是可逆的,也就是说必须有对应的解密算法。如果直接用除法或开方什么的就不行,因为会破坏数据完整性,比如让你加密10这个数,你让10除以3,得到了3.3333,让你解密它,就没有办法了(就算除以2也不可靠,因为计算机能记录的小数位数有限,可能会出现四舍五入的情况)。但是我们在加密存档时却可以这么做,因为我已经说过了,我们不需要解密。所以你可以简单的弄一些四则运算来改变数值,就能达到加密的目的。
4.摘要法。摘要法其实不属于真正的加密/解密算法,因为它本身就是不可解密的,摘要法只是用来验证数据的真实性和完整性,这和我们加密数据集文件的目的是一模一样的。大家耳熟能详的MD5算法就是一种非常优秀的摘要算法。当然我们完全不必要用这么复杂的算法,而且一个已知的算法也不能在这里使用,否则只需要重新生成摘要码就能作假了。毕竟我们只是用程序去验证,而摘要码事先又不可知,这一点和计算机中的数字签名不完全一样。因此我们必须自己设计算法,并保证这个算法不被人知道。我推荐的算法很简单:让多个待加密数值进行四则运算即可。比如我们要记录3个数据:经验值是1246.42,晶矿是55621,瓦斯是32,那么我们将他们加在一起(当然你也可以加一个数再减另外一个数或者加上取余、取模等等),得到他们的和是56999.42,这就是摘要。如果有人改动原始数据,改动后的数值很难恰好还等于这个值,尤其是在不知道算法乱改的情况下。


最后,将这些方法合理的组合起来,就形成很难猜解的加密,比如:先摘要,然后进行一定计算,比如加一个常数,再乘以一个常数,然后进行替换,最后对替换后的字符串进行移位。实际操作中这些加密手段不必全用上,或者你觉得还不可靠,可以多次加密,比如摘要后移位,再计算,替换,最后再次移位等等。还是上边那个例子,最后的摘要明文是56999.42,我们不使用计算,只对这个数进行替换然后再移位,最后得到一个经过加密的摘要码,结果是krdkvek,然后用明文将经验值等数据写入数据集,最后附上这个加密过的摘要。等读取数据集的时候,用读到的结果重新生成摘要就可以了。如果有人私自改了存档,比如把经验值改成了999999,则得到的摘要几乎不可能和原来的一样,这样你就知道存档被修改了,然后将他的数据全部清零就好了。当然,你完全可以创建更复杂些的摘要,比如将每个数据单独进行计算加密后转换成字符串,然后在将字符串间隔着组合在一起,这样就更难破解了。

最后说句题外话,加密技术没必要过多去研究,因为无论你做的多难破解,要想破解只要提取地图去看源码就好了,现在都有现成的程序,真的是不要太简单。我们仍然去加密,不过是防君子不防小人罢了,与其搞一些超高明的加密算法,还不如把时间用在做一张更好的地图上。毕竟,地图不好,存档做的再棒也没人欣赏不是?

以上纯属个人经验,本人既不是搞密码的,也不是搞编程的,某些地方难免会有疏漏,欢迎大家指正。





发表于 2014-9-24 17:47:07 | 显示全部楼层
谢谢分享,好东西应该分享一下.
借用楼主的话,"我推荐使用单表法,因为这个最简单,只要一张密码表就好了。"我觉得这个办法很好.
顶一下.
回复

使用道具 举报

发表于 2014-9-24 18:56:57 | 显示全部楼层
好久不见游侠小彬了
回复

使用道具 举报

发表于 2014-9-25 06:23:00 | 显示全部楼层
SE谈加密意义不大。
回复

使用道具 举报

 楼主| 发表于 2014-9-25 12:15:08 | 显示全部楼层
565266718 发表于 2014-9-24 18:56
好久不见游侠小彬了

我始终没有消失过呀,只不过最近只是回复,没有怎么发新帖子而已。
回复

使用道具 举报

 楼主| 发表于 2014-9-25 12:24:54 | 显示全部楼层
娜渃卟Ran 发表于 2014-9-25 06:23
SE谈加密意义不大。

也说不上没有意义,只是不必做的很复杂而已。一个很典型的例子就是scv团队,游戏做的虽不复杂,但是等级系统做的还可以,有它吸引人的地方。但是当我发现选择第二个宠物会覆盖第一个宠物的时候,就找到它的存档,居然是明文,于是顺手改成3宠物了。然后顺便百度了一下,居然有不少此类教程,用来改经验什么的。虽然我不会无聊到去改经验,但是我相信有不少玩家有此兴趣的。如果随便加密一下,估计至少挡住80%以上的人吧。稍微用下心,那么除了肯下功夫破地图的,那么基本上就不会有人能改存档了。事实上,任何限制手段都不是以限制所有人为目的的,就连现实世界的法律都是这样,何况我们小小的存档加密。我们加密存档的目的,仅仅是让绝大多数玩家都无法自行修改存档而已。你可以这样想,我们花5元钱买个自行车锁,肯定是不比银行保险库的锁管用,但是你会不会因为这个就放弃给自行车上锁呢?
回复

使用道具 举报

发表于 2014-9-25 12:57:57 | 显示全部楼层
点赞。对我来说摘要法就挺不错的了
回复

使用道具 举报

发表于 2014-9-25 13:27:01 | 显示全部楼层
不错!学到了。
回复

使用道具 举报

发表于 2014-9-26 14:22:28 | 显示全部楼层
yxxiaobin 发表于 2014-9-25 12:24
也说不上没有意义,只是不必做的很复杂而已。一个很典型的例子就是scv团队,游戏做的虽不复杂,但是等级 ...

只是一说,从某个角度说加密肯定有必要,只是说从技术层面来说所谓的加密意义不大,因为根本就不是真正的加密,和明文区别不大。
回复

使用道具 举报

发表于 2014-10-4 19:41:38 | 显示全部楼层
搞个实例教程就更好了!
回复

使用道具 举报

发表于 2015-1-30 03:10:30 | 显示全部楼层
小彬  能不能做个演示给我们,关于如何使用这些方法,这方面很不足!
最近在学校演算体和BANK
谢谢了!
回复

使用道具 举报

发表于 2015-1-30 03:15:21 | 显示全部楼层
qq1557504134 发表于 2014-9-24 17:47
谢谢分享,好东西应该分享一下.
借用楼主的话,"我推荐使用单表法,因为这个最简单,只要一张密码表就好了。 ...

具体在怎么做,有没有演示,学习!

点评

http://bbs.islga.org/read-htm-tid-2227781-page-1-fpage-1.html 这里是演示,希望对你有用。  详情 回复 发表于 2015-2-1 00:31
回复

使用道具 举报

 楼主| 发表于 2015-2-1 00:31:53 | 显示全部楼层
zjm1001010 发表于 2015-1-30 03:15
具体在怎么做,有没有演示,学习!

http://bbs.islga.org/read-htm-tid-2227781-page-1-fpage-1.html
这里是演示,希望对你有用。

点评

那先在此谢过啦  详情 回复 发表于 2015-2-2 19:59
可以拿去用在我的地图上吗?我会注明的!  详情 回复 发表于 2015-2-2 14:24
回复

使用道具 举报

发表于 2015-2-2 10:28:35 | 显示全部楼层
yxxiaobin 发表于 2015-2-1 00:31
http://bbs.islga.org/read-htm-tid-2227781-page-1-fpage-1.html
这里是演示,希望对你有用。

SC2可以选择加密Bank的,基本不需要使用密码
估计是地图作者不知道

另外加密算法的话就是两种,一种是减少信息,作为明文信息的效验,另外是添加冗余信息来避免随机输入密码就能获得一个结果。
http://bbs.islga.org/forum.php?mod=viewthread&tid=35011
这是当年在WE中做的密码系统
回复

使用道具 举报

发表于 2015-2-2 14:24:32 | 显示全部楼层
yxxiaobin 发表于 2015-2-1 00:31
http://bbs.islga.org/read-htm-tid-2227781-page-1-fpage-1.html
这里是演示,希望对你有用。

可以拿去用在我的地图上吗?我会注明的!

点评

可以,发出来的东西,本来就是共享资源嘛。  发表于 2015-2-2 17:53
回复

使用道具 举报

发表于 2015-2-2 19:59:17 | 显示全部楼层
yxxiaobin 发表于 2015-2-1 00:31
http://bbs.islga.org/read-htm-tid-2227781-page-1-fpage-1.html
这里是演示,希望对你有用。

那先在此谢过啦
回复

使用道具 举报

发表于 2015-12-15 06:39:15 | 显示全部楼层
我自己设想了一种加密方法,把地图中的关键数据(例如玩家积分Y)分成几种不同的数据A,B,C,并用一个函数Y=f(A,B,C)来表示,上传的时候把自动混淆脚本文件功能打开,数据A,B,C用楼主的方式加密,但是数据Y故意不加密用明文,此时要是他人想直接读源码,由于被混淆,难度很大,于是搜存档改数据,而且积分能直接搜出来,感觉根本没加密似的,直接改,不过进了游戏,触发还是会自动按照Y=f(A,B,C)来生成真正的Y值。

点评

不错的想法。数据集加密本身就是为了保持数据集明文可读性,如果只是为了加密,直接在代码里使用加密数据集就好了,根本用不到自己手动加密。  发表于 2015-12-17 19:13
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-22 11:19 , Processed in 0.179663 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表