密码学 09 AES

字节玄铁师
• 阅读 979

AES

表一:

算法秘钥长度秘钥长度默认值工作模式填充模式备注
AES128,192,256128ECB,CBC,PCBC,CTR,CTS,CFB,CFB8至CFB128,OFB,OFB8至OFB128NoPadding,PKCS5Padding,ISO10126PaddingJava6实现若使用256位秘钥需要获得无政策限制权限文件(Unlimited Strength Jurisdiction Policy Files)
AES同上同上同上PKCS7Padding,ZeroBytePaddingBouncy Castle实现

表二:

AES秘钥长度(比特)分组长度(比特)向量长度(比特)加密轮数
AES-12812812812810
AES-19219212812812
AES-25625612812814
  • 1

    根据密钥长度不同,分为AES128、AES192、AES256
  • 1.特点
  1. ECB模式和CBC模式的区别
  2. 对称加密算法里,使用NOPadding,加密的明文必须等于分组长度倍数,否则报错
  3. 如果使用PKCS5Padding,会对加密的明文填充1字节-1个分组的长度
  4. 没有指明加密模式和填充方式,表示使用默认的AES/ECB/PKCS5Padding
  5. 加密后的字节数组可以编码成Hex、Base64
  6. AES算法明文按128位进行分组加密,可以调用cipher.getBlockSize()来获取
  7. 要复现一个对称加密算法,需要得到明文、key、iv、mode、padding
  8. 明文、key、iv需要注意解析方式,而且不一定是字符串形式
  9. 如果加密模式是ECB,则不需要加iv,加了的话会报错
  10. 如果明文中有两个分组的内容相同,ECB会得到完全一样的密文,CBC不会
  11. 加密算法的结果通常与明文等长或者更长,如果变短了,那可能是gzip、protobuf
  • 2.代码实现

      public static String encryptAES(String plaintext) throws Exception {
          //        初始化秘钥 和加密算法   秘钥为16位
          SecretKeySpec keySpec = new SecretKeySpec("0123456789abcdef".getBytes(StandardCharsets.UTF_8),"AES");
          IvParameterSpec ivParameterSpec = new IvParameterSpec("hengdinghengding".getBytes(StandardCharsets.UTF_8));
          //         得到Cipher的实例   026fcbe02f76529d0a5bb3904aa6efdc           C5sV2ktEoPUVHc/EwB811b8xuRnjiS3cO1khLWp7EeY=
          Cipher des = Cipher.getInstance("AES/CBC/PKCS5Padding");
    
          // 对Cipher 实例进行初始化,
          des.init(Cipher.ENCRYPT_MODE,keySpec,ivParameterSpec);
          // update并不会每次都增加要加密的字符串的长度,并不可靠。理想中的状态是  xiaojianbang +hengdi 解密发现只有banghengdi
    //        des.update("xiaojianbang".getBytes(StandardCharsets.UTF_8));
          // 加密 由字符串 得到的byte[]
          byte[] res=des.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
          Log.d("hengdi","AES  byte test" + Arrays.toString(res));
    
          // 将 byte[] 实例化为 ByteString 对象
          ByteString bty=  ByteString.of(res);
          // hex 编码
          String str_hex= bty.hex();
          // base64 编码
          String str_base64 = bty.base64();
          return str_hex + "  ||  " + str_base64;
      }
    
      public static String decryptAES(String cipherText) throws Exception {
          // 将加密后base64编码的字符串 解码,并还原成 byte[]
    //        byte[] cipherTextBytes = ByteString.decodeHex(cipherText).toByteArray();
          byte[] cipherTextBytes = ByteString.decodeBase64(cipherText).toByteArray();
          SecretKeySpec keySpec = new SecretKeySpec("0123456789abcdef".getBytes(StandardCharsets.UTF_8),"AES");
          IvParameterSpec ivParameterSpec = new IvParameterSpec("hengdinghengding".getBytes(StandardCharsets.UTF_8));
          //         得到Cipher的实例   026fcbe02f76529d0a5bb3904aa6efdc           Am/L4C92Up0KW7OQSqbv3A==
          Cipher des = Cipher.getInstance("AES/CBC/PKCS5Padding");
          des.init(Cipher.DECRYPT_MODE,keySpec,ivParameterSpec);
          byte[] res=des.doFinal(cipherTextBytes);
          return new String(res);
      }
点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
thymeleaf在工作中遇到的问题及解决办法(四)
1、关于字符串拼接的问题       字符串拼接可以使用如下方式。<ahref""th:text"第${StartNo}页''共${countPage}页"       还有一种更优雅的方式,使用“||”减少了字符串的拼接,代码如下。<ahref""th:
Stella981 Stella981
3年前
Jira 使用手册
<tablestyle"width:100%;margin:200px0300px0;"<tr<thDate</th<thRevisionversion</th<thDescription</th<thauthor</th</tr<tr<td20180614</td<tdV1.0.0</td
Stella981 Stella981
3年前
Spring Security Oauth2.0 实现短信验证码登录
springsecurityoauth2登录过程详解​!oauth2登录过程详解.png(https://ask.qcloudimg.com/draft/1219867/th3wmc3zzu.png)​定义手机号登录令牌/
Wesley13 Wesley13
3年前
2020软件工程作业03
<styletable{width:100%;/\表格宽度\/margin:auto;/\外边距\/emptycells:show;/\单元格无内容依旧绘制边框\/fontsize:18px;}table,th,td{border:2pxsolidpink;}li{fontsize:1
Stella981 Stella981
3年前
AQS (AbstractQueuedSynchronizer)源码导读:锁的获得与释放
AQS是什么?AbstractQueuedSynchronizer简称AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。Providesaframeworkforimplementingblockinglocksandrelatedsynchronizers(semaphores,events,etc)th
Wesley13 Wesley13
3年前
Java 日期与时间
Java的日期Java没有内置的日期类,但可以导入java.time包,这个包中包含了许多类,可用于处理日期和时间。例如:<table<tbody<tr<thstyle"width:25%"Java类</th<thstyle"width:75%"描述</th</tr<tr<td<code
Easter79 Easter79
3年前
Thrift
安装thriftmacbrewinstallthrift安装完成检查thriftversion新建maven项目pom.xml<dependencies<dependency<groupIdorg.apache.th
Stella981 Stella981
3年前
Ngrok搭建环境映射外网访问本地
!(http://static.oschina.net/uploads/space/2016/0105/151215_OnNg_1444646.png)!(http://static.oschina.net/uploads/space/2016/0112/144706_tH0X_1444646.jpg)在开发微信公众号、企业号等需要外
Wesley13 Wesley13
3年前
C# 线程基础
1 线程是进程中的一个执行流 2线程是一个可以单独操作的活动3线程创建和常用方法 a 创建    Thread thnewThread(Method); b常见方法 th.start()//启动线程 th.Abort()//终止线程 Thread.Sleep(n)//休眠线程(停止n毫秒后继续执
Stella981 Stella981
3年前
99th Packers and Movers Services
99th.co.inistheleadingsearchdirectoryforIndia.Hereonecanfindtheverifiedcompaniesinanyindustryliketransport,logistics,packers&moversservice,BusinessService
吴押狱 吴押狱
1年前
测试用
Inrecentyears,theOscarshavebeenwidelycriticized.Frombeingtoopoliticallycorrecttolackinginnovation,andwithplummetingviewership,th