Delphi-JAVA互加解密AES算法

Delphi-JAVA互加解密AES算法

最近项目中用到了AES加密算法,网络搜罗没有适用Delphi与AES互相加解密完善的代码,所以只好自己动手了。
首先介绍下为什么从网上搜罗来的代码要么不能互加解密:1、要统一原文的编码格式,因为不同的编码格式占用内存是不同的,不同的内存数据去加密结果当然不一样了。2、AES是一种标准的算法,他对原文密钥以及CBC模式下的初始向量都是由位数要求的,其中原文要求长度必须为16的整倍数,不足怎么办呢,那就用到了PKCS5Padding(JAVA-JCE中实现了但delphi没有,只能自己做了,原理是总位数对16取余,余数填充到原文余几填充几位,去补码的时候当然是反过来去了,不明白就去面壁吧)。 密钥长度分为128、192.256(在JAVA-JCE中也就是16、24、32)不足怎么办呢,我采用的办法是用0补齐(java中有他自己的填充方式,当然我不知道他的规则所以都采用用0补齐的方式)。3、还有一点注意的就是解密出来的内存数据是2进制数据你要对应加密前原文的编码去还原(UTF8编码是不定长的占用内存1-6字节怎么解呢,最终还是delphi帮助里找到了答案,TEncoding可以解决这个问题,大家可以参考下delphi的帮助)。
本组代码采用标准AES算法(基础算法引用ElAES.pas,感谢作者),代码支持AES/ECB/PKCS5Padding、AES/CBC/PKCS5Padding 密钥长度128/192/256bit,密钥0填充,Delphi与JAVA互相加解密。加密前Delphi与JAVA统一字符编码为UTF8,不然加密结果会不同。Java默认情况下使用不了密钥长度192bit及256bit密钥需要下载JCE下载地址大家自己百度就好了,下载好之后把local_policy.jar/US_export_policy.jar两个jar包放到JRE目录%jre%/lib/security下。
其中delphi代码使用delphi10开发(xe以上应该都没问题)。验证时请注意delphi memo1.text中换行问题(例如编辑代码时复制大段的文字到memo1.lines中)运行时自动换行处delphi会自动加上回车符导致加密结果不同(这块搞的我费老劲了)。
补充一点,有朋友说加密结果和网络上在线AES加解密(http://www.seacha.com/tools/aes.html)128位结果一样192、256位结果不同。通过我验证应该是这个网站没有替换JCE扩展只能加密128位密钥长度,大家可以用这样来验证下,密钥长度选择192位,然后密钥里面填写 1234567890123456(16个字符也就是128位)计算一次结果,按理说这个时候密钥长度不足192位他要补码的,接下来密钥里面再填写123456789012345678901234(24个字符也就是192位)计算下结果你会惊奇的发现结果怎么相同呢。难道补码方式能补出78901234吗?当然不是,问题应该出在你不论选择多少位密钥他都按照128位去计算结果。但是我用另一种方式验证也就是密钥16个字符不边选128位和192位在这个网站里计算出的结果还不同,不明白具体是哪出了毛病。

不说废话了上代码。
http://download.csdn.net/detail/qiaohaidong/9477264



你可能感兴趣的:(java,aes,Delphi,pkcs5padding,ECBBCB)