文档章节

Java 对称数据加密AES

o
 osc_sz3fldcb
发布于 2018/02/12 16:27
字数 869
阅读 6
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

  昨天呢写了一个非对称数据加密,今天来写对称的数据加密AES。对称数据加密就是只使用一个密钥  进行加密和解密,AES可以使用128,192,和256位密钥。

  然后就是我的工具类:

public class AESUtil {

    public static byte[] getKeys(String data){
        try {
            // 创建AES的Key生产者
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            // 利用用户密码作为随机数初始化出128位的key生产者
            //SecureRandom 是生成安全随机数序列,password.getBytes() 是种子,只要种子相同,序列就一样,密钥也一样
            kgen.init(128, new SecureRandom(data.getBytes()));
            // 根据用户密码,生成一个密钥
            SecretKey secretKey = kgen.generateKey();
            byte[] key = secretKey.getEncoded();
            return key;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            System.out.println("没有此算法");
        }
        return null;
    }

    public static byte[] getKeys(){
        try {
            // 创建AES的Key生产者
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            // 利用用户密码作为随机数初始化出128位的key生产者
            //SecureRandom 是生成安全随机数序列,没有种子
            kgen.init(128);
            SecretKey secretKey = kgen.generateKey();
            byte[] key = secretKey.getEncoded();
            return key;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            System.out.println("没有此算法");
        }
        return null;
    }

