AES(AdvancedEncryptionStandard)加密算法,在密码学中又称Rijndael加密算法,是一种区块加密标准算法。AES加密算法由美国国家标准与技术研究(NIST)于2001年11月26日发布于FIPSPUB197,并在2002年5月26日成为有效的标准。现在AES加密算法已然成为对称密钥加密中最流行的算法之一。
RSA(RonRivest、AdiShamir、LeonardAdleman,3个提出者的姓氏首字母)加密算法是一种非对称加密算法(公钥加密算法)。RSA加密算法有一对密钥,一个是公开密钥,另一个是私有密钥,公钥用作加密,私钥则用作解密。使用公钥把加密后所得的密文,只能用相对应的私钥才能解密并得到原本的明文。
RSA的原理基于一个简单的数论知识:对两个互质的大数乘积进行因式分解很困难。RSA加密算法有两种应用模式,分别为加解密模式、签名验签模式。
RSA加解密模式是指采用公钥加密,私钥解密的模式。其应用为:需要加密明文数据并解密的场景。发送方将公钥加密后的密文发送给接收方,接收方用私钥解密密文后即可得到明文。
RSA签名验签模式则是网文中常见的所谓**“私钥加密,公钥解密”的逻辑。它其实是指采用私钥签名,公钥验签的模式,其应用为:需要给一条消息署名的场景。发送方将明文+私钥签名后的明文摘要消息发送给接收方,接收方用公钥解密出来私钥签名后的明文摘要**,并计算出发送方传输过来的明文的摘要进行比对,一致则验签成功。常用数字签名算法有:MD5withRSA、SHA1withRSA、SHA256withRSA。
一般来说,对称算法比非对称算法的加解密速度要快得多,并且RSA加密算法加密的长度有效,单次加密最大不大于密钥长度。因此实际使用中一般会结合RSA+AES两者使用,这也是为什么要用RSA算法签名摘要或者加密AES密钥的原因,提高效率的同时规避加密长度限制。
比如在HTTPS通信中的TLS(TransportLayerSecurity,其前身是安全套接层SecureSocketsLayer,缩写:SSL)安全协议,握手时采用RSA算法加密随机数与对话密钥,握手成功后就采用AES算法进行对称加密通信。
话不多说,上(伪)代码:
License=AesKey16+AesEnc(data).length+AesEnc(data)+RsaSign(AesEnc(data));License:就是最终生成的激活码字符串;
AesKey16:随机生成的16位AES密钥,选用固定长度密钥,因此不用拼接AesKey长度;
生成逻辑:
看到这里,也许有人会说:万一你这激活码生成规则被人知道了,怎么防止别人破解伪造啊?
激活码生成示例:
publicstaticStringgetLic(licenseBeanbean){Stringlic="";try{StringaesKey=MyUtil.getRandomString(16);StringencData=AesUtil.encrypt(aesKey,bean.toJson());StringencDataLength=Integer.toHexString(encData.length());Stringsign=RSAUtil.sign(RSA_PRI_KEY,encData);lic=aesKey+encDataLength+encData+sign;Log.d("bruce",lic);returnlic;}catch(Exceptione){e.printStackTrace();returnlic;}}一个激活码样例:
11Tf2wg9JjXeuvKTd8m4QwVfLJczRej06EAVut7coeJf3iSBDAkEl3E6faNYnG3SwiRbNBtSTmW+oRJ0kLVZf8ZIWeDQecyUqfBMiCwkYkPK4PAsmCK+kWd/aAZ+90t9QSZTq/qe4VQzkFuAk9a7D+vcF4e3BkVUovZuzB9XvmdIrNw8menjFLdWE+S0YD+VIs7AS8wUBBdA9+aH9/mZ8Oc53klslYT0mGGtTK0g==YRjmOKNaA5hA4hTAmHAK8LvRWjJqzKbGpxALd3V9dcX6Ln1ImKw0NhAVflAA5asyD4eaoafExlclCU+ayd2CyHpFmlIKTd4Uzh20y5Qke03WrGMWgSEaCgz+mZrihX0nwoyg5GXuOI0/dqOplX7mf+mSd8wgk9d2paOBvm5+ea4=
既然我们已经生成了激活码,那在校验时无非就是读取License,按照我们设计激活码时拼接的规则进行截取、校验。