在软件开发中,各系统间经常要进行数据交互,基于安全考虑都会进行数据加密。
由于不同的开发环境,编程语言导致加密解密经常出现问题。
我在开发Android与C#程序之间的数据交互时也遇到了这个问题,
C#系统采用DES加密字符串,Android用DES解密就是不成功,从网上搜了许多源码都不能用,现将处理经验与大家分享一下。
一、
以下代码为Android加密的核心语句:
Cipher cipher = Cipher.getInstance( "DES/ECB/NoPadding" );
其中的参数含义为:DES为加密算法,ECB为加密模式,NoPadding为填充模式
当你采用这种写法时Cipher cipher = Cipher.getInstance( "DES" ),系统将采用默认参数DES/CBC/PKCS5Padding。
二、
Cipher类为加密和解密提供密码功能,转换始终包括加密算法的名称(例如,DES),后面可能跟有一个加密模式和填充方案。
Cipher.getInstance的参数格式:"加密算法/加密模式/填充模式" 或 "算法"
三、
常用加密算法:
DES、3DES、RC4、AES等;
加密模式:
ECB、CBC、CFB、OFB等;
填充模式:
NoPadding、PKCS1Padding、PKCS5Padding、PKCS7Padding;
四、
以上不同参数的组合将生成完全不同的密文。
我就是用不同的参数组合一个个测试,才最终解决加解密的问题。
以下加密参数我都试了一遍。
DES/CBC/PKCS5Padding,
DES/CFB/PKCS5Padding,
DES/ECB/PKCS5Padding,
DES/OFB/PKCS5Padding,
DES/CFB/NoPadding,
DES/CBC/NoPadding,
DES/ECB/NoPadding,
DES/OFB/NoPadding,
最后使用参数"DES/ECB/NoPadding", 才出现了一线曙光。
其中的加密模式ECB安全性较差,目前新的平台中都较少用了,但是早期其他语言开发的系统就会使用这种模式。
五、
这时发现有些明文加密后返回值为null,原来是明文的长度必须为8的倍数。
增加一个while循环填充空格就可以了。
当你处理其他系统间的加密解密数据交互时,也可以参考一下。
源代码下载地址:http://download.csdn.net/detail/marko39/8013335