3Des加密

1.编码方式的统一

统一使用utf-8编码方式

2.Base64encodedecode

为防止3des加密后产生的乱码问题,加密后的数据都得用Base64.encode()一下,相应的解密的时候,应将拿到的加密后的数据源进行Base64.decode()一下,再进行3des解密

3. 3des的加密、解密模式的统一

3des有两种工作模式

CBC  (keyiv,  data)

ECB  (key , data)

4.补码方式的统一(padding)

Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS5Padding");

5.+”号与空格的问题

php服务器端加密后的数据是"F6AZJnQKKYE+ettC5edUbned+HVsD/76"

但是android端拿到后的数据是 "F6AZJnQKKYE ettC5edUbned HVsD/76"导致无法进行解密

可以发现相应的“+”号都被转换成了空格,这是什么问题?

为防止中文乱码问题,android对进行post请求后的数据进行了如下操作

URLEncoder.decode(字符串);

经试验发现,此方法会将“+”转换成空格,将空格转换成“+

所以php端进行返回数据的时候应该对应的进行URLEncoder.encode(字符串)

对于无中文乱码产生的地方也可以去掉URLEncode.decode(字符串)

RSA加密

1.too much data for RSA block问题

RSA是常用的非对称加密算法。这实际上是因为待加密的数据超长所致。

RSA 所能加密的数据的长度取决于key 的长度,公式如下:

数据长度 = key的长度/8 - 11

比如key的长度为512

那么能加密的数据长度最大为  512/8-11 = 53位,也就是要加密的字符串长度必须小于等于53

2.php端生成的公钥格式为pem格式

-----BEGIN PUBLIC KEY-----

Pub-key

-----END PUBLIC KEY-----

Android端使用的时候应该除去前后缀再使用

相应的,Php端拿到android端的pub-key,应该添加前后缀再使用

3.本地保存key,取出后缺少换行的问题

为了持久保存server端的pub-key,将拿到后的pub-key通过I/O流存储到文件中。

当下次使用的时候,用流读取,生成pub-key 。这有过程可能因为缺少换行出错,应该注意。