switch (view.getId()) {

case R.id.btn_encryption://加密

String encryptionString = encryptionContext.getText().toString().trim();

if (TextUtils.isEmpty(encryptionString)) {

Toast.makeText(mContext, “请输入加密内容”, Toast.LENGTH_SHORT).show();

return;

}

try {

String encrypt = AES.getInstance().encrypt(encryptionString.getBytes(“UTF8”));

tvEncryption.setText(encrypt);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

break;

case R.id.btn_decode://解密

String decodeString = tvEncryption.getText().toString().trim();

if (TextUtils.isEmpty(decodeString)) {

Toast.makeText(mContext, “请先加密”, Toast.LENGTH_SHORT).show();

return;

}

String decrypt = AES.getInstance().decrypt(decodeString);

tvDecode.setText(decrypt);

break;

}

}

}

AES

package tsou.com.encryption.aescbc;

import java.io.UnsupportedEncodingException;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

/**

  • http://blog.csdn.net/qq_33237207/article/details/53114122

*/

public class AES {

private final String CIPHERMODEPADDING = “AES/CBC/PKCS5Padding”;// AES/CBC/PKCS7Padding

private SecretKeySpec skforAES = null;

private static String ivParameter = “1234huangxiaoguo”;// 密钥默认偏移,可更改

private byte[] iv = ivParameter.getBytes();

private IvParameterSpec IV;

String sKey = “huangxiaoguo1234”;// key必须为16位,可更改为自己的key

private static AES instance = null;

public static AES getInstance() {

if (instance == null) {

synchronized (AES.class) {

if (instance == null) {

instance = new AES();

}

}

}

return instance;

}

public AES() {

byte[] skAsByteArray;

try {

skAsByteArray = sKey.getBytes(“ASCII”);

skforAES = new SecretKeySpec(skAsByteArray, “AES”);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

IV = new IvParameterSpec(iv);

}

public String encrypt(byte[] plaintext) {

byte[] ciphertext = encrypt(CIPHERMODEPADDING, skforAES, IV, plaintext);

String base64_ciphertext = Base64Encoder.encode(ciphertext);

return base64_ciphertext;

}

public String decrypt(String ciphertext_base64) {

byte[] s = Base64Decoder.decodeToBytes(ciphertext_base64);

String decrypted = new String(decrypt(CIPHERMODEPADDING, skforAES, IV,

s));

return decrypted;

}

private byte[] encrypt(String cmp, SecretKey sk, IvParameterSpec IV,

byte[] msg) {

try {

Cipher c = Cipher.getInstance(cmp);

c.init(Cipher.ENCRYPT_MODE, sk, IV);

return c.doFinal(msg);

} catch (Exception nsae) {

}

return null;

}

private byte[] decrypt(String cmp, SecretKey sk, IvParameterSpec IV,

byte[] ciphertext) {

try {

Cipher c = Cipher.getInstance(cmp);

c.init(Cipher.DECRYPT_MODE, sk, IV);

return c.doFinal(ciphertext);

} catch (Exception nsae) {

}

return null;

}

}

Base64Decoder

package tsou.com.encryption.aescbc;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.FilterInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.UnsupportedEncodingException;

public class Base64Decoder extends FilterInputStream {

private static final char[] chars = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’,

‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’,

‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’,

‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’,

‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’,

‘7’, ‘8’, ‘9’, ‘+’, ‘/’};

// A mapping between char values and six-bit integers

private static final int[] ints = new int[128];

static {

for (int i = 0; i < 64; i++) {

ints[chars[i]] = i;

}

}

private int charCount;

private int carryOver;

/***

  • Constructs a new Base64 decoder that reads input from the given

  • InputStream.

  • @param in

  •        the input stream
    

*/

public Base64Decoder(InputStream in) {

super(in);

}

/***

  • Returns the next decoded character from the stream, or -1 if end of

  • stream was reached.

  • @return the decoded character, or -1 if the end of the input stream is

  •     reached
    
  • @exception IOException

  •            if an I/O error occurs
    

*/

public int read() throws IOException {

// Read the next non-whitespace character

int x;

do {

x = in.read();

if (x == -1) {

return -1;

}

} while (Character.isWhitespace((char) x));

charCount++;

// The ‘=’ sign is just padding

if (x == ‘=’) {

return -1; // effective end of stream

}

// Convert from raw form to 6-bit form

x = ints[x];

// Calculate which character we’re decoding now

int mode = (charCount - 1) % 4;

// First char save all six bits, go for another

if (mode == 0) {

carryOver = x & 63;

return read();

}

// Second char use previous six bits and first two new bits,

// save last four bits

else if (mode == 1) {

int decoded = ((carryOver << 2) + (x >> 4)) & 255;

carryOver = x & 15;

return decoded;

}

// Third char use previous four bits and first four new bits,

// save last two bits

else if (mode == 2) {

int decoded = ((carryOver << 4) + (x >> 2)) & 255;

carryOver = x & 3;

return decoded;

}

// Fourth char use previous two bits and all six new bits

else if (mode == 3) {

int decoded = ((carryOver << 6) + x) & 255;

return decoded;

}

return -1; // can’t actually reach this line

}

/***

  • Reads decoded data into an array of bytes and returns the actual number

  • of bytes read, or -1 if end of stream was reached.

  • @param buf

  •        the buffer into which the data is read
    
  • @param off

  •        the start offset of the data
    
  • @param len

  •        the maximum number of bytes to read
    
  • @return the actual number of bytes read, or -1 if the end of the input

  •     stream is reached
    
  • @exception IOException

  •            if an I/O error occurs
    

*/

public int read(byte[] buf, int off, int len) throws IOException {

if (buf.length < (len + off - 1)) {

throw new IOException("The input buffer is too small: " + len

  • " bytes requested starting at offset " + off

  • " while the buffer " + " is only " + buf.length

  • " bytes long.");

}

// This could of course be optimized

int i;

for (i = 0; i < len; i++) {

int x = read();

if (x == -1 && i == 0) { // an immediate -1 returns -1

return -1;

} else if (x == -1) { // a later -1 returns the chars read so far

break;

}

buf[off + i] = (byte) x;

}

return i;

}

/***

  • Returns the decoded form of the given encoded string, as a String. Note

  • that not all binary data can be represented as a String, so this method

  • should only be used for encoded String data. Use decodeToBytes()

  • otherwise.

  • @param encoded

  •        the
    

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

string to decode

  • @return the decoded form of the encoded string

*/

public static String decode(String encoded) {

return new String(decodeToBytes(encoded));

}

/***

  • Returns the decoded form of the given encoded string, as bytes.

  • @param encoded

  •        the string to decode
    
  • @return the decoded form of the encoded string

*/

public static byte[] decodeToBytes(String encoded) {

byte[] bytes = null;

try {

bytes = encoded.getBytes(“UTF-8”);

} catch (UnsupportedEncodingException ignored) {

}

Base64Decoder in = new Base64Decoder(new ByteArrayInputStream(bytes));

ByteArrayOutputStream out = new ByteArrayOutputStream(

(int) (bytes.length * 0.67));

try {

byte[] buf = new byte[4 * 1024]; // 4K buffer

int bytesRead;

while ((bytesRead = in.read(buf)) != -1) {

out.write(buf, 0, bytesRead);

}

out.close();

return out.toByteArray();

} catch (IOException ignored) {

return null;

}

}

// public static void main(String[] args) throws Exception {

// if (args.length != 1) {

// System.err.println(“Usage: java Base64Decoder fileToDecode”);

// return;

// }

//

// Base64Decoder decoder = null;

// try {

// decoder = new Base64Decoder(new BufferedInputStream(

// new FileInputStream(args[0])));

// byte[] buf = new byte[4 * 1024]; // 4K buffer

// int bytesRead;

// while ((bytesRead = decoder.read(buf)) != -1) {

// System.out.write(buf, 0, bytesRead);

// }

// } finally {

// if (decoder != null)

// decoder.close();

// }

// }

}

