分享

在线AES加密源码

 一本正经地胡闹 2019-09-04

SecretKeySpec key = new SecretKeySpec(Arrays.copyOf(password.getBytes("utf-8"), 16), "AES");

   Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
   byte[] byteContent = content.getBytes("utf-8");
   cipher.init(Cipher.ENCRYPT_MODE, key);
   byte[] result = cipher.doFinal(byteContent);

   return result;

用Base64处理字节数组,得到加密字符串


CSDN很多加密代码的key生成的很复杂,而且和在线加密不一样,主要区别在于:

1. SecretKeySpec key = new SecretKeySpec(encodeKey, "AES");

2. SecretKeySpec key = new SecretKeySpec(password.getBytes()"AES");

加密网站用的是第2个,直接用key字符串的字节数组(一般取前16个字节,可用Arrays.copyOf(bytes,16))。

第1个是先给key进行了一番加密操作,再把它的字节数组给SecretKeySpec

            KeyGenerator kgen = KeyGenerator.getInstance("AES");

            kgen.init(128, new SecureRandom(password.getBytes()));

            SecretKey secretKey = kgen.generateKey();

            byte[] encodeKey = secretKey.getEncoded();

            SecretKeySpec key = new SecretKeySpec(encodeKey, "AES");


            Cipher cipher = Cipher.getInstance("AES");//默认ECB模式

            byte[] byteContent = content.getBytes("utf-8");

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

            byte[] result = cipher.doFinal(byteContent);

    public static String AESDncode(String encodeRules,String content){

        try {

            //1.构造密钥生成器,指定为AES算法,不区分大小写

            KeyGenerator keygen=KeyGenerator.getInstance("AES");

            //2.根据ecnodeRules规则初始化密钥生成器

            //生成一个128位的随机源,根据传入的字节数组

            keygen.init(128, new SecureRandom(encodeRules.getBytes()));

              //3.产生原始对称密钥

            SecretKey original_key=keygen.generateKey();

              //4.获得原始对称密钥的字节数组

            byte [] raw=original_key.getEncoded();

            //5.根据字节数组生成AES密钥

            SecretKey key=new SecretKeySpec(raw, "AES");

              //6.根据指定算法AES自成密码器

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

              //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY

            cipher.init(Cipher.DECRYPT_MODE, key);

            //8.将加密并编码后的内容解码成字节数组

            byte [] byte_content= new BASE64Decoder().decodeBuffer(content);

            /*

             * 解密

             */

            byte [] byte_decode=cipher.doFinal(byte_content);

            String AES_decode=new String(byte_decode,"utf-8");

            return AES_decode;

        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        } catch (NoSuchPaddingException e) {

            e.printStackTrace();

        } catch (InvalidKeyException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } catch (IllegalBlockSizeException e) {

            e.printStackTrace();

        } catch (BadPaddingException e) {

            e.printStackTrace();

        }

        //如果有错就返加nulll

        return null;         

    }


password就是秘钥,有的用key,有的用encodeRules

网站只是截取我们字符串字节的前16位字节数组作为秘钥进行加密


128位密钥,用jdk自带库实现

[参考1](https://blog.csdn.net/u013871100/article/details/80100992)

[参考2](https://blog.csdn.net/qq_18870023/article/details/52183755)

AES涉及几个参数:加密模式、补码方式、偏移量

经验证jdk默认的是ECB模式,并不是参考中所说的CBC

因为,ECB模式是不需要偏移的,默认情况下插入偏移,从jdk报错信息提示来看,默认确定是ECB

代码在下,加密和解密都没问题。可是加密结果和在线加密工具出的结果不一致

很费解为什么不一致,参数设置都已经一样了,只能先这样了

CBC需要IV,即秘钥偏移量

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多