最近有个想法,想给Unity程序进行加密,设置程序的使用权限,网上找到的方法有多种
1、给程序设置账号和密码,这个不用多说都明白
2、给程序设置使用的时间,如果程序超过这个时间就不能使用程序
3、给程序设置使用次数,如果程序超过使用次数将不能使用程序
4、给程序设置一个特定权限,只有拥有权限才能正常使用程序
不过上面的方式虽然可以起到限制作用,若是找到这些设置的权限信息再修改之后,就可以无视这个权限正常使用程序,既然要设置权限,这肯定不是我们想要的,所以就有了另外一种方式,把这些权限信息转换成无法正常读懂的信息保存就可以了,不过,世界上不存在绝对保密的东西,只要是加密,总会有解密使用的时候,加密之后虽然可以防止别人的修改,若是碰到高手,一样可以破解加密信息,既然还会被破解,那我们为什么还要加密干什么呢,我们要做的就是让别人不那么容易就获取我们的劳动成果。
开始重磅加密,在上代码之前,先说下各种加密的种类
加密分为对称加密和非对称加密
对称加密:加密和解密使用同一个密钥的加密方式
常见的对称加密算法有DES、3DES、AES。
非对称加密:非对称加密算法需要两个密钥:公开密钥和私有密钥,公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
常见的非对称加密算法有:RSA、ECC(移动设备用)、DSA(数字签名用)。
还有比较特殊的加密,个人觉得不算是加密算法,这就是MD5和Base64编码,为什么说这是不是加密的加密呢,
首先,加密就是把数据转换以后,变成了另一种数据格式,除非拥有解密方式,否则没人能把数据转换回来。
MD5是一种信息摘要算法,是Hash算法的一种,又叫散列算法,Hash通常用于制作数字指纹,它是不可逆的,不可以解密。所以它只能算的上是一种单向加密算法。
Base64是一种数据编码方式,虽然是可逆的,但是它的编码方式是公开的,也就算不上加密。
好了,加密种类知道之后,我们就可以开始我们的代码编写进行信息加密
1、MD5
虽然算不上是加密算法,却常用于确认信息传输是否完整一致,因为对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
输出结果:
2、Base64
使用 Encoding.GetString 转换,可能得到很多方块或问号,这是由于某些整数序列无法对应于我们现实生活中的文字的原因,只能用方块或问号来代替,
base64绝对不存在任何不可读的字符,ToBase64String 使用 base 64 数字编码,它生成的全部是ASCII 字符,也不存在关键字冲突字符,不需要转义。
注意:不是使用base64编码的文字信息,若是由base64转换成byte[]会出错。
缺点:Base64比起它的原始文本增大约30%。
输出结果:
对称加密
1、DES
DES算法只是使用了标准的算术和逻辑运算,其作用的数最多也只有64 位,因此用70年代末期的硬件技术很容易实现算法的重复特性使得它可以非常理想地用在一个专用芯片中。已破解,不再安全,是对称加密算法的基石,具有学习价值
密钥长度56(JDK)、56/64(BC)
2、AES
用来替代原先的DES,已经被多方分析且广为全世界所使用。已然成为对称密钥加密中最流行的算法之一,AES算法在对明文加密的时候,并不是把整个明文一下全部加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。第二段若是不足128bit,需要对明文进行填充。这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。
密钥长度128/192/256,其中192与256需要配置无政策限制权限文件(JDK6)
非对称加密
1、RSA
RSA是第一个既能用于数据加密也能用于数字签名的算法,原理就是对一极大整数做因数分解的困难性来保证安全性。
加密过程表示:
由表达式可知,RSA加密是对明文的E次方后除以N后求余数的过程,E、N就是公钥,知道E、N的人就可以进行加密,是不是很简单,不过E、N也并不是那么容易就得到的,需要严格的数学计算才能得到,密钥越大,越不容易破解
解密过程表示:
密文进行D次方后除以N的余数就是明文,D、N就是密钥
2、DSA
DSA 是基于整数有限域离散对数难题的,DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却做不到。这是一种更高级的验证方式,用作数字签名。私钥加密生成数字签名,公钥验证数据及签名,如果数据和签名不匹配则认为验证失败。数字签名的作用就是校验数据在传输过程中不被修改,数字签名,是单向加密的升级。
DSA算法中应用参数:
p:L bits长的素数。L是64的倍数,范围是512到1024;
q:p – 1的160bits的素因子;
g:g = h^((p-1)/q) mod p,h满足h < p – 1, h^((p-1)/q) mod p > 1;
x:x < q,x为私钥 ;
y:y = g^x mod p ,( p, q, g, y )为公钥;
H( x ):One-Way Hash函数。DSS中选用SHA( Secure Hash Algorithm )。
p, q, g可由一组用户共享,但在实际应用中,使用公共模数可能会带来一定的威胁
1、创建密钥
2、使用密钥的方式验证
3、使用加密对象验证
PS:DSA方式验证,没有明白,我查到官方文档是使用的验证DSAParameters 的方式验证明文和密文,虽然可以验证,在使用的时候不可能同时使用加密解密一起吧,而若是不同时使用,公钥对象和密钥对象又不是一起生成的,这样的验证方式还可以吗?所以实在没明白这块,若有大佬指点迷津,非常感激。