下面介绍几种简单有效的加密手段。因为我介绍的方法无需对密文进行解密,所以一律略过解密算法(不是破解算法)和密钥的介绍,如果有人想了解,可以私下联系我。
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,这就是摘要。如果有人改动原始数据,改动后的数值很难恰好还等于这个值,尤其是在不知道算法乱改的情况下。