• AES加密算法-128位高安全,高速度


    网上资料显示,下一代加密技术会围绕着AES技术进行。初出茅庐,学习编写了加密代码,如下所示

    package com.bao.tools.encryption;

    import java.security.SecureRandom;
    import java.util.Scanner;

    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;

    import org.junit.Test;

    /**
     * @title AES加密解密算法
     * @description 高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,现在 AES 标准的一个实现是 Rijndael 算法
     * @author Administrator
     * @date 2015-7-16
     */
    public class CAES {
        
        /**
         *
         * @param key(生成键字符串)
         * @param value(加密的文字字符串)
         * @param mode
         *            (true:加密;false:解密)
         * @return
         */
        public static byte[] setEncrypted(String key, byte[] value, boolean mode)throws Exception {
            if (key == null || value == null)
                return null;
            // --------- 生成密码键
            // 创建AES通用键模式
            KeyGenerator generator = KeyGenerator.getInstance("AES");
            // 初始化通用键(256位,创建随机编码键)
            generator.init(128, new SecureRandom(key.getBytes("UTF-8")));
            // 创建安全键实例
            SecretKey keys = generator.generateKey();
            // 创建密匙规范的实例
            SecretKeySpec keySpec = new SecretKeySpec(keys.getEncoded(), "AES");

            // ----------开始加密/解密内容
            Cipher cipher = Cipher.getInstance("AES");// 创建AES内容加密实例
            if (mode) {
                cipher.init(Cipher.ENCRYPT_MODE, keySpec);// 加密
            } else {
                cipher.init(Cipher.DECRYPT_MODE, keySpec);// 解密
            }
            byte[] result = cipher.doFinal(value);
            return result;//注意:返回一定是byte数组,否则报 16位字节异常 !
        }

        /*
         * 测试
         */
        @Test
        public void test() throws Exception {
            Scanner scanner = new Scanner(System.in);
            System.out.println("-----------AES安全加密测试------------- 请输入主键(字符串):");
            String key = scanner.nextLine();
            System.out.println("请输入要加密的内容:");
            String value=scanner.nextLine();
            System.out.println("---------运行结果-----------");
            
            //如果要求安全系数更高且暂时不用解密,可以使用BASE64编码后再进行AES加密
    //        value = CBase64.setEncrypted(value);
            
            byte[] message = setEncrypted(key, value.getBytes(), true);//执行加密方法
            System.out.println("------加密字符为:"+new String(message));//在这里将字节数组转换为字符串显示出来
                    
            System.out.println("+++++++解 密 :"+new String(setEncrypted(key, message, false)));
            
            scanner.close();
        }
    }
    运行结果:

    注明:网上找的资料,搞了大半个晚上才发现,byte存取很重要,不然会报16倍数字节异常 !

  • 相关阅读:
    java中引用数据类型Scanner类和Random类的使用-0509
    java中运算符的理解-0509
    MySQL-ER图
    MySQL-习题
    《大型网站技术架构:核心原理与案例分析》笔记
    rabbitmq php测试使用
    gearman管理工具GearmanManager的安装与使用
    让PHP7达到最高性能的几个Tips
    linux下查看最消耗CPU、内存的进程
    Gearman分布式任务处理系统
  • 原文地址:https://www.cnblogs.com/rick168/p/4652978.html
Copyright © 2020-2023  润新知