aes iv值_结合AES加密来讲java枚举

文章概要

    壹 前言

     使用枚举实现AES工具类

     枚举的真实面貌

    肆 有关枚举的问题及解答

    伍 感言

前言

    最近在对接一个第三方需求时,对方需要我对密码进行AES加密后,将加密密码以16进制字符串的方式传递给他,一开始我是一脸懵逼,什么是AES加密,什么是16进制字符串,哪个工具包里面有这个东西。我带着疑问,习惯性地打开百度

840e213d76ec44ed02f4c46a9baae159.png

    哈哈哈哈,我这样做并不是为了秀一下我的浏览器!找到了第一篇文章,点进去二话不说直接复制代码,粘贴了过来,把自己需要加密的明文输入到对应的参数位置,辅助加密的key也输入到对应的参数位置,直接一运行,哎呦,成了。

2905834113c782e53a25b81600979bac.png

        然而,当我用第三方的测试接口测试时,发现同样的内容同样的key,我们两个人的返回结果不一致,我瞬间懵逼了,这不像以前我对接的那些个加密算法,只要大家都用这个算法,不管什么工具包实现的,拿来得到结果就可以放心的提交代码了。而这次我们用一个都叫AES的算法,得到的结果却是不同的。结果搞了半天原来,这个算法还有N种填充模式,这里我们先不管这个加密算法到底原理是啥,也不要管这几种填充模式具体是怎么个填充法,总之知道它比较安全就行了。最后仔细研读了对方的接口文档,终于知道对方使用的php代码库中的AES加密算法,此时我应该选用AES/ECB/NoPadding这种方式才可以得到和他相同的结果。(此处我要提醒将来搞编程的小伙伴,一定要耐心仔细地阅读文档,然后再写代码对接,不要心浮气躁,哈哈哈!)。

使用枚举实现AES工具类

     好了故事说完了,那这个玩意和枚举有毛线关系。嗯嗯,由于一开始我搜索了N篇文章,大家都是相互抄袭,千篇一律,也没人提这个AES算法有N种填充方式。后来终于看到一个大神也遇到了同样的问题,并且使用枚举实现了AES/ECB/NoPadding的加密和解密。嗯嗯,于是我在大神的基础上做了二次加工,把AES加密算法的N种填充方式汇总到该枚举类中,成为一个工具类。我还是首次这么使用枚举,感觉有点爽,特别是看着这个大写字母后边调用了一个方法,就有点开心。

    我们先来看一下,这个枚举类大概长什么样子,这也是我第一次看到枚举里面实现了一个方法(真是大惊小怪的,没见过世面),有种匿名内部类的感觉。括号里面是该实例的构造参数,继续往下看就可以知道。

f8586757c2a646135939f86533af5675.png

    然后我们看看这个枚举的构造方法是什么,由于枚举的实例是在类内部创建完成的,所以构造方法不用想,肯定是private的,不加就可以。

072f8441b2346962414e4b0e12b94899.png

      所以最后就有了如下测试代码,基本每种填充方式,都会产生不一样的结果,这可叫人如何对接。

b6c1d6e5a45d49d54277cef355f2cbcb.png

   测试完代码后,我忽然发现,有些填充算法需要一个IV加密向量,于是我萌生出给需要IV向量的实例再添加一个成员变量的想法,于是便碰到了一个问题,一个枚举可以有多个构造方法吗,我试了一下,发现是可以的。

34fd95ccaa09f574c91148f2b4accd25.png

    其实如果知道了枚举的真实面貌,以上的问题就会迎刃而解。

枚举的真实面貌

     通过反编译之后观察枚举,可以发现我们的枚举被转变成了一个final修饰的java类。每个枚举实例都是该类的实例对象,根据各自的参数选择不同的构造方法进行构建(可能我用的idea编译的,怎么和大佬们反编译出来的东西不太一样)。

    实现了父类抽象方法的枚举值,实际上会被编译成匿名内部类

27cf435181920bccbfe6af9a88999b29.png

    我就点到为止吧,感觉还是听大佬讲比较好(请想要了解详情的小伙伴移步知乎)。我只是提供一下我的AES工具类。代码地址

    https://github.com/liantengda/myObject.git

    我这辈子没怕过谁,今天居然怂了。对了,这个AES工具类里面,AES/ECB/NoPadding方法16位补齐的代码有bug,当密码位数超过16位之后就不能用了。感兴趣的小伙伴可以自己改造下。

有关枚举的问题及解答

以下提问来自知乎:

1枚举允许继承类吗

2枚举允许实现接口吗

3可以继承枚举吗

以下回答来自知乎:

4e495046af98f67060b2eb7ca4fc5236.png

1 枚举不允许继承类,因为每个枚举已经默认继承了Enum类,由于java是单继承的,所以枚举的继承名额已经被占用

2 枚举允许实现接口,因为枚举本身就是一个类,类可以实现多个接口

3 不可以继承枚举,因为JVM在将枚举转换为类时,把类定义为final,就像String类一样,无法被继承。

感言

    今天还是一如既往的平静,没有啥可以感叹的。唯一可以看到的就是一些???(这鱼居然可以加粗)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值