Base64Encoder

package tsou.com.encryption.aescbc;

import java.io.ByteArrayOutputStream;

import java.io.FilterOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.io.UnsupportedEncodingException;

public class Base64Encoder extends FilterOutputStream {

private static final char[] chars = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’,

‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’,

‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’,

‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’,

‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’,

‘7’, ‘8’, ‘9’, ‘+’, ‘/’};

private int charCount;

private int carryOver;

/***

  • Constructs a new Base64 encoder that writes output to the given

  • OutputStream.

  • @param out

  •        the output stream
    

*/

public Base64Encoder(OutputStream out) {

super(out);

}

/***

  • Writes the given byte to the output stream in an encoded form.

  • @exception IOException

  •            if an I/O error occurs
    

*/

public void write(int b) throws IOException {

// Take 24-bits from three octets, translate into four encoded chars

// Break lines at 76 chars

// If necessary, pad with 0 bits on the right at the end

// Use = signs as padding at the end to ensure encodedLength % 4 == 0

// Remove the sign bit,

// thanks to Christian Schweingruber chrigu@lorraine.ch

if (b < 0) {

b += 256;

}

// First byte use first six bits, save last two bits

if (charCount % 3 == 0) {

int lookup = b >> 2;

carryOver = b & 3; // last two bits

out.write(chars[lookup]);

}

// Second byte use previous two bits and first four new bits,

// save last four bits

else if (charCount % 3 == 1) {

int lookup = ((carryOver << 4) + (b >> 4)) & 63;

carryOver = b & 15; // last four bits

out.write(chars[lookup]);

}

// Third byte use previous four bits and first two new bits,

// then use last six new bits

else if (charCount % 3 == 2) {

int lookup = ((carryOver << 2) + (b >> 6)) & 63;

out.write(chars[lookup]);

lookup = b & 63; // last six bits

out.write(chars[lookup]);

carryOver = 0;

}

charCount++;

// Add newline every 76 output chars (that’s 57 input chars)

if (charCount % 57 == 0) {

out.write(’\n’);

}

}

/***

  • Writes the given byte array to the output stream in an encoded form.

  • @param buf

  •        the data to be written
    
  • @param off

  •        the start offset of the data
    
  • @param len

  •        the length of the data
    
  • @exception IOException

  •            if an I/O error occurs
    

*/

public void write(byte[] buf, int off, int len) throws IOException {

// This could of course be optimized

for (int i = 0; i < len; i++) {

write(buf[off + i]);

}

}

/***

  • Closes the stream, this MUST be called to ensure proper padding is

  • written to the end of the output stream.

  • @exception IOException

  •            if an I/O error occurs
    

*/

public void close() throws IOException {

// Handle leftover bytes

if (charCount % 3 == 1) { // one leftover

int lookup = (carryOver << 4) & 63;

out.write(chars[lookup]);

out.write(’=’);

out.write(’=’);

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