android 使用AES 对称加密分享

最近有个商城项目为了安全性,要求登录密码,支付密码使用AES 256 位 对称加密,于是就和后台一起搞了下!注(我们后台是用Java写的)
具体参考:具体参考
下载jce_policy-8.zip 链接:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下载jce_policy-6.zip 链接:http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
两者选择其中一个就行
下载解压后将里边的两个jar包(local_policy.jar,US_export_policy.jar)替换掉jdk安装路径下security文件夹中的两个包。
两种不同操作系统安装路径:/lib/security [Unix] \lib\security [Windows]
bcprov-jdk15on-156.jar下载链接: http://www.bouncycastle.org/latest_releases.html
直接放在android studio的libs 下编译一下
之后就开始使用代码调用了
android 调用

//我是代码
import android.util.Base64;
import android.util.Log;
import com.elmsc.buyer.Constant;
import java.security.Key;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


/**
 * 密码加密解密工具类
 * 设置登录及钱包支付密码要用
 * 采用的是Base64+AES加密方式
 * Constant.RES_KEY 和服务器上的一样,要和服务器做交互  key 是base64后的 加密后的串也是base64后的
 */
public class AES256Encryption {
 
    /**
     * 密钥算法
     * java6支持56位密钥,bouncycastle支持64位
     * */
    private static final String KEY_ALGORITHM = "AES";

    /**
     * 加密/解密算法/工作模式/填充方式
     * JAVA6 支持PKCS5PADDING填充方式
     * Bouncy castle支持PKCS7Padding填充方式
     * */
    private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS7Padding";

    /**
     * 生成密钥,java6只支持56位密钥,bouncycastle支持64位密钥
     * @return byte[] 二进制密钥
     * */
    private static byte[] initkey() throws Exception {

        // 实例化密钥生成器
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM, "BC");
        // 初始化密钥生成器,AES要求密钥长度为128位、192位、256位
        kg.init(256);
        //  kg.init(128);
        // 生成密钥
        SecretKey secretKey = kg.generateKey();
        // 获取二进制密钥编码形式
        return secretKey.getEncoded();
        // 为了便于测试,这里我把key写死了,如果大家需要自动生成,可用上面注释掉的代码
        //  return new byte[] { 0x08, 0x08, 0x04, 0x0b, 0x02, 0x0f, 0x0b, 0x0c, 0x01, 0x03, 0x09, 0x07, 0x0c, 0x03, 0x07,
        //      0x0a, 0x04, 0x0f, 0x06, 0x0f, 0x0e, 0x09, 0x05, 0x01, 0x0a, 0x0a, 0x01, 0x09, 0x06, 0x07, 0x09, 0x0d };
    }

    /**
     * 转换密钥
     * @param key 二进制密钥
     * @return Key 密钥
     * */
    private static Key toKey(byte[] key) throws Exception {

        // 实例化DES密钥
        // 生成密钥
        SecretKey secretKey = new SecretKeySpec(key, KEY_ALGORITHM);
        return secretKey;
    }

    /**
     * 加密数据
     * @param data 待加密数据
     * @param key 密钥
     * @return byte[] 加密后的数据
     * */
    private static byte[] encrypt(byte[] data, byte[] key) throws Exception {

        // 还原密钥
        Key k = toKey(key);
        /**
         * 实例化
         * 使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现
         * Cipher.getInstance(CIPHER_ALGORITHM,"BC")
         */
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, "BC");
        // 初始化,设置为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, k);
        // 执行操作
        return cipher.doFinal(data);
    }

    /**
     * 解密数据
     * @param data 待解密数据
     * @param key 密钥
     * @return byte[] 解密后的数据
     * */
    private static byte[] decrypt(byte[] data, byte[] key) throws Exception {

        // 欢迎密钥
        Key k = toKey(key);
        /**
         * 实例化
         * 使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现
         * Cipher.getInstance(CIPHER_ALGORITHM,"BC")
         */
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        // 初始化,设置为解密模式
        cipher.init(Cipher.DECRYPT_MODE, k);
        // 执行操作
        return cipher.doFinal(data);
    }


    /**
     * 解密
     * @author Guocg
     * @param newStr  base64后的 ,从服务器获取解密成字符串
     * @return
     * @throws Exception
     */
    public static String decrypt(String newStr) throws Exception {

        return new String(
                AES256Encryption.decrypt(Base64.decode(newStr,Base64.DEFAULT), Base64.decode(Constant.RES_KEY,Base64.DEFAULT)),
                "utf-8");
    }

    /**
     * 加密
     * @author Guocg
     * @param oldStr,本地加密上传
     * @return 密文
     * @throws Exception
     */
    public static String encrypt(String oldStr) throws Exception {

        return Base64
                .encodeToString(AES256Encryption.encrypt(oldStr.getBytes(), Base64.decode(Constant.RES_KEY,Base64.DEFAULT)),Base64.DEFAULT);
    }


    //测试
    public static void cesi() throws Exception {
        String oldStr = "qinfens撒打发第三方";
        Log.i("加密", "原文:"+oldStr);
        String key;
//      key = Base64.encodeToString(AES256Encryption.initkey(),Base64.DEFAULT);

//      key = "ivX1m+Ya01lNbJ0kZpuwmcfzDVDohK4Bsu9xaY5NrB8=";
//      Log.i("加密", "密钥:"+key);

        // 加密数据
        String newStr = encrypt(oldStr);
        Log.i("加密", "加密后:"+newStr);

        // 解密数据
        String str = decrypt(newStr);
        Log.i("加密","解密后:"+str);
    }
}

Java 调用