    /**
     * @param content
     * @param secretkey
     * @return
     */
    public static byte[] encrypt(String content, byte[] secretkey) {
        try {
            // 转换为AES专用密钥
            SecretKeySpec key = new SecretKeySpec(secretkey, "AES");

            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化为加密模式的密码器
            byte[] result = cipher.doFinal(byteContent);// 加密
            return result;

        } catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    public static byte[] decrypt(byte[] content, SecretKey secretKey) {
        try {
            byte[] enCodeFormat = secretKey.getEncoded();
            // 转换为AES专用密钥
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            // 创建密码器
            Cipher cipher = Cipher.getInstance("AES");
            // 初始化为解密模式的密码器
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] result = cipher.doFinal(content);
            // 明文
            return result;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static byte[] decrypt(byte[] content, byte[] secretKey) {
        try {
            // 转换为AES专用密钥
            SecretKeySpec key = new SecretKeySpec(secretKey, "AES");
            // 创建密码器
            Cipher cipher = Cipher.getInstance("AES");
            // 初始化为解密模式的密码器
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] result = cipher.doFinal(content);
            // 明文
            return result;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    public static void main(String[] args) {
        String content = "我是-桃之夭夭";
        String password = "767";
        System.out.println("加密之前:" + content);

        byte[] key = getKeys();

        // 加密
        byte[] encrypt = AESUtil.encrypt(content, key);
        System.out.println("加密后的内容:" + Base64.encodeBase64URLSafeString(encrypt));

        // 解密
        byte[] decrypt = AESUtil.decrypt(encrypt, key);
        System.out.println("解密后的内容:" + new String(decrypt));
    }
}

  

  这个过程就是随机生成一个密钥(可以有种子,也可以没有),然后用这个密钥加密和解密,还是很简单的啦(●ˇ∀ˇ●)

  然后为了安全常常是RSA和AES一起使用,一般来讲就是:

    客户端加密:

      1. 随机产生AES密钥;

      2. 对重要信息进行AES加密

      3. 使用RSA对AES密钥进行公钥加密

    服务端解密:

      1. 使用RSA私钥对AES密钥解密

      2. 用AES密钥对重要信息的密文解密

所以我又模拟了一下这个过程:

public class AES_RSAUtil {

    public static void main(String[] args) throws Exception{
        /*模拟客户端*/
        String msg = "hello 冬竹";
        byte[] key = AESUtil.getKeys();//获取密钥的编码

        byte[] bytes = AESUtil.encrypt(msg,key);
        String seKey = Base64.encodeBase64URLSafeString(key);//转成字符串之后进行再加密
        RSAUtil.init();
        //RSA公钥 加密后的 AES密钥
        String encryptKey = RSAUtil.encryptByPublicKey(seKey,RSAUtil.getPublicKey(RSAUtil.keyMap.get("PUBLIC_KEY")));




        /*模拟服务端*/
        //解码AES密钥
        String aesKey = RSAUtil.decryptByPrivateKey(encryptKey,RSAUtil.getPrivateKey(RSAUtil.keyMap.get("PRIVATE_KEY")));
        //还原aesKey
        byte[] secretKey = Base64.decodeBase64(aesKey);
        String ming = new String(AESUtil.decrypt(bytes,secretKey));
        System.out.println(ming);

    }

  

  这个用到的依赖什么的都是我昨天的那个啦,好了,因为Java的jdk里已经帮我们写好了这些加密算法的细节,所以很方便

  最后推荐一下:

    1. AES加密算法的详细介绍与实现

    2.数据传输加密——非对称加密算法RSA+对称加密算法AES

https://github.com/MoisAbby/XZUtils

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
代码生成器--Codgen

Codgen是一个基于数据库元数据模型,使用freemarker模板引擎来构建输出的代码生成器。freemarker的数据模型结构通常来说都是一个Map树状结构模型,codgen也不例外,它的数据模型这棵树的根节...

黄天政
2013/01/29
1.4W
2
XLSX读写库--EPPlus

EPPlus 是使用Open Office XML格式(xlsx)读写Excel 2007 / 2010文件的.net开发库。 EPPlus 支持: 单元格范围 单元格样式(Border, Color, Fill, Font, Number, Alignments) Charts 图片 形状...

匿名
2013/02/01
1W
2
研究虚拟机--Jikes RVM

Jikes研究虚拟机(Jikes Research Virtual Machine,简称Jikes RVM)是一种成熟的用于执行Java程序的虚拟机,其早期版本与当前版本分别在通用公共许可证(CPL)与Eclipse公共许可证(EPL)下开...

匿名
2013/02/13
1.1K
0
Swing界面分析和调试工具--Swing Inspector

Swing Inspector是一个Java Swing/AWT用户界面分析和调试工具,功能与firebug类似,具有强大的Swing/AWT用户界面分析和调试相关功能。 适用于从java swing初级到高级的所有开发人员,能够快速...

匿名
2013/03/06
3.4K
0
密码管理程序--pwgrep

为了管理我的密码,我写了一个小的 bash/awk 脚本用来管理一个密码数据库并使用 GnuPG 进行加密。使用 pwgrep 的好处是: 密码加密 密码版本化,不用担心丢失老密码 Since a versioning sys...

匿名
2013/03/11
1.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

PPDet:减少Anchor-free目标检测中的标签噪声,小目标检测提升明显

本文转载自AI算法修炼营。 这篇文章收录于BMVC2020,主要的思想是减少anchor-free目标检测中的label噪声,在COCO小目标检测上表现SOTA!性能优于FreeAnchor、CenterNet和FCOS等网络。整体思路...

我爱计算机视觉
昨天
0
0
BIO、NIO、AIO 区别和应用场景

点击上方“ java1234 ”,选择“标星公众号” 优质文章,第一时间送达 66套java从入门到精通实战课程分享...

小锋2
今天
0
0
ContentProvider(查询 插入 修改 删除 )

注意 本篇实在sqlite的基础上编写的所以建议首先了解sqlite 首先建立两个模块 ContentProvider ContentResolver ContentProvider 里面需要建立表和建立连接 所以在这里需要建立DBHelp类 DBHe...

osc_6ttvlt1w
7分钟前
0
0
用这个网站一查,才知道自己被卖了

还记得上个月好多大佬的Twitter账号被盗用于网络诈骗的事件吗。 7月15日,美国前总统奥巴马、“股神”巴菲特、特斯拉CEO马斯克、微软创始人比尔·盖茨等人的账户连续“被登录”,用来向大众诈...

猿大白
今天
0
0
牛客多校第9场E Groundhog Chasing Death

开始以为是什么高深的数论题,后来 重新 推了一下,得到了个这么个式子。 ∏ i = a b ∏ j = c d ( p 1 m i n ( a 1 [ 1 ] i , a 2 [ 1 ] j ) p 2 m i n ( a 1 [ 2 ] i , a 2 [ 2 ] j ) . . ...

osc_wdq5dwoy
9分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部