Android的Base64编码的坑,自己记录

552 阅读2分钟

一、Android的Base64的几种不同的模式

  1. DEFAULT:使用默认的方法来加密。
  2. NO_PADDING:略去加密字符串最后的”=”
  3. NO_WRAP:略去所有的换行符(设置后CRLF就没有用了)
  4. CRLF:Win风格的换行符,意思就是使用CRLF这一对作为一行的结尾而不是Unix风格的LF。
  5. 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)  填充模式
 */

---后续有问题继续记录