Android 中对称加密算法DES,DESede,AES的加密和解密 的工具类的使用

C# 3DES加密解密 /// /// DES3加密解密 /// public class Des3 { #region CBC模式** /// /// DES3 CBC模式加密 /// /// 密钥 /// IV /// 明文的byte数组 /// 密文的byte数 阅读详情

DES,DESede,AES 是 对称加密的算法的工具类的使用。

注意密码的长度使不同的,DES是8个字节的长度的密码,DESede是24个字节的长度的密码,AES 是 16个字节的密码

加密全部需要通过byte[]作为数据和密钥进行处理,所以需要获取字节数组。

加密解密得到的数据通过Base64进行编码。这样就不会出现乱码了。不能通过new String()来获取,


下面是AES 的使用,因为是AES 所以密码是16个字节的。

//AES 加密解密测试
    public void aesTest(){
        String content="AES加密解密 Hello Kodulf 千雅爸爸";
        String password="abcdefghabcdefgh";//DESede 密钥必须是16个字节的。
        // 加密解密用的都是字节数组
        byte[] contentBytes = content.getBytes();
        byte[] passwordBytes = password.getBytes();
        //加密
        byte[] bytes = CryptUtil.aesEncrypt(contentBytes, passwordBytes);
        //TODO  !!! 加密的结果不允许直接 new String() !!!
        String encodeString = Base64.encodeToString(bytes, Base64.NO_WRAP);
        Log.d("Kodulf","AES加密后的数据 "+encodeString);

        //解密
        byte[] base64Decodedbytes = Base64.decode(encodeString.getBytes(), Base64.NO_WRAP);
        byte[] byteDecode = CryptUtil.aesDecrypt(base64Decodedbytes, passwordBytes);
        String decodeString = new String(byteDecode);
        Log.d("Kodulf","AES解密后的数据 "+decodeString);

    }


下面是DES 的使用:密码是8个字节。

//DES 加密解密的测试
    public void desTest(){
        String content="ABCDEFGH Hello Kodulf 千雅爸爸";
        String password="abcdefgh";//DES 密钥必须是8个字节的。

        // 加密解密用的都是字节数组
        byte[] contentBytes = content.getBytes();
        byte[] passwordBytes = password.getBytes();
        //加密
        byte[] bytes = CryptUtil.desEncrypt(contentBytes, passwordBytes);
        //TODO  !!! 加密的结果不允许直接 new String() !!!
        String encodeString = Base64.encodeToString(bytes, Base64.NO_WRAP);
        Log.d("Kodulf","DES加密后的数据 "+encodeString);

        //解密
        byte[] base64Decodedbytes = Base64.decode(encodeString.getBytes(), Base64.NO_WRAP);
        byte[] byteDecode = CryptUtil.desDecrypt(base64Decodedbytes, passwordBytes);
        String decodeString = new String(byteDecode);
        Log.d("Kodulf","DES解密后的数据 "+decodeString);

    }

下面是DESede的使用:密码是24个字节。

    //DESede 加密解密的测试
    public void desedeTest(){
        String content="DESede加密解密 Hello Kodulf 千雅爸爸";
        String password="abcdefghabcdefghabcdefgh";//DESede 密钥必须是24个字节的。

        // 加密解密用的都是字节数组
        byte[] contentBytes = content.getBytes();
        byte[] passwordBytes = password.getBytes();
        //加密
        byte[] bytes = CryptUtil.desedeEncrypt(contentBytes, passwordBytes);
        //TODO  !!! 加密的结果不允许直接 new String() !!!
        String encodeString = Base64.encodeToString(bytes, Base64.NO_WRAP);
        Log.d("Kodulf","DESede加密后的数据 "+encodeString);

        //解密
        byte[] base64Decodedbytes = Base64.decode(encodeString.getBytes(), Base64.NO_WRAP);
        byte[] byteDecode = CryptUtil.desedeDecrypt(base64Decodedbytes, passwordBytes);
        String decodeString = new String(byteDecode);
        Log.d("Kodulf","DESede解密后的数据 "+decodeString);

    }




代码下载:

MD5算法,URLEncoding,Base64编码,AES,DES,DESede,RSA加密解密工具类和使用实例


全部代码:
package tech.androidstudio.encodecryp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;

public class MainActivity extends AppCompatActivity {

    private String mPrivateKeyString;
    private String mPublicKeyString;
    private PublicKey mPublic;
    private PrivateKey mPrivate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Base64编码解码测试
        base64Test();
        //URLEncoding编码解码测试
        urlEncodingTest();

        //DES 加密解密的测试
        desTest();
        //DESede 加密解密的测试
        desedeTest();
        //AES 加密解密测试
        aesTest();

        //RSA 的初始化,获得私钥和密钥
        rsaInit();
        //RSA 加密解密测试
        rsaTest();

