Android 数据加密算法 Des,Base64详解

一,DES加密:

首先网上搜索了一个DES加密算法工具类:

import java.security.*;
import javax.crypto.*;

public class DesHelper {

private static String strDefaultKey = "national";
    
     private Cipher encryptCipher = null;
    
     private Cipher decryptCipher = null;
    
     /**
      * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
      * hexStr2ByteArr(String strIn) 互为可逆的转换过程
      *
      * @param arrB
      *            需要转换的byte数组
      * @return 转换后的字符串
      * @throws Exception
      *             本方法不处理任何异常,所有异常全部抛出
      */
     public static String byteArr2HexStr(byte[] arrB) throws Exception {
      int iLen = arrB.length;
      // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
      StringBuffer sb = new StringBuffer(iLen * 2);
      for (int i = 0; i < iLen; i++) {
       int intTmp = arrB[i];
       // 把负数转换为正数
       while (intTmp < 0) {
        intTmp = intTmp + 256;
       }
       // 小于0F的数需要在前面补0
       if (intTmp < 16) {
        sb.append("0");
       }
       sb.append(Integer.toString(intTmp, 16));
      }
      return sb.toString();
     }
    
     /**
      * 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)
      * 互为可逆的转换过程
      *
      * @param strIn
      *            需要转换的字符串
      * @return 转换后的byte数组
      * @throws Exception
      *             本方法不处理任何异常,所有异常全部抛出
      * @author <a href="mailto:[email protected]">LiGuoQing</a>
      */
     public static byte[] hexStr2ByteArr(String strIn) throws Exception {
      byte[] arrB = strIn.getBytes();
      int iLen = arrB.length;
    
      // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
      byte[] arrOut = new byte[iLen / 2];
      for (int i = 0; i < iLen; i = i + 2) {
       String strTmp = new String(arrB, i, 2);
       arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
      }
      return arrOut;
     }
    
     /**
      * 默认构造方法,使用默认密钥
      *
      * @throws Exception
      */
     public DesHelper() throws Exception {
      this(strDefaultKey);
     }
    
     /**
      * 指定密钥构造方法
      *
      * @param strKey
      *            指定的密钥
      * @throws Exception
      */
     public DesHelper(String strKey) throws Exception {
      Security.addProvider(new com.sun.crypto.provider.SunJCE());
      Key key = getKey(strKey.getBytes());
    
      encryptCipher = Cipher.getInstance("DES");
      encryptCipher.init(Cipher.ENCRYPT_MODE, key);
    
      decryptCipher = Cipher.getInstance("DES");
      decryptCipher.init(Cipher.DECRYPT_MODE, key);
     }
    
     /**
      * 加密字节数组
      *
      * @param arrB
      *            需加密的字节数组
      * @return 加密后的字节数组
      * @throws Exception
      */
     public byte[] encrypt(byte[] arrB) throws Exception {
      return encryptCipher.doFinal(arrB);
     }
    
     /**
      * 加密字符串
      *
      * @param strIn
      *            需加密的字符串
      * @return 加密后的字符串
      * @throws Exception
      */
     public String encrypt(String strIn) throws Exception {
      return byteArr2HexStr(encrypt(strIn.getBytes()));
     }
    
     /**
      * 解密字节数组
      *
      * @param arrB
      *            需解密的字节数组
      * @return 解密后的字节数组
      * @throws Exception
      */
     public byte[] decrypt(byte[] arrB) throws Exception {
      return decryptCipher.doFinal(arrB);
     }
    
     /**
      * 解密字符串
      *
      * @param strIn
      *            需解密的字符串
      * @return 解密后的字符串
      * @throws Exception
      */
     public String decrypt(String strIn) throws Exception {
      return new String(decrypt(hexStr2ByteArr(strIn)));
     }
    
     /**
      * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
      *
      * @param arrBTmp
      *            构成该字符串的字节数组
      * @return 生成的密钥
      * @throws java.lang.Exception
      */
     private Key getKey(byte[] arrBTmp) throws Exception {
      // 创建一个空的8位字节数组(默认值为0)
      byte[] arrB = new byte[8];
    
      // 将原始字节数组转换为8位
      for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
       arrB[i] = arrBTmp[i];
      }
    
      // 生成密钥
      Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
    
      return key;
     }
}

如何使用Des加密算法:

下面是我在开发android时,涉及到向服务器端提交数据(包含图片附件)对数据的加密处理部分代码。

