一、Android的Base64的几种不同的模式
- DEFAULT:使用默认的方法来加密。
- NO_PADDING:略去加密字符串最后的”=”
- NO_WRAP:略去所有的换行符(设置后CRLF就没有用了)
- CRLF:Win风格的换行符,意思就是使用CRLF这一对作为一行的结尾而不是Unix风格的LF。
- URL_SAFE:加密时不使用对URL和文件名有特殊意义的字符来作为加密字符,具体就是以-和_取代+和/
/**
* Default values for encoder/decoder flags.
*/
public static final int DEFAULT = 0;
/**
* Encoder flag bit to omit the padding '=' characters at the end
* of the output (if any).
*/
public static final int NO_PADDING = 1;
/**
* Encoder flag bit to omit all line terminators (i.e., the output
* will be on one long line).
*/
public static final int NO_WRAP = 2;
/**
* Encoder flag bit to indicate lines should be terminated with a
* CRLF pair instead of just an LF. Has no effect if {@code
* NO_WRAP} is specified as well.
*/
public static final int CRLF = 4;
/**
* Encoder/decoder flag bit to indicate using the "URL and
* filename safe" variant of Base64 (see RFC 3548 section 4) where
* {@code -} and {@code _} are used in place of {@code +} and
* {@code /}.
*/
public static final int URL_SAFE = 8;
/**
* Flag to pass to {@link Base64OutputStream} to indicate that it
* should not close the output stream it is wrapping when it
* itself is closed.
*/
public static final int NO_CLOSE = 16;
例子:(存在一些换行符,无法打印)
- 字符串:123333yasdkfb返回{"CityCode":"330100","ID":"2022ZJ00009"}
以下为使用android.utils.BASE64
- DEFAULT:MTIzMzMzeWFzZGtmYui/lOWbnnsiQ2l0eUNvZGUiOiIzMzAxMDAiLCJJRCI6IjIwMjJaSjAwMDA5 In0=
- NO_PADDING:MTIzMzMzeWFzZGtmYui/lOWbnnsiQ2l0eUNvZGUiOiIzMzAxMDAiLCJJRCI6IjIwMjJaSjAwMDA5 In0
- NO_WRAP:MTIzMzMzeWFzZGtmYui/lOWbnnsiQ2l0eUNvZGUiOiIzMzAxMDAiLCJJRCI6IjIwMjJaSjAwMDA5In0=CRLF:MTIzMzMzeWFzZGtmYui/lOWbnnsiQ2l0eUNvZGUiOiIzMzAxMDAiLCJJRCI6IjIwMjJaSjAwMDA5 In0=
- URL_SAFE:MTIzMzMzeWFzZGtmYui_lOWbnnsiQ2l0eUNvZGUiOiIzMzAxMDAiLCJJRCI6IjIwMjJaSjAwMDA5 In0=
- NO_CLOSE:MTIzMzMzeWFzZGtmYui/lOWbnnsiQ2l0eUNvZGUiOiIzMzAxMDAiLCJJRCI6IjIwMjJaSjAwMDA5 In0=
以下为使用java.utils.BASE64
- JAVA:MTIzMzMzeWFzZGtmYui/lOWbnnsiQ2l0eUNvZGUiOiIzMzAxMDAiLCJJRCI6IjIwMjJaSjAwMDA5In0=
二、RSA加密过程中
Android 客户端 在与 服务器端 通讯时 会遇到这样的问题:服务器无法解密客户端发送的加密数据,客户端可以解密服务器发送的加密数据,但被填充过(解密出来的明文比原始明文长一截)。
原因是 服务器端的 jdk 和 android上的 jdk 对 RSA的缺省算法实现不同。可以有的解决方案 :
Android 客户端 指定RSA的缺省算法
pher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
其他部分不做修改
源码中的注释:
/*
* array containing the components of a Cipher transformation:
*
* index 0: algorithm component (e.g., DES) 算法加密模式
* index 1: feedback component (e.g., CFB) 工作模式
* index 2: padding component (e.g., PKCS5Padding) 填充模式
*/
---后续有问题继续记录