项目中遇到需要对某些敏感数据进行加密的需求,并且需要兼容Android,iOS,PHP三个平台,也就是说,各个平台上加密相同的数据,加密结果是一样,每个平台加密的密文,其他平台都能解密出正确的原文。
期初,看起来是一个很简单的需求,有强大的互联网嘛,Google下,什么都有,在经历了数次无果的尝试之后,才发现,这个问题并不是很简单,主要的原因是,每个平台实现的加解密算法都有一丝丝不同,要么是这个平台的密文,在另外一个平台不能正确解密;要么就是某两个平台的数据互通兼容了,第三个平台又不支持了;在经历了无数次的查阅资料,搜索stackoverflow后,终于搞定了这个问题,先上代码下载地址:
先来了解下AES加密算法,来自维基百科:
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
AES加密算法,有不同的实现方式,比如按照秘钥位数,分为128位,192位,256位;按照工作方式,有CBC,ECB,CFB,OFB等四种(详细内容可以查看这里);除此之外,为了数据对齐,还有不同的Padding填充方式,比如NoPadding,PKCS5Padding,PKCS7Padding,ISO10126Padding等填充方式。因此这样排列组合一下,各个平台的加解密不兼容就不奇怪了。
本文实现的是128位的CBC模式PKCS5Padding方式填充的AES算法,废话不多说,上代码: 继续阅读全文