博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java android DES+Base64加密解密
阅读量:5009 次
发布时间:2019-06-12

本文共 6837 字,大约阅读时间需要 22 分钟。

服务器与客户端加密解密传输, 中间遇到各种坑,客户端无论用AES还是DES解密时都会出现错误,后来才看到好多人说要用AES/DES加完密后还要BASE64加密,照做时发现android和java的Base64加密解密不一致,只好不使用java或android的Base64重新在网上找了一个,感谢以下两位提供的代码,两段分别转载自以下博客。

https://www.cnblogs.com/xuhaiqing/archive/2013/03/12/2955837.html

https://www.cnblogs.com/langtianya/p/3715975.html

 

import java.io.ByteArrayOutputStream;public class Base64Util {    private static final char[] base64EncodeChars = new char[] { '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 static byte[] base64DecodeChars = new byte[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 };    private Base64Util() {    }    /**     * 将字节数组编码为字符串     *     * @param data     */    public static String encode(byte[] data) {        StringBuffer sb = new StringBuffer();        int len = data.length;        int i = 0;        int b1, b2, b3;        while (i < len) {            b1 = data[i++] & 0xff;            if (i == len) {                sb.append(base64EncodeChars[b1 >>> 2]);                sb.append(base64EncodeChars[(b1 & 0x3) << 4]);                sb.append("==");                break;            }            b2 = data[i++] & 0xff;            if (i == len) {                sb.append(base64EncodeChars[b1 >>> 2]);                sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);                sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);                sb.append("=");                break;            }            b3 = data[i++] & 0xff;            sb.append(base64EncodeChars[b1 >>> 2]);            sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);            sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]);            sb.append(base64EncodeChars[b3 & 0x3f]);        }        return sb.toString();    }    /**     * 将base64字符串解码为字节数组     *     * @param str     */    public static byte[] decode(String str) {        byte[] data = str.getBytes();        int len = data.length;        ByteArrayOutputStream buf = new ByteArrayOutputStream(len);        int i = 0;        int b1, b2, b3, b4;        while (i < len) {            /* b1 */            do {                b1 = base64DecodeChars[data[i++]];            } while (i < len && b1 == -1);            if (b1 == -1) {                break;            }            /* b2 */            do {                b2 = base64DecodeChars[data[i++]];            } while (i < len && b2 == -1);            if (b2 == -1) {                break;            }            buf.write((int) ((b1 << 2) | ((b2 & 0x30) >>> 4)));            /* b3 */            do {                b3 = data[i++];                if (b3 == 61) {                    return buf.toByteArray();                }                b3 = base64DecodeChars[b3];            } while (i < len && b3 == -1);            if (b3 == -1) {                break;            }            buf.write((int) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2)));            /* b4 */            do {                b4 = data[i++];                if (b4 == 61) {                    return buf.toByteArray();                }                b4 = base64DecodeChars[b4];            } while (i < len && b4 == -1);            if (b4 == -1) {                break;            }            buf.write((int) (((b3 & 0x03) << 6) | b4));        }        return buf.toByteArray();    }}

  

package util;import java.security.SecureRandom;import javax.crypto.spec.DESKeySpec;import javax.crypto.SecretKeyFactory;import javax.crypto.SecretKey;import javax.crypto.Cipher;/** DES加密介绍      DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究, 后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力, 24小时内即可被破解。虽然如此,在某些简单应用中,我们还是可以使用DES加密算法,本文简单讲解DES的JAVA实现 。 注意:DES加密和解密过程中,密钥长度都必须是8的倍数 */public class DES {    public DES() {    }    //测试    public static void main(String args[]) {        //待加密内容     String str = "测试内容";     //密码,长度要是8的倍数     String password = "9588028820109132570743325311898426347857298773549468758875018579537757772163084478873699447306034466200616411960574122434059469100235892702736860872901247123456";          byte[] result = DES.encrypt(str.getBytes(),password);     System.out.println("加密后:"+new String(result));     //直接将如上内容解密     try {             byte[] decryResult = DES.decrypt(result, password);             System.out.println("解密后:"+new String(decryResult));     } catch (Exception e1) {             e1.printStackTrace();     } }    /**     * 加密     * @param datasource byte[]     * @param password String     * @return byte[]     */    public static  byte[] encrypt(byte[] datasource, String password) {                    try{        SecureRandom random = new SecureRandom();        DESKeySpec desKey = new DESKeySpec(password.getBytes());        //创建一个密匙工厂,然后用它把DESKeySpec转换成        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");        SecretKey securekey = keyFactory.generateSecret(desKey);        //Cipher对象实际完成加密操作        Cipher cipher = Cipher.getInstance("DES");        //用密匙初始化Cipher对象        cipher.init(Cipher.ENCRYPT_MODE, securekey, random);        //现在,获取数据并加密        //正式执行加密操作        return cipher.doFinal(datasource);        }catch(Throwable e){                e.printStackTrace();        }        return null;}    /**     * 解密     * @param src byte[]     * @param password String     * @return byte[]     * @throws Exception     */    public static byte[] decrypt(byte[] src, String password) throws Exception {            // DES算法要求有一个可信任的随机数源            SecureRandom random = new SecureRandom();            // 创建一个DESKeySpec对象            DESKeySpec desKey = new DESKeySpec(password.getBytes());            // 创建一个密匙工厂            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");            // 将DESKeySpec对象转换成SecretKey对象            SecretKey securekey = keyFactory.generateSecret(desKey);            // Cipher对象实际完成解密操作            Cipher cipher = Cipher.getInstance("DES");            // 用密匙初始化Cipher对象            cipher.init(Cipher.DECRYPT_MODE, securekey, random);            // 真正开始解密操作            return cipher.doFinal(src);        }}

  

转载于:https://www.cnblogs.com/MarsMercury/p/10357573.html

你可能感兴趣的文章
c#中使用servicestackredis操作redis
查看>>
ios app 真机crash报告分析
查看>>
CRC标准以及简记式
查看>>
SEO搜索引擎
查看>>
关于本地使用tomcat部署web应用,浏览器自动跳转为https的问题
查看>>
一、Text To Speech
查看>>
Java读取并下载网络文件
查看>>
github上构建自己的个人网站
查看>>
在word中粘贴的图片为什么显示不完整
查看>>
SQL Server 数据库的鼠标操作
查看>>
net软件工程师求职简历
查看>>
总线置顶[置顶] Linux bus总线
查看>>
nullnullHandling the Results 处理结果
查看>>
SQL SERVER BOOK
查看>>
JS基础回顾,小练习(判断数组,以及函数)
查看>>
多任务——进程
查看>>
WCF:如何将net.tcp协议寄宿到IIS
查看>>
WebAPI HelpPage支持area
查看>>
Path元素
查看>>
php_soap扩展应用
查看>>