文档章节

AES-加密工具类

nickles
 nickles
发布于 2017/05/16 00:46
字数 500
阅读 77
收藏 0

一个简单的AES加密工具类

package 【xx隐藏包名】;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by percy on 2017/5/14.
 * AES 对称加密工具类
 */
public class AESEncodeTools {
       public static String MCH_ID = "1999999999";
       public static String  KEY = "xxxx";
       private static String CODE = "xxxxxx";


            /**
         * 获取商户ID和秘钥键值对
         * @return
         */
        public static Map<String,String> getmchIdAndKey (){
            Map<String,String>mchIdAndKey = new HashMap<>();
            try {
                mchIdAndKey.put(MCH_ID,decrypt(CODE,KEY));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return mchIdAndKey;
        }

        public  static String getkey(String key){
            String keys = "";
            if(key!=null&&key.equalsIgnoreCase(MCH_ID)){
                try {
                    keys = decrypt(CODE,KEY);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return keys;
        }

        /** 密钥算法 */
        private static final String KEY_ALGORITHM = "AES";
        private static final int KEY_SIZE = 256;
        /** 加密/解密算法/工作模式/填充方法 */
        /**
         * 获取密钥
         * @return
         * @throws Exception
         */
        public static Key getKey() throws Exception{
            //实例化
            KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
            //AES 要求密钥长度为128位、192位或256位
            kg.init(KEY_SIZE);
            //生成密钥
            SecretKey secretKey = kg.generateKey();
            return secretKey;
        }

        /**
         * 转化密钥
         * @param key 密钥
         * @return Key 密钥
         * @throws Exception
         */
        public static Key codeToKey(String key) throws Exception{
            byte[] keyBytes = Base64.decodeBase64(key);
            SecretKey secretKey = new SecretKeySpec(keyBytes,KEY_ALGORITHM);
            return secretKey;
        }

        /**
         * 解密
         * @param data 待解密数据
         * @param key 密钥
         * @return byte[] 解密数据
         * @throws Exception
         */
        private static String decrypt(byte[] data,byte[] key) throws Exception{
            //还原密钥
            Key k = new SecretKeySpec(key,KEY_ALGORITHM);
            /**
             * 实例化
             * 使用PKCS7Padding填充方式,按如下方式实现
             * Cipher.getInstance(CIPHER_ALGORITHM,"BC");
             */
            Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
            //初始化,设置解密模式
            cipher.init(Cipher.DECRYPT_MODE,k);
            //执行操作
            return new String(cipher.doFinal(data),"UTF-8");
        }

        /**
         * 解密
         * @param data 待解密数据
         * @param key 密钥
         * @return byte[] 解密数据
         * @throws Exception
         */
        public static String decrypt(String data,String key) throws Exception{
            return decrypt(Base64.decodeBase64(data), Base64.decodeBase64(key));
        }

        /**
         * 加密
         * @param data 待加密数据
         * @param key 密钥
         * @return bytes[] 加密数据
         * @throws Exception
         */
        public static byte[] encrypt(byte[] data,byte[] key) throws Exception{
            //还原密钥
            Key k = new SecretKeySpec(key,KEY_ALGORITHM);
            /**
             * 实例化
             * 使用PKCS7Padding填充方式,按如下方式实现
             * Cipher.getInstance(CIPHER_ALGORITHM,"BC");
             */
            Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
            //初始化,设置为加密模式
            cipher.init(Cipher.ENCRYPT_MODE,k);
            //执行操作
            return cipher.doFinal(data);
        }

        public static String encrypt(String data,String key) throws Exception{
            byte[] dataBytes = data.getBytes("UTF-8");
            byte[] keyBytes = Base64.decodeBase64(key);
            return Base64.encodeBase64String(encrypt(dataBytes, keyBytes));
        }

        /**
         * 初始化密钥
         * @return
         * @throws Exception
         */
        public static String getKeyStr() throws Exception{
            return Base64.encodeBase64String(getKey().getEncoded());
        }
    }






 

© 著作权归作者所有

nickles
粉丝 5
博文 39
码字总数 32378
作品 0
深圳
程序员
私信 提问
自己写的AES加密工具类的加密结果为什么与在线AES加密网站的加密结果不一致?

我写了一个AES加密工具类,对明文进行AES加密,相关参数如下: 加密算法:AES 明文:A 算法模式:CBC 密钥长度:256 密钥:1qaz@WSX1qaz@WSX 密钥偏移量:1234567890123456 补码方式:PKCS7...

摩卡王伟
2013/06/24
3.7K
1
php7 openssl_decrypt AES的ECB与CBC加解密

php7.2版本用opensslencrypt代替mcryptencrypt,导致以往自己写的Aes加密类不能用。 这次项目客户端用的是 AES-128-ECB 加密,我用在线AES工具来测试,发现自己写的加解密方法得到的值不一样...

jichun
2018/05/08
0
0
Java 常用工具包--JCake

JCake是整合了目前Java开发过程中使用最多的:字符串处理、日期处理、邮件处理、文件处理、任务调度处理、HTTP请求处理、MD5/AES加密解密处理的一系列工具类,方便开发人员,减少一些不必要的...

江哥一直在
2014/01/09
2.5K
0
Android外部文件加解密及应用实践

有这样的应用场景,当我们把一些重要文件放到asset文件夹中时,把.apk解压是可以直接拿到这个文件的,一些涉及到重要信息的文件我们并不想被反编译拿去,这个时候需要先对文件进行加密,然后...

C6C
2018/05/08
0
0
Java 对称加密

最近在做一个用户 token 功能,学习了加密相关 AES/DES、RSA 等。其中涉及一个对称和非对称加密问题。对称加密虽然没有非对称加密那样安全性高,但好处是加密速度快,但某些场合还是可以选择...

zhangxin09
2017/12/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

typescript 接口 函数类型 可索引类型

函数类型 可索引类型 数字索引签名 字符串索引签名 数字索引签名返回值 必须是 字符串索引签名返回值的子集 只读索引签名

lilugirl
今天
3
0
Oracle SQL语法实例合集

如需转载请注明出处https://my.oschina.net/feistel/blog/3052024 目的:迅速激活Oracle SQL 参考:《Oracle从入门到精通》 ------------------------------------------------------------......

LoSingSang
今天
2
0
增加 PostgreSQL 服务进程的最大打开文件数

https://serverfault.com/questions/628610/increasing-nproc-for-processes-launched-by-systemd-on-centos-7 要在systemd的配置里加才行...

helloclia
今天
2
0
组合模式在商品分类列表中的应用

在所有的树形结构中最适合的设计模式就是组合模式,我们看看常用商品分类中如何使用。 先定义一个树形结构的商品接口 public interface TreeProduct { List<TreeProduct> allProducts(...

算法之名
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部