当前位置:首页 > Android > 正文内容

【Android工具类】比DES加密更安全的算法——3DES加密算法

jsc9年前 (2016-09-19)Android3645

    在前面的文章里面,我们讨论了DES算法,同时也明白了如何才能保证不同平台下的加密和解密结果的一致性。但是DES作为出现了很长时间的一种加密算法,随着计算机运算能力的加强,DES加密容易被暴力破解,其安全性变得有点低。于是,为了增强数据的安全性,3DES算法就应运而生了。

    3DES,顾名思义,就是对DES加密算法的改进,3DES通过对每个数据进行3次DES加密,从而降低被破解的可能性。

     如果我们要使用3DES加密,需要以下几个步骤


    ①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象

        SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);    

    ②根据算法实例化Cipher对象。它负责加密/解密

        Cipher c1 = Cipher.getInstance(Algorithm);    

    ③传入加密/解密模式以及SecretKey密钥对象,实例化Cipher对象

        c1.init(Cipher.ENCRYPT_MODE, deskey);    

    ④传入字节数组,调用Cipher.doFinal()方法,实现加密/解密,并返回一个byte字节数组

        c1.doFinal(src);

   

    具体的代码实现过程如下

package com.qust;  
  
import java.io.UnsupportedEncodingException;  
  
import javax.crypto.Cipher;  
import javax.crypto.SecretKey;  
import javax.crypto.spec.SecretKeySpec;  
  
/** 
 *  
 * @ClassName: com.qust.SecretUtils 
 * @Description: 3DES加密解密工具类 
 * @author zhaokaiqiang 
 * @date 2014-11-13 下午11:28:14 
 *  
 */  
public class DES3Utils {  
  
    // 定义加密算法,DESede即3DES  
    private static final String Algorithm = "DESede";  
    // 加密密钥  
    private static final String PASSWORD_CRYPT_KEY = "zhaokaiqiang1992";  
  
    /** 
     * 加密方法 
     *  
     * @param src 
     *            源数据的字节数组 
     * @return 
     */  
    public static byte[] encryptMode(byte[] src) {  
        try {  
            // 生成密钥  
            SecretKey deskey = new SecretKeySpec(  
                    build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);  
            // 实例化Cipher  
            Cipher cipher = Cipher.getInstance(Algorithm);  
            cipher.init(Cipher.ENCRYPT_MODE, deskey);  
            return cipher.doFinal(src);  
        } catch (java.security.NoSuchAlgorithmException e1) {  
            e1.printStackTrace();  
        } catch (javax.crypto.NoSuchPaddingException e2) {  
            e2.printStackTrace();  
        } catch (java.lang.Exception e3) {  
            e3.printStackTrace();  
        }  
        return null;  
    }  
  
    /** 
     * 解密函数 
     *  
     * @param src 
     *            密文的字节数组 
     * @return 
     */  
    public static byte[] decryptMode(byte[] src) {  
        try {  
            SecretKey deskey = new SecretKeySpec(  
                    build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);  
            Cipher c1 = Cipher.getInstance(Algorithm);  
            c1.init(Cipher.DECRYPT_MODE, deskey);  
            return c1.doFinal(src);  
        } catch (java.security.NoSuchAlgorithmException e1) {  
            e1.printStackTrace();  
        } catch (javax.crypto.NoSuchPaddingException e2) {  
            e2.printStackTrace();  
        } catch (java.lang.Exception e3) {  
            e3.printStackTrace();  
        }  
        return null;  
    }  
  
    /** 
     * 根据字符串生成密钥24位的字节数组 
     *  
     * @param keyStr 
     * @return 
     * @throws UnsupportedEncodingException 
     */  
    public static byte[] build3DesKey(String keyStr)  
            throws UnsupportedEncodingException {  
        byte[] key = new byte[24];  
        byte[] temp = keyStr.getBytes("UTF-8");  
  
        if (key.length > temp.length) {  
            System.arraycopy(temp, 0, key, 0, temp.length);  
        } else {  
            System.arraycopy(temp, 0, key, 0, key.length);  
        }  
        return key;  
    }  
}

测试类的代码如下

package com.qust;  
  
public class Main {  
  
    public static void main(String[] args) {  
        String msg = "使用3DES对数据进行加密";  
        System.out.println("【加密前】:" + msg);  
  
        // 加密  
        byte[] secretArr = DES3Utils.encryptMode(msg.getBytes());  
        System.out.println("【加密后】:" + new String(secretArr));  
  
        // 解密  
        byte[] myMsgArr = DES3Utils.decryptMode(secretArr);  
        System.out.println("【解密后】:" + new String(myMsgArr));  
    }  
}

  转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992

扫描二维码推送至手机访问。

版权声明:本文由微小站发布,如需转载请注明出处。

本文链接:https://jsc0.com/post/119.html

标签: DES加密3DES
分享给朋友:

“【Android工具类】比DES加密更安全的算法——3DES加密算法” 的相关文章

Android中AsyncTask的简单用法

Android中AsyncTask的简单用法

        在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好 的用户体验。但是在子线程中无法去操作主线程(UI 线...

Android Location在GPS中的应用(二)

这一篇其实跟GPS 毫无关系。 继续上一篇的内容,讲GPS以外的东西,比如说Service的使用。比如说gps监控,它并不需要任何UI,在后台默默地运行就行。为什么不做成 Service呢?悄悄地向服务器发送用户的位置坐标是一个不错的想法,因为它完全不需要用户的干预。当然为了保留用户权利,我们应当留...

Android基本功:支持GPS的核心API

一、LocationManager类        作用和TelephonyManager,AudioManager等服务类的作用类似,所有GPS定位相关的服务、对象都由该对象产生;    ...

google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

    了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google...

ViewPager + HorizontalScrollView 实现可滚动的标签栏

ViewPager + HorizontalScrollView 实现可滚动的标签栏

这是一个可滑动的标签栏的自定义控件,参考此文章http://blog.csdn.net/fx_sky/article/details/8990573,我将主要的功能整合成一个类,配上2个特定的布局即可使用。 效果图:    主要布局文件:<?xml&nb...

Android ImageView的scaleType属性与adjustViewBounds属性

Android ImageView的scaleType属性与adjustViewBounds属性

ImageView的scaleType的属性有好几种,分别是matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY android:sca...