File file = new File(path);
                FileInputStream stream;
                try {
                    stream = new FileInputStream(file);
                    int filesize = stream.available();
                    System.out.println("附件大小:"+filesize);
                    if(filesize>maxfile){
                        attachment.setError("附件不能大于2M!");
                        return;
                    }
                    byte[] bytes = new byte[filesize];
                    stream.read(bytes);//传输附件时需先把文件转换成字节数组
                    DesHelper des;
                    try {
                        des = new DesHelper("test");//自定义密钥
  
                     byte[] encodeBytes
=des.encrypt(bytes);//使用Des算法加密时,要先对字节数组加密,然后转调用Des加密算法的byteArr2HexStr方
法,把字节数组转换为16进制值的字符串。此处不能直接用new String(encodeBytes )的字符串转换方法。
                        String image = des.byteArr2HexStr(encodeBytes);
                        JSONObject json = new JSONObject();
                        json.put("name", "Henry");
                        json.put("selectedTypeId", selectedTypeId);
                        json.put("beginTime", beginTime);
                        json.put("reason",reason);
                        json.put("image",image);
                        String str = json.toString();//转换成json字符串便于加密传输
                        System.out.println("需加密字符串的大小:"+str.getBytes().length);
                        SimpleDateFormat format1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
                        System.out.println("加密前的字符串:"+str);
                        System.out.println("开始加密时间:"+format1.format(new Date()));
                        String encodeStr =des.encrypt(str);
                        System.out.println("结束加密时间:"+format1.format(new Date()));
                        System.out.println("加密后的字符串:"+encodeStr);

System.out.println("加密后的字符串大小:"+encodeStr.getBytes().length);

/**************************************解密过程**********************************************/

System.out.println("开始解密时间:"+format1.format(new Date()));
                        String decodeStr=des.decrypt(encodeStr);
                        System.out.println("结束解密时间:"+format1.format(new Date()));
                        System.out.println("解密后的字符串:"+decodeStr);
                        JSONObject object = new JSONObject(decodeStr);
                        String img = (String) object.get("image");
                        byte[] getbyte =des.hexStr2ByteArr(img);

//此处不能使用img.getBytes()方法获取字节数组作为decrypt方法的  参数,必须先把16进制值的字符串img 转换为byte数组,调用hexStr2ByteArr方法
                        byte[] images= des.decrypt(getbyte);
                        System.out.println("长度:"+images.length);

//读取解密后的图片文件
                        Bitmap bitmap =BitmapFactory.decodeByteArray(images, 0, images.length);

。。。。。。

} catch (Exception e1) {
                        e1.printStackTrace();
                    }
                }catch (FileNotFoundException e1) {
                    e1.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (org.apache.http.ParseException e) {
                    e.printStackTrace();
                }

如果使用Base64加密,比较简单:

调用android自带的工具类android.util.Base64

//对字节数组进行加密

byte[] encode = Base64.encode(bytes, Base64.DEFAULT);

//转换成字符串进行传输

String image= new String(encode);

//对字符串进行解密,转换成字节数组

byte[] images =Base64.decode(image.getBytes(), Base64.DEFAULT) ;

Android 数据加密算法 Des,Base64详解

时间: 2024-08-08 23:45:02

Android 数据加密算法 Des,Base64详解的相关文章

Android开发之SQLite数据库详解

Android开发之SQLite数据库详解 请尊重他人的劳动成果,转载请注明出处:Android开发之SQLite数据库详解 http://blog.csdn.net/fengyuzhengfan/article/details/40194393 Android系统集成了一个轻量级的数据库:SQLite, SQLite并不想成为像Oracle.MySQL那样的专业数据库.SQLite只是一个嵌入式的数据库引擎,专门适用于资源有限的设备上(如手机.PDA等)适量数据存取. 虽然SQLite支持绝大

Android 数据加密算法

一,DES加密: public class DesHelper { private static String strDefaultKey = "national"; private Cipher encryptCipher = null; private Cipher decryptCipher = null; // 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[] * hexStr2ByteAr

Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送,写这个系列真的很要命,你要去把他们的API文档大致的翻阅一遍,而且各种功能都实现一遍,解决各种bug各种坑,不得不说,极光推送真坑,大家使用还是要慎重,我们看一下极光推送的官网 https://www.jpush.cn/common/ 推送比较使用,很多软件有需要,所以在这个点拿出来多讲讲,我们本节

Android Environment类的接口详解

Android应用开发中,常使用Environment类去获取外部存储目录,在访问外部存储之前一定要先判断外部存储是否已经是可使用(已挂载&可使用)状态, 并且需要在AndroidManifest.xml文件中添加外部存储读和写的权限. Environment类中提供了几个静态常量用于标识外部存储的状态,这些状态都是String类型 MEDIA_BAD_REMOVAL 在没有挂载前存储媒体已经被移除. MEDIA_CHECKING 正在检查存储媒体. MEDIA_MOUNTED 存储媒体已经挂载

解析activity之间数据传递方法的详解

转自:http://www.jb51.net/article/37227.htm 本篇文章是对activity之间数据传递的方法进行了详细的分析介绍,需要的朋友参考下 1  基于消息的通信机制 Intent--------boudle,extra用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等详细介绍下Intent机制Intent包含两部分:1 目的[action]-------要去到哪里去2 内容[category.data]----------路上带些什么,

【Android】Android软件开发之ListView 详解

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xys289187120.blog.51cto.com/3361352/657171 ListView的使用方法 ListView是Android软件开发中非常重要组件之一,基本上是个软件基本都会使用ListView ,今天我通过一个demo来教大家怎么样使用ListView组件 绘制出漂亮的列表,说道ListView就不得不说Adapter适配器,因为只有通过Adapter才可

[Android新手区] SQLite 操作详解--SQL语法

该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法  :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解析大部分标准SQL语言.但它也省去了一些特性并且加入了一些自己的新特性.这篇文档就是试图描述那些SQLite支持/不支持的SQL语法的.查看关键字列表. 如下语法表格中,纯文本用蓝色粗体显示.非终极符号为斜体红色.作为语法一部分的运算符用黑色Roman字体表示. 这篇文档只是对SQLite实现的SQ

Android Design Support Library使用详解

Android Design Support Library使用详解 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个support库里面,Google给我们提供了更加规范的MD设计风格的控件.最重要的是,Android Design Support Library的兼容性更广,直接可以向下兼容到Android 2.2.这不得不说是一个良心之作. 使用S

Android开发之MediaRecorder类详解

MediaRecorder类详解 手机一般都有麦克风和摄像头,而Android系统就可以利用这些硬件来录制音视频了. 为了增加对录制音视频的支持,Android系统提供了一个MediaRecorder的类.该类的使用也非常简单,下面让我们来了解一下这个类: 一.类结构: java.lang.Object    ? android.media.MediaRecorder 二.类概述: 用于录制音频和视频的一个类. 三.状态图: 说明: 与MediaPlayer类非常相似MediaRecorder也