import java.io.UnsupportedEncodingException;
import java.security.Key;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.springframework.util.Base64Utils;

public class AES256Encryption {

    /** 
    * 密钥算法 
    * java6支持56位密钥,bouncycastle支持64位 
    * */
    private static final String KEY_ALGORITHM = "AES";

    /** 
     * 加密/解密算法/工作模式/填充方式 
     *  
     * JAVA6 支持PKCS5PADDING填充方式 
     * Bouncy castle支持PKCS7Padding填充方式 
     * */
    private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS7Padding";

    /** 
     *  
     * 生成密钥,java6只支持56位密钥,bouncycastle支持64位密钥 
     * @return byte[] 二进制密钥 
     * */
    private static byte[] initkey() throws Exception {

    // 实例化密钥生成器
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM, "BC");
    // 初始化密钥生成器,AES要求密钥长度为128位、192位、256位
    kg.init(256);
//  kg.init(128);
    // 生成密钥
    SecretKey secretKey = kg.generateKey();
    // 获取二进制密钥编码形式
    return secretKey.getEncoded();
    // 为了便于测试,这里我把key写死了,如果大家需要自动生成,可用上面注释掉的代码
//  return new byte[] { 0x08, 0x08, 0x04, 0x0b, 0x02, 0x0f, 0x0b, 0x0c, 0x01, 0x03, 0x09, 0x07, 0x0c, 0x03, 0x07,
//      0x0a, 0x04, 0x0f, 0x06, 0x0f, 0x0e, 0x09, 0x05, 0x01, 0x0a, 0x0a, 0x01, 0x09, 0x06, 0x07, 0x09, 0x0d };
    }

    /** 
     * 转换密钥 
     * @param key 二进制密钥 
     * @return Key 密钥 
     * */
    private static Key toKey(byte[] key) throws Exception {

    // 实例化DES密钥
    // 生成密钥
    SecretKey secretKey = new SecretKeySpec(key, KEY_ALGORITHM);
    return secretKey;
    }

    /** 
     * 加密数据 
     * @param data 待加密数据 
     * @param key 密钥 
     * @return byte[] 加密后的数据 
     * */
    private static byte[] encrypt(byte[] data, byte[] key) throws Exception {

    // 还原密钥
    Key k = toKey(key);
    /** 
     * 实例化 
     * 使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现 
     * Cipher.getInstance(CIPHER_ALGORITHM,"BC") 
     */
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, "BC");
    // 初始化,设置为加密模式
    cipher.init(Cipher.ENCRYPT_MODE, k);
    // 执行操作
    return cipher.doFinal(data);
    }

    /** 
     * 解密数据 
     * @param data 待解密数据 
     * @param key 密钥 
     * @return byte[] 解密后的数据 
     * */
    private static byte[] decrypt(byte[] data, byte[] key) throws Exception {

    // 欢迎密钥
    Key k = toKey(key);
    /** 
     * 实例化 
     * 使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现 
     * Cipher.getInstance(CIPHER_ALGORITHM,"BC") 
     */
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    // 初始化,设置为解密模式
    cipher.init(Cipher.DECRYPT_MODE, k);
    // 执行操作
    return cipher.doFinal(data);
    }

    /** 
     * @param args 
     * @throws UnsupportedEncodingException 
     * @throws Exception  
     */
    public static void main(String[] args) throws Exception {

    String oldStr = "qinfens撒打发第三方";
    System.out.println("原文:"+oldStr);

    String key;
//  key = Base64Utils.encodeToString(AES256Encryption.initkey());
    key = "ivX1m+Ya01lNbJ0kZpuwmcfzDVDohK4Bsu9xaY5NrB8=";
    System.out.println("密钥:"+key);
    // 加密数据
    String newStr = encrypt(oldStr, key);
    System.out.println("加密后:"+newStr);

    // 解密数据
    String str = decrypt(newStr, key);
    System.out.println("解密后:"+str);

    }

    /**
     * 解密
     * @author Guocg
     * @param newStr  base64后的
     * @param key  base64后的
     * @return
     * @throws Exception
     */
    public static String decrypt(String newStr, String key) throws Exception {

    return new String(
        AES256Encryption.decrypt(Base64Utils.decodeFromString(newStr), Base64Utils.decodeFromString(key)),
        "utf-8");
    }

    /**
     * 加密
     * @author Guocg
     * @param oldStr
     * @param key  base64后的
     * @return
     * @throws Exception
     */
    public static String encrypt(String oldStr, String key) throws Exception {

    return Base64Utils
        .encodeToString(AES256Encryption.encrypt(oldStr.getBytes(), Base64Utils.decodeFromString(key)));
    }
}

注:如果导包完成后找不到包的话
就在build.gradle添加compile files('libs/bcprov-jdk15on-156.jar')
make完成后删除
诸多不足,希望大神们不吝赐教!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,495评论 18 139
  • ** 今天看了一下kafka官网,尝试着在自己电脑上安装和配置,然后学一下官方document。** Introd...
    RainChang阅读 4,980评论 1 30
  • #环境说明: ##一:本地MAVEN仓库 需要将libs目录下的6的jar文件放入到自定义的仓库,否则无法打包.坐...
    莰空如耶阅读 429评论 0 0
  • 本文参考了:http://blog.didispace.com/springcloud7/http://blog....
    WeiminSun阅读 7,167评论 0 23
  • 与友闲聊,爱和寂寞如何区分。 叹笑间轮回这是个深沉的话题 记起经典剧《仙剑一》, 拜月教主觉得世界的爱都太过隐晦 ...
    赵家姑娘染柒阅读 320评论 0 1