Android DES数据加密

来源:互联网 发布:剑三脸型数据怎么复制 编辑:程序博客网 时间:2024/05/16 04:43

DES加密介绍:

 DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,24小时内即可被破解。

DES加密使用方式:

1.)DesUtil常量类介绍

   private final static String HEX = "0123456789ABCDEF";   private final static String TRANSFORMATION = "DES/CBC/PKCS5Padding";//DES是加密方式 CBC是工作模式 PKCS5Padding是填充模式   private final static String IVPARAMETERSPEC = "01020304";////初始化向量参数,AES 为16bytes. DES 为8bytes.   private final static String ALGORITHM = "DES";//DES是加密方式   private static final String SHA1PRNG = "SHA1PRNG";//// SHA1PRNG 强随机种子算法, 要区别4.2以上版本的调用方法

1.)动态生成秘钥

长度不能够小于8位字节 因为DES固定格式为128bits,即8bytes。

    /* * 生成随机数,可以当做动态的密钥 加密和解密的密钥必须一致,不然将不能解密 */    public static String generateKey() {        try {            SecureRandom localSecureRandom = SecureRandom.getInstance(SHA1PRNG);            byte[] bytes_key = new byte[20];            localSecureRandom.nextBytes(bytes_key);            String str_key = toHex(bytes_key);            return str_key;        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    //二进制转字符    public static String toHex(byte[] buf) {        if (buf == null)            return "";        StringBuffer result = new StringBuffer(2 * buf.length);        for (int i = 0; i < buf.length; i++) {            appendHex(result, buf[i]);        }        return result.toString();    }    private static void appendHex(StringBuffer sb, byte b) {        sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));    }

3.)处理秘钥Key的两种方式

第一种:

    // 对密钥进行处理    private static Key getRawKey(String key) throws Exception {        KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM);        //for android        SecureRandom sr = null;        // 在4.2以上版本中,SecureRandom获取方式发生了改变        if (android.os.Build.VERSION.SDK_INT >= 17) {            sr = SecureRandom.getInstance(SHA1PRNG, "Crypto");        } else {            sr = SecureRandom.getInstance(SHA1PRNG);        }        // for Java        // secureRandom = SecureRandom.getInstance(SHA1PRNG);        sr.setSeed(key.getBytes());        kgen.init(64, sr); //DES固定格式为64bits,即8bytes。        SecretKey skey = kgen.generateKey();        byte[] raw = skey.getEncoded();        return new SecretKeySpec(raw, ALGORITHM);    }

第二种:

    // 对密钥进行处理    private static Key getRawKey(String key) throws Exception {        DESKeySpec dks = new DESKeySpec(key.getBytes());        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);        return keyFactory.generateSecret(dks);    }

4.)加密实现

 /**     * DES算法,加密     *     * @param data 待加密字符串     * @param key  加密私钥,长度不能够小于8位     * @return 加密后的字节数组,一般结合Base64编码使用     */    public static String encode(String key, String data) {        return encode(key, data.getBytes());    }    /**     * DES算法,加密     *     * @param data 待加密字符串     * @param key  加密私钥,长度不能够小于8位     * @return 加密后的字节数组,一般结合Base64编码使用     */    public static String encode(String key, byte[] data) {        try {            Cipher cipher = Cipher.getInstance(TRANSFORMATION);            IvParameterSpec iv = new IvParameterSpec(IVPARAMETERSPEC.getBytes());            cipher.init(Cipher.ENCRYPT_MODE, getRawKey(key), iv);            byte[] bytes = cipher.doFinal(data);            return Base64.encodeToString(bytes, Base64.DEFAULT);        } catch (Exception e) {            return null;        }    }

5.)解密实现

    /**     * 获取编码后的值     *     * @param key     * @param data     * @return     */    public static String decode(String key, String data) {        return decode(key, Base64.decode(data, Base64.DEFAULT));    }    /**     * DES算法,解密     *     * @param data 待解密字符串     * @param key  解密私钥,长度不能够小于8位     * @return 解密后的字节数组     */    public static String decode(String key, byte[] data) {        try {            Cipher cipher = Cipher.getInstance(TRANSFORMATION);            IvParameterSpec iv = new IvParameterSpec(IVPARAMETERSPEC.getBytes());            cipher.init(Cipher.DECRYPT_MODE, getRawKey(key), iv);            byte[] original = cipher.doFinal(data);            String originalString = new String(original);            return originalString;        } catch (Exception e) {            return null;        }    }

DES知识扩展:3DES

 3DES是DES加密算法的一种模式,它使用3条64位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法。3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。

DES与AES比较:

  当时被问起采用DES加密内心深处我是拒绝的。单纯从名字上看AES(Advanced Encryption Standard)高级加密标准,安全性要高于DES,其实AES的出现本身就是为了取代DES的,AES具有比DES更好的安全性、效率、灵活性,所以对称加密优先采用AES。
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 7个月宝宝大便干燥怎么办 11个月宝宝大便干燥怎么办 9个月宝宝大便干燥怎么办 10个月宝宝大便干燥怎么办 宝宝两天没拉粑粑了怎么办 小学闺蜜嫉妒我怎么办 三年级孩子对应用题理解很差怎么办 我嫉妒我的朋友怎么办 嫉妒同学比我好怎么办 宝宝生在家里了怎么办 在家不小心生了怎么办 葫芦干了有黑点怎么办 单位费用发票丢失了怎么办 1岁宝宝太调皮了怎么办 孩子和同学打架家长该怎么办 孩子被大人打了怎么办 小孩不跟大人沟通怎么办 2岁小朋友爱动手怎么办 小班爱动手的小朋友怎么办 宝宝对小朋友不友好爱动手怎么办 小孩子上幼儿园爱打人怎么办 小孩被别人打了怎么办 1岁幼儿爱打人怎么办 作为幼小朋友打人老师怎么办 2岁半小朋友喜欢打人怎么办 2岁宝宝脾气大怎么办 4月小孩爱动怎么办 一岁宝宝老打人怎么办 1岁宝宝爱打人怎么办 3岁宝宝喜欢抓人怎么办 宝宝喜欢打人怎么办2岁 1岁宝宝动手打人怎么办 孩子总打人总哭怎么办 小孩出现夜惊家人怎么办 小孩不原跟家人沟通怎么办 孩子字写得难看怎么办 孩子上一年级不认识字怎么办 二年级孩子语文差怎么办 孩子二年级语文成绩差怎么办 孩子小学二年级语文差怎么办 二年级孩子语文理解能力差怎么办