        //测试md5算法
        md5Test();
    }

    /**
     * 首先要说明的是Base64是编码解码,而不是加密解密,因为加密解密你是需要密钥的,编码是大家都知道怎么解码的,不需要密钥的。
     base64,将任意的字节数组,通过算法,生成只有(英文大小写(52个字母),数字(10个)+/(2个))内容标识的字符串数据;相当于将任何的内容转换为可见字符串的表示。
     Base64, 将原始数据按照3个字节一个分组,按位进行分割为每6位一个字节的形式,进行转换,形成新的4个字节,这4个字节的再通过Base64的编码表进行映射。
     6位能够表示的字符数就是64所以称为Base64,其实就是字节总长度增加了3分之一。
     */
    public void base64Test(){
        /**
         * 最好 使用 encodeToString,不然还要自己转换。
         byte[] encode = Base64.encode("你好".getBytes(), Base64.NO_WRAP);
         String encodeString = new String(encode);
         Log.d("kodulf","你好的Base64 的编码是"+encodeString);
         */

        //编码
        String encodeToString = Base64.encodeToString("你好".getBytes(), Base64.NO_WRAP);//NO_WRAP 不换行
        Log.d("kodulf", "你好的Base64 的编码是" + encodeToString);

        //解码
        //模拟解码的数据
        String fakeString = Base64.encodeToString("Kodulf 是一个好人".getBytes(), Base64.NO_WRAP);
        Log.d("kodulf", "模拟解码数据得到的Base64编码:" + fakeString);

        // 解码时注意事项,第二个参数的取值,应该和编码时一致;
        byte[] decodeStringbytes = Base64.decode(fakeString.getBytes(), Base64.NO_WRAP);
        String decodeString = new String(decodeStringbytes);
        Log.d("kodulf", "模拟解码数据得到的Base64解码:" + decodeString);




    }

    public void hexEncodingText(){

    }

    /**
     *URLEncode 简单一句话,URLEncoding 就是为了将网址中的非ASCII码内容,转换成可以传输字符

     在编码的时候,保留所有英文字母,数字,以及特定的字符,(这些字符全部都是ASCII中的),除此之外将会转换为十六进制标识,并且在每一个十六进制之前加上%
     内容中的' '空格,全部采用加号+替换
     URLEncoding 的格式,将要转换的内容,用十六进制表示法转换出来,然后每一个字节表示之前,用%开头;例如0x9c字节经过URLEncoding 就变成了%9C

     应用场景:所有GET请求,网址用到中文的情况,以及POST请求中,所有的Key 和Value,在提交之前,必须要经过URLEncoding

     */
    public void urlEncodingTest(){
        try {
            //URLEncoder的编码
            String encode = URLEncoder.encode("千雅爸爸", "UTF-8");//第二个参数一定要是服务器段支持的格式
            Log.d("kodulf","千雅爸爸 的URLEncoding 是"+encode);

            //URLDecoder的解码:
            String decoderString = URLDecoder.decode("%E5%8D%83%E9%9B%85%E7%88%B8%E7%88%B8","UTF-8");
            Log.d("kodulf","%E5%8D%83%E9%9B%85%E7%88%B8%E7%88%B8 URLDecoder的解码为:"+decoderString);


        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

    }

    //DES 加密解密的测试
    public void desTest(){
        String content="ABCDEFGH Hello Kodulf 千雅爸爸";
        String password="abcdefgh";//DES 密钥必须是8个字节的。

        // 加密解密用的都是字节数组
        byte[] contentBytes = content.getBytes();
        byte[] passwordBytes = password.getBytes();
        //加密
        byte[] bytes = CryptUtil.desEncrypt(contentBytes, passwordBytes);
        //TODO  !!! 加密的结果不允许直接 new String() !!!
        String encodeString = Base64.encodeToString(bytes, Base64.NO_WRAP);
        Log.d("Kodulf","DES加密后的数据 "+encodeString);

        //解密
        byte[] base64Decodedbytes = Base64.decode(encodeString.getBytes(), Base64.NO_WRAP);
        byte[] byteDecode = CryptUtil.desDecrypt(base64Decodedbytes, passwordBytes);
        String decodeString = new String(byteDecode);
        Log.d("Kodulf","DES解密后的数据 "+decodeString);

    }

    //DESede 加密解密的测试
    public void desedeTest(){
        String content="DESede加密解密 Hello Kodulf 千雅爸爸";
        String password="abcdefghabcdefghabcdefgh";//DESede 密钥必须是24个字节的。

        // 加密解密用的都是字节数组
        byte[] contentBytes = content.getBytes();
        byte[] passwordBytes = password.getBytes();
        //加密
        byte[] bytes = CryptUtil.desedeEncrypt(contentBytes, passwordBytes);
        //TODO  !!! 加密的结果不允许直接 new String() !!!
        String encodeString = Base64.encodeToString(bytes, Base64.NO_WRAP);
        Log.d("Kodulf","DESede加密后的数据 "+encodeString);

        //解密
        byte[] base64Decodedbytes = Base64.decode(encodeString.getBytes(), Base64.NO_WRAP);
        byte[] byteDecode = CryptUtil.desedeDecrypt(base64Decodedbytes, passwordBytes);
        String decodeString = new String(byteDecode);
        Log.d("Kodulf","DESede解密后的数据 "+decodeString);

    }

    //AES 加密解密测试
    public void aesTest(){
        String content="AES加密解密 Hello Kodulf 千雅爸爸";
        String password="abcdefghabcdefgh";//DESede 密钥必须是16个字节的。
        // 加密解密用的都是字节数组
        byte[] contentBytes = content.getBytes();
        byte[] passwordBytes = password.getBytes();
        //加密
        byte[] bytes = CryptUtil.aesEncrypt(contentBytes, passwordBytes);
        //TODO  !!! 加密的结果不允许直接 new String() !!!
        String encodeString = Base64.encodeToString(bytes, Base64.NO_WRAP);
        Log.d("Kodulf","AES加密后的数据 "+encodeString);

        //解密
        byte[] base64Decodedbytes = Base64.decode(encodeString.getBytes(), Base64.NO_WRAP);
        byte[] byteDecode = CryptUtil.aesDecrypt(base64Decodedbytes, passwordBytes);
        String decodeString = new String(byteDecode);
        Log.d("Kodulf","AES解密后的数据 "+decodeString);

    }


    //RSA 的初始化,获得私钥和密钥
    public void rsaInit(){
        try {
            KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");//RAS 密钥生成器
            kpg.initialize(1024, new SecureRandom());//生成制定长度的密钥
            KeyPair keyPair = kpg.generateKeyPair();//生成密钥对
            mPrivate = keyPair.getPrivate();//获取私钥
            mPublic = keyPair.getPublic();//获取公钥
            //通过getEncoded方法来获取密钥的具体内容
            byte[] privateEncoded = mPrivate.getEncoded();
            byte[] publicEncoded = mPublic.getEncoded();
            //为了防止乱码,使用Base64来转换,这样显示的时候就不会有乱码了
            mPrivateKeyString = Base64.encodeToString(privateEncoded, Base64.NO_WRAP);
            mPublicKeyString = Base64.encodeToString(publicEncoded, Base64.NO_WRAP);

            Log.d("kodulf","RSA私钥:"+ mPrivateKeyString);
            Log.d("kodulf","RSA公钥:"+ mPublicKeyString);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

    public void rsaTest(){
        String data = "Hello, Kodulf is a good father, 千雅爸爸是个好爸爸";
        byte[] bytes = data.getBytes();
        byte[] encryptByte = CryptUtil.rsaEncrypt(bytes, mPrivate);

        //要使用Base64来进行编码,如果不这样做就会显示乱码
        //String encryptString = new String(encryptByte);//这里产生乱码
        String encryptString = Base64.encodeToString(encryptByte, Base64.NO_WRAP);

        Log.d("kodulf","Hello, Kodulf is a good father, 千雅爸爸是个好爸爸 RSA加密后:"+encryptString);

        //解密:
        //要使用Base64来进行解码,如果不这样做就会显示乱码
        //byte[] sourceBytes = encryptString.getBytes();//这里会报错java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block
        byte[] sourceBytes = Base64.decode(encryptString.getBytes(), Base64.NO_WRAP);
        byte[] decryptBytes = CryptUtil.rsaDecrypt(sourceBytes, mPublic);
        String decryptString = new String(decryptBytes);
        Log.d("kodulf","Hello, Kodulf is a good father, 千雅爸爸是个好爸爸 RSA解密后:"+decryptString);
    }



    public void md5Test(){
        String source = "abcdef";
        String md5CreatedString = md5String(source);
        Log.d("kodulf","MD5 算法得到的String:"+md5CreatedString);
    }
    //md5算法生成String
    private String md5String(String url) {
        String ret = null;

        if (url != null) {

            try {
                // 创建MD5的消息摘要算法的类,进行调用
                MessageDigest digest = MessageDigest.getInstance("MD5");

                // 计算出一个唯一识别的信息;
                byte[] data = digest.digest(url.getBytes());

                StringBuilder sb = new StringBuilder();

                // 字节数组转换为十六进制字符串
                for (byte b : data) {
                    int ib = b & 0x0FF;
                    String s = Integer.toHexString(ib);

                    if(ib < 16){  // 15 -> 0F 0 -> 00
                        sb.append('0');
                    }
                    sb.append(s);
                }

                ret = sb.toString();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }

        return ret;
    }
}


工具类:

package tech.androidstudio.encodecryp;

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * Created by Kodulf on 2016/3/22.
 */
public final class CryptUtil {

        private CryptUtil() {

        }

        // ---------------------
        // RSA密钥生成

        /**
         * RSA 加密,参数 key 可以是 公钥,或者 私钥;
         * <p/>
         * !!! 如果使用 私钥加密,那么只能够使用 公钥解密
         * 如果使用 公钥加密,那么只能够使用 私钥解密
         *
         * @param data
         * @param key
         * @return
         */
        public static byte[] rsaEncrypt(byte[] data, Key key) {
            byte[] ret = null;
            if (data != null && data.length > 0 && key != null) {
                try {
                    Cipher cipher = Cipher.getInstance("RSA");

                    cipher.init(Cipher.ENCRYPT_MODE, key);

                    ret = cipher.doFinal(data);

                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                } catch (NoSuchPaddingException e) {
                    e.printStackTrace();
                } catch (InvalidKeyException e) {
                    e.printStackTrace();
                } catch (BadPaddingException e) {
                    e.printStackTrace();
                } catch (IllegalBlockSizeException e) {
                    e.printStackTrace();
                }
            }
            return ret;
        }

        public static byte[] rsaDecrypt(byte[] data, Key key) {
            byte[] ret = null;
            if (data != null && data.length > 0 && key != null) {
                try {
                    Cipher cipher = Cipher.getInstance("RSA");

                    cipher.init(Cipher.DECRYPT_MODE, key);

                    ret = cipher.doFinal(data);

                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                } catch (NoSuchPaddingException e) {
                    e.printStackTrace();
                } catch (InvalidKeyException e) {
                    e.printStackTrace();
                } catch (BadPaddingException e) {
                    e.printStackTrace();
                } catch (IllegalBlockSizeException e) {
                    e.printStackTrace();
                }
            }
            return ret;
        }

        /**
         * 生成 RSA 密钥信息,参数就是生成的尺寸位数
         * 支持 1024, 2048, 4096
         *
         * @param keySize
         * @return
         */
        public static KeyPair generateRSAKey(int keySize) {
            KeyPair ret = null;

            // 1. 使用密钥生成器来创建
            try {
                KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); // RSA 算法

                // 设置密钥位数 也就是 n 的位数
                kpg.initialize(keySize);

                ret = kpg.generateKeyPair();

            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }

            return ret;
        }


        // ---------------------
        // AES 加密,采用简单加密的算法,一个密码

        /**
         * AES 加密,采用一套密码的形式,密码长度支持 128bit
         *
         * @param data
         * @param password
         * @return
         */
        public static byte[] aesEncrypt(byte[] data, byte[] password) {
            byte[] ret = null;

            if (data != null && password != null) {
                if (data.length > 0 && password.length == 16) { // 128bit

                    // 1. 创建 Cipher

                    try {
                        Cipher cipher = Cipher.getInstance("AES");

                        // 2. 创建 AES 简单的密码 Key
                        SecretKeySpec key = new SecretKeySpec(password, "AES");

                        // 3. 初始化
                        cipher.init(Cipher.ENCRYPT_MODE, key);

                        ret = cipher.doFinal(data);

                    } catch (NoSuchAlgorithmException e) {
                        e.printStackTrace();
                    } catch (NoSuchPaddingException e) {
                        e.printStackTrace();
                    } catch (InvalidKeyException e) {
                        e.printStackTrace();
                    } catch (BadPaddingException e) {
                        e.printStackTrace();
                    } catch (IllegalBlockSizeException e) {
                        e.printStackTrace();
                    }
                }
            }

            return ret;
        }

        public static byte[] aesDecrypt(byte[] data, byte[] password) {
            byte[] ret = null;

            if (data != null && password != null) {
                if (data.length > 0 && password.length == 16) { // 128bit

                    // 1. 创建 Cipher

                    try {
                        Cipher cipher = Cipher.getInstance("AES");

                        // 2. 创建 AES 简单的密码 Key
                        SecretKeySpec key = new SecretKeySpec(password, "AES");

                        // 3. 初始化
                        cipher.init(Cipher.DECRYPT_MODE, key);

                        ret = cipher.doFinal(data);

                    } catch (NoSuchAlgorithmException e) {
                        e.printStackTrace();
                    } catch (NoSuchPaddingException e) {
                        e.printStackTrace();
                    } catch (InvalidKeyException e) {
                        e.printStackTrace();
                    } catch (BadPaddingException e) {
                        e.printStackTrace();
                    } catch (IllegalBlockSizeException e) {
                        e.printStackTrace();
                    }
                }
            }

            return ret;
        }

        // ---------------------

        /**
         * DESede 要求密码 24字节
         *
         * @param data
         * @param password
         * @return
         */
        public static byte[] desedeEncrypt(byte[] data, byte[] password) {
            // DESede 算法 Cipher
            // DESedeKeySpec

            byte[] ret = null;

            if (data != null && password != null) {
                // DESede
                if (data.length > 0 && password.length == 24) {

                    // 1. 创建 Cipher ,用于加密和解密,就是一个内部的算法引擎
                    // getInstance("加密的算法名称")
                    try {

                        Cipher cipher = Cipher.getInstance("DESede");

                        // 3. 生成 Key 对象,根据不同的算法

                        DESedeKeySpec keySpec = new DESedeKeySpec(password);

                        // 3.2 使用密钥生成工具,来生成实际的 Key 对象
                        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");// 参数为算法名称

                        // 3.3 生成 Key

                        SecretKey secretKey = keyFactory.generateSecret(keySpec);

                        // 2. 初始化 Cipher,设置是加密模式还是解密模式,同时设置密码
                        // 通常第二个参数可以使用  Key 对象,每一种算法,Key对象的生成是不同的
                        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

                        // 4. 进行加密或者解密的实际操作;
                        // 返回值就是最终的结果了
                        ret = cipher.doFinal(data);

                    } catch (NoSuchAlgorithmException e) {  // 找不到算法的异常
                        e.printStackTrace();
                    } catch (NoSuchPaddingException e) { //
                        e.printStackTrace();
                    } catch (InvalidKeyException e) {  // 非法的密钥异常
                        e.printStackTrace();
                    } catch (InvalidKeySpecException e) {
                        e.printStackTrace();
                    } catch (BadPaddingException e) {
                        e.printStackTrace();
                    } catch (IllegalBlockSizeException e) {
                        e.printStackTrace();
                    }


                }
            }

            return ret;

        }

        public static byte[] desedeDecrypt(byte[] data, byte[] password) {
            byte[] ret = null;

            if (data != null && password != null) {
                // DESede 24字节
                if (data.length > 0 && password.length == 24) {

                    // 1. 创建 Cipher ,用于加密和解密,就是一个内部的算法引擎
                    // getInstance("加密的算法名称")
                    try {

                        Cipher cipher = Cipher.getInstance("DESede");

                        // 3. 生成 Key 对象,根据不同的算法

                        DESedeKeySpec keySpec = new DESedeKeySpec(password);

                        // 3.2 使用密钥生成工具,来生成实际的 Key 对象
                        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");// 参数为算法名称

                        // 3.3 生成 Key

                        SecretKey secretKey = keyFactory.generateSecret(keySpec);

                        // 2. 初始化 Cipher,设置是加密模式还是解密模式,同时设置密码
                        // 通常第二个参数可以使用  Key 对象,每一种算法,Key对象的生成是不同的
                        cipher.init(Cipher.DECRYPT_MODE, secretKey);

                        // 4. 进行加密或者解密的实际操作;
                        // 返回值就是最终的结果了
                        ret = cipher.doFinal(data);

                    } catch (NoSuchAlgorithmException e) {  // 找不到算法的异常
                        e.printStackTrace();
                    } catch (NoSuchPaddingException e) { //
                        e.printStackTrace();
                    } catch (InvalidKeyException e) {  // 非法的密钥异常
                        e.printStackTrace();
                    } catch (InvalidKeySpecException e) {
                        e.printStackTrace();
                    } catch (BadPaddingException e) {
                        e.printStackTrace();
                    } catch (IllegalBlockSizeException e) {
                        e.printStackTrace();
                    }


                }
            }

            return ret;
        }

        // ---------------------
        // 对称加密 DES 部分

        public static byte[] desEncrypt(byte[] data, byte[] password) {
            byte[] ret = null;

            if (data != null && password != null) {
                // DES 密码必须是8个字节;标准的描述是按位描述;必须是 64bit
                if (data.length > 0 && password.length == 8) {

                    // 1. 创建 Cipher ,用于加密和解密,就是一个内部的算法引擎
                    // getInstance("加密的算法名称")
                    try {

                        Cipher cipher = Cipher.getInstance("DES");

                        // 3. 生成 Key 对象,根据不同的算法

                        DESKeySpec keySpec = new DESKeySpec(password);

                        // 3.2 使用密钥生成工具,来生成实际的 Key 对象
                        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 参数为算法名称

                        // 3.3 生成 Key

                        SecretKey secretKey = keyFactory.generateSecret(keySpec);

                        // 2. 初始化 Cipher,设置是加密模式还是解密模式,同时设置密码
                        // 通常第二个参数可以使用  Key 对象,每一种算法,Key对象的生成是不同的
                        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

                        // 4. 进行加密或者解密的实际操作;
                        // 返回值就是最终的结果了
                        ret = cipher.doFinal(data);

                    } catch (NoSuchAlgorithmException e) {  // 找不到算法的异常
                        e.printStackTrace();
                    } catch (NoSuchPaddingException e) { //
                        e.printStackTrace();
                    } catch (InvalidKeyException e) {  // 非法的密钥异常
                        e.printStackTrace();
                    } catch (InvalidKeySpecException e) {
                        e.printStackTrace();
                    } catch (BadPaddingException e) {
                        e.printStackTrace();
                    } catch (IllegalBlockSizeException e) {
                        e.printStackTrace();
                    }


                }
            }

            return ret;
        }


        public static byte[] desDecrypt(byte[] data, byte[] password) {
            byte[] ret = null;

            if (data != null && password != null) {
                // DES 密码必须是8个字节;标准的描述是按位描述;必须是 64bit
                if (data.length > 0 && password.length == 8) {

                    // 1. 创建 Cipher ,用于加密和解密,就是一个内部的算法引擎
                    // getInstance("加密的算法名称")
                    try {

                        Cipher cipher = Cipher.getInstance("DES");

                        // 3. 生成 Key 对象,根据不同的算法

                        DESKeySpec keySpec = new DESKeySpec(password);

                        // 3.2 使用密钥生成工具,来生成实际的 Key 对象
                        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 参数为算法名称

                        // 3.3 生成 Key

                        SecretKey secretKey = keyFactory.generateSecret(keySpec);

                        // 2. 初始化 Cipher,设置是加密模式还是解密模式,同时设置密码
                        // 通常第二个参数可以使用  Key 对象,每一种算法,Key对象的生成是不同的
                        cipher.init(Cipher.DECRYPT_MODE, secretKey);

                        // 4. 进行加密或者解密的实际操作;
                        // 返回值就是最终的结果了
                        ret = cipher.doFinal(data);

                    } catch (NoSuchAlgorithmException e) {  // 找不到算法的异常
                        e.printStackTrace();
                    } catch (NoSuchPaddingException e) { //
                        e.printStackTrace();
                    } catch (InvalidKeyException e) {  // 非法的密钥异常
                        e.printStackTrace();
                    } catch (InvalidKeySpecException e) {
                        e.printStackTrace();
                    } catch (BadPaddingException e) {
                        e.printStackTrace();
                    } catch (IllegalBlockSizeException e) {
                        e.printStackTrace();
                    }


                }
            }

            return ret;
        }


        // ---------------------
        // 编码解码部分;
        // Encode 编码
        // Decode 解码

        // Base64 -> 使用 android.util.Base64 就可以了,不需要

        // Hex 编码
        // 将字节数组每一个字节编码为十六进制字符串
        // 0x3C => "3c" "3C"
        // 0x5D => "5d" "5D"

        /**
         * Hex 编码
         *
         * @return
         */
        public static String hexEncode(byte[] data) {
            String ret = null;

            if (data != null) {

                StringBuilder sb = new StringBuilder();

                for (byte b : data) {

                    int i = b & 0x0FF;

                    String s = Integer.toHexString(i); // 消除符号,不用补码显示

                    // 15 => "0F"

                    if (i < 16) {
                        sb.append('0');
                    }
                    sb.append(s);

                }

                ret = sb.toString();

            }

            return ret;
        }

        public static byte[] hexDecode(String str) {
            byte[] ret = null;
            if (str != null) {
                int len = str.length();
                if (len > 0 && len % 2 == 0) {
                    ret = new byte[len >> 1];
                    int rLen = ret.length;

                    for (int i = 0; i < rLen; i++) {
                        int start = i * 2;
                        // substring 第二个参数在 Android 中,代表 结束索引要求 + 1
                        // 因此 使用 start + 2 -> 包含了 start, start + 1;
                        String subStr = str.substring(start, start + 2); // start, end
                        int i1 = Integer.parseInt(subStr, 16);
                        ret[i] = (byte) i1;
                    }
                }
            }
            return ret;
        }


        // ---------------------



}



Android常用加解密算法 数据安全,不管是对于企业还是个人都是十分重要。而作为一个移动开发者,我们更需要去考虑数据传输的安全性,去保护企业及个人信息安全。在Java,Android语言中,有许多的常用加解密算法,例如:对称加密算法AES,DES,3DES,非对称加密算法RSA,经典哈希算法MD5,SHA. 对称加密算法:加密秘钥和解密秘钥相同 例:AES,DES,3DES 非对称加密算法:有公钥和秘钥,公钥加密 阅读详情

相关推荐

android加密解密算法之3DES算法用例

android加密算法很多:DES ,AES,3DES等等。详情请google,baidu。 des的使用安全行很低,再次我们详细了解下3DES. 3DES顾名思义,就是对des加密算法进行得改进,对每个数据进行了3次des加密,降低了破解的难度,从而提高数据的安全性。 首先写一个utils工具,直接可以使用 import java.io.UnsupportedEncodingExce

ADUIT 1452

Android 平台更加安全的DES加密方式

DES介绍 DES是Data Encryption Standard(数据加密标准)的缩写。它是由IBM公司研制的一种对称密码算法。DES是一个分组加密算法,典型的DES以64位(即8个字节)为分组对数据加密,加密和解密用的是同一个算法。它的密钥长度是56位(因为每个第8 位都用作奇偶校验),密钥可以是任意的56位的数,而且可以任意时候改变。 DES的安全性 DES算法的安全性主要取决于密钥的保密...

Coder蒋的博客 5310

磁编码器选型避坑指南:为什么MT6816比霍尔传感器更适合你的伺服系统?

本文深入对比了MT6816磁编码器与传统霍尔传感器在伺服系统中的应用。MT6816基于AMR技术,对磁场方向敏感而非强度,具备高精度、强抗干扰、高安装容差和极低延时等优势,尤其适合高转速、恶劣环境下的工业场景,能有效提升系统可靠性与长期稳定性。

rainy的博客 1104

分组对称密钥加密算法——DES、3DES(DESede 或 TDES)、AES

一、常用的 "分组对称密钥加密算法" 分为以下3种 (1)DES(Data Encryption Standard,标准加密算法)   1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES Data Encryption Standard) 。         DES采用了64位的分组长度和56位的密钥长度,它将64位的输入经过一系列变换得到64位的

司马懿的西山居 2万+

VS Code 配置 LaTeX 写作环境完全指南

本文详细介绍了如何在 VS Code 中配置 LaTeX 写作环境,涵盖了从安装必备组件到高级功能的全面指南。首先,用户需要安装 LaTeX 发行版(如 TeX Live 或 MiKTeX)和 VS Code 插件(如 LaTeX Workshop)。接着,通过修改 settings.json 和 keybindings.json 文件,用户可以自定义编译、查看快捷键等基础配置。文章还提供了高效写作技巧,如使用代码片段和多文件项目管理,并介绍了高级功能如反向同步、公式预览和参考文献管理。此外,针对常见问题(

weixin_70043030的博客 1984

李沐之数值稳定性+模型初始化和激活函数

层记为t,这里的y不是预测,还包括了损失函数,y是优化函数,不是预测的结果y。第t层是输出。所有的h都是一些向量,向量关于向量的导数是一个矩阵,所以用了很多次的矩阵乘法,出问题就在这里。

m0_51133942的博客 1527

Android数据加密之Rsa/MD5/Aes/Des加密算法归纳总结

加密算法 1.加密算法通常分为对称性加密算法和非对称性加密算法:对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了。非对称算法与之不同,发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密...

心情舒畅 3025

Ansys Zemax与Speos协同设计:HUD系统从光学优化到驾驶模拟的全流程解析

本文详细解析了如何利用Ansys Zemax与Speos这对“黄金搭档”进行HUD系统的协同设计。流程始于Zemax进行核心光学架构与像差优化,奠定性能基础;随后将设计无缝导入Speos,通过HUD光学分析模块进行量化验证;最终在虚拟驾驶环境中进行沉浸式模拟,评估实际视觉体验与系统集成效果,实现从光学优化到驾驶模拟的全流程闭环。

weixin_29201933的博客 274

android对称加密AES-128-CBC加密的工具类

这是Android的一个AES-CBC的加密工具类。  下载地址       需要第三方jar包:bcprov.jar:百度云下载地址。  1.方法介绍   分别是加解密的方法。主要参数是三个:   1.需要加密的字符串   2.加密钥匙。经测试,只能16位或者32位。   3.IV。即偏移量。只能16位。    2.工具类缺陷        1.没有做容错处理,对加密钥匙,不是...

_淡然_花落_的专栏 4365

elmos 524系列芯片笔记

芯片的工作工作原理:集成芯片Elmos524.03有发射回路和接收回路,手册有关的内部原理图,大致如下: 芯片会产生固有频率的电压信号,信号通过引脚DRV1、2输出给外部压电陶瓷片,产生固定频率的机械波,也就是所谓的超声波,超声波遇到障碍物时会反射,反射信号经过AINS、D引脚进入芯片,在芯片内部先后经过GAIN放大,滤波然后进入比较器,滤波后的信号(signal)同预先设定的阈值(threshold)比较产生信号输出。此信号最终会连接MCU处理器,需要重点关注。 基于这个内部的工作原

qq_38230916的博客 2487

Trimble RealWorks处理点云数据(一)之坐标转换

Trimble RealWorks处理点云数据之坐标转换

yilvyangguang520的博客 3622

android开发中使用Cipher类实现加密,包括DES,DES3,AES和RSA加密

public static String Encrypt(byte[] secretKey, String encData) throws Exception { if (secretKey == null) { return null; } //1、创建Cipher对象,并且填写三种参数,算法/模式/填充模式 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); //2、SecretK

chengxuyuan22的博客 2835

零基础入门篇③ PyCharm使用指南(个性化设置、开发必备插件、常用快捷键)

Python从入门到精通👉零基础入门篇③

hacker707的博客 4375

Android 文件加密及解密

  1. 保护隐私数据不被未授权访问; 什么是加密  1. 保护隐私数据不被未授权访问;  2. 用于隐藏真实数据,进行安全的数据传递;  3. 避免数据被第三方截获; 2. 用于隐藏真实数据,进行安全的数据传递; 3. 避免数据被第三方截获; 古代加密方式:置换(反序,替换) 加密算法的历史  古代加密方式:置换(反序,替换)  现代加密算法:带密码的加密、两套密码的加...

bobo的博客 2371

IgH EtherCAT 从入门到精通:第 30 章 实战:高可用 EtherCAT 系统设计

摘要:构建高可用EtherCAT系统的关键技术 本章详细介绍了工业级EtherCAT系统的高可用性设计方法,主要包括: 冗余链路架构:采用双网卡环形拓扑设计,主备网卡同时工作,通过IgH Master的冗余配置实现线缆故障自动切换。 状态监控机制:提供专用API实时监控主备链路状态,包括从站响应数、链路状态和冗余激活标志,形成完整的故障判断矩阵。 自动恢复功能:系统内置FSM架构支持热插拔自动检测和重配置,从站断线/重连时可自动完成状态恢复,同时允许应用层实施安全措施。 这些技术共同构成了生产环境下Ethe

从事嵌入式linux android驱动开发,拥有全栈能力 244

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android 常用加密算法

title: Android 常用加密算法 date: 2020-03-02 tag: Android category: Android 文章目录Android 常用加密算法对称加密非对称加密其他散列算法对比参考 Android 常用加密算法 数字签名: 简单来说就是提供可鉴别的数字信息验证自身身份的一种方式。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。分别又发送者持有...

hesheng1024的博客 752

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java加密技术(二)——对称加密算法DES&AES

接下来我们介绍对称加密算法,最常用的莫过于DES数据加密算法。 DES DES-Data Encryption Standard,即数据加密算法。是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密

肖一林的专栏 1491

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android RSA加密解密的 工具类的使用

RSA 比较特殊,我们首先要生成私钥和公钥,然后在加密的时候,使用私钥加密,在解密的时候使用公钥解密。 //RSA 的初始化,获得私钥和密钥 public void rsaInit(){ try { KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");//RAS 密

Kodulf的专栏 6352

Android中 MD5、RC4、DES、DESede (3DES)、RSA、AES、自定义填充方式的 AES加密/解密算法

/** * 字符串进行加密 */ public static String useMD5(String passWord) { try { MessageDigest digest = MessageDigest.getInstance("MD5"); digest.update(passWord.getB

王小二的博客 1345

android 隐私数据加密方法

在做一个功能,隐私功能,保存应用数据到本地的数据库,那么数据一定要加密,否则稍微懂点技术的人就能获取数据了,也就没有隐私了。那么对数据加密,用什么样的加密方法呢? 先来了解点基础知识吧,一看就懂了。 你使用网银时,是否担心你的银行卡会被盗用?     当你和朋友用QQ进行聊天时,是否担心你的隐私会被泄露?     作为开发者,编写安全的代码比编写优雅的代码更重要,因为安全是一切

学习记录 4039

[android]DES/3DES/AES加密方式

DES 支持8位加密解密,3Des支持24位,Aes支持32位。3Des是Des算法做三次。位数的单位是字节byte。不是bits。 3Des是把24位分成3组。第一组八位用来加密,第二组8位用于解密,第三组8位用于加密,所以。假设秘钥为123456781234567812345678(3组1-8),则相当于做了一次12345678的Des加密。比如:第一次用12345678秘钥对123...

weixin_33785972的博客 176

前后端(Java + Android + iOS) 一行代码实现DES加密解密算法

一、Java实现: java实现方法和上一篇的AES一样,只需要把AES字段改成DES即可,具体可参考https://blog.youkuaiyun.com/Kevindongkun/article/details/92832373。 二、Android实现: 1. 加密 //text 待加密内容 key 公钥 长度32字符 public static String DESEncrypt(String t...

Dongxk的博客 486

Android开发笔记之数据传输中的常见加密AES\DES\DES3\RSA

在做项目时,一些重要的数据用到了加密,记录下系统提供的这几种常见的加密数据方式的使用(不是原理):对称加密 AES\DES\DES3 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标

浮生的博客 3826

安卓逆向_25 --- 密码学 之 《Java加密与解密的艺术》

《Java加密与解密的艺术》中文 PDF版:https://www.jb51.net/books/65048.html 1. 密码学应用 :https://www.bilibili.com/video/BV1oA411J7Lb?p=1 密码学应用 密码学的基本概念,对称密码,公钥密码,Hash算法,数字认证算法,数字签名 密码学 ...

墨鱼菜鸡 592

Android 文件的加密及解密

文件加密及解密 1. 保护隐私数据不被未授权访问; 什么是加密  1. 保护隐私数据不被未授权访问;  2. 用于隐藏真实数据,进行安全的数据传递;  3. 避免数据被第三方截获; 2. 用于隐藏真实数据,进行安全的数据传递; 3. 避免数据被第三方截获; 古代加密方式:置换(反序,替换) 加密算法的历史  古代加密方式:置换(反

Json_Jerry的博客 2018
上一篇: Android 中MD5算法生成字符串
下一篇: Android RSA加密解密的 工具类的使用
千雅爸爸
博客等级 码龄18年 292粉丝 639原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值