Java 环境下使用 AES 加密的特殊问题处理

3DES加解密报错 Invalid key length: 32 bytes 开发过程中用到3DES对敏感信息进行加密,秘钥用的是32位的,报出如下异常 Exception in thread "main" java.security.InvalidKeyException: Invalid key length: 32 bytes at com.sun.crypto.provider.DESedeCipher.engineGetKeySize(DESedeCip... 阅读详情
在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理。

1. 密钥长度问题

    默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误

Invalid AES key length

   你需要下载一个支持更长密钥的包。这个包叫做 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6,可以从这里下载,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

   下载之后,解压后,可以看到其中包含两个包:

    local_policy.jar

    US_export_policy.jar

    看一下你的 JRE 环境,将 JRE 环境中 lib\lib\security 中的同名包替换掉。

2. Base64 问题

     Apache 提供了 Base64 的实现,可以从这里下载。

    下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi

     编码

// 编码
String asB64 = new Base64().encodeToString("some string".getBytes("utf-8"));
System.out.println(asB64); // 输出为: c29tZSBzdHJpbmc=

     解码   

// 解码
byte[] asBytes = new Base64().getDecoder().decode("c29tZSBzdHJpbmc=");
System.out.println(new String(asBytes, "utf-8")); // 输出为: some string

 

     如果你已经使用 Java 8,那么就不需要再选用第三方的实现了,在 java.util 包中已经包含了 Base64 的处理。

     编码的方式

// 编码
String asB64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));
System.out.println(asB64); // 输出为: c29tZSBzdHJpbmc=

     解码处理

// 解码
byte[] asBytes = Base64.getDecoder().decode("c29tZSBzdHJpbmc=");
System.out.println(new String(asBytes, "utf-8")); // 输出为: some string

 

3. 关于 PKCS5 和 PKCS7 填充问题

PKCS #7 填充字符串由一个字节序列组成,每个字节填充该填充字节序列的长度。

假定块长度为 8,数据长度为 9,
          数据: FF FF FF FF FF FF FF FF FF
PKCS7 填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07

简单地说, PKCS5, PKCS7和SSL3, 以及CMS(Cryptographic Message Syntax)

有如下相同的特点:
1)填充的字节都是一个相同的字节
2)该字节的值,就是要填充的字节的个数

如果要填充8个字节,那么填充的字节的值就是0×8;
要填充7个字节,那么填入的值就是0×7;

如果只填充1个字节,那么填入的值就是0×1;

这种填充方法也叫PKCS5, 恰好8个字节时还要补8个字节的0×08

正是这种即使恰好是8个字节也需要再补充字节的规定,可以让解密的数据很确定无误的移除多余的字节。

 

在PKCS# Padding中说:

  1. 因为恢复的明文的最后一个字节 告诉你 存在多少个填充字节, 用PKCS#5 填充 的加密方法, 即使在输入的明文长度 恰好是 块大小(Block Size)整数倍 , 也会增加一个完整的填充块. 否则,恢复出来的明文的最后一个字节可能是实际的消息字节.
  2. 因为第1个因素限制了 使用PKCS#填充的 对称加密算法的 输入块大小(Block Size, 注意不是输入的明文的总长度 total input length), 最大只能是256个字节.   因为大多数对称块加密算法 通常使用8字节或者16字节的块, 所以,这不是一个问题
  3. 使用ECB模式填充可能会有安全问题.
  4. 使用PKCS#5填充 可以很方便地检测明文中的错误.

标准

PKCS #7: Cryptographic Message Syntax

在 10.3节中讲到了上面提到的填充算法,  对Block Size并没有做规定

PKCS #5: Password-Based Cryptography Specification

在6.1.1 中对 填充做了说明
但是因为该标准 只讨论了 8字节(64位) 块的加密, 对其他块大小没有做说明
其 填充算法跟 PKCS7是一样的

后来 AES 等算法, 把BlockSize扩充到 16个字节

比如, Java中
Cipher.getInstance(“AES/CBC/PKCS5Padding”)
这个加密模式
跟C#中的
RijndaelManaged cipher = new RijndaelManaged();
cipher.KeySize = 128;
cipher.BlockSize = 128;
cipher.Mode = CipherMode.CBC;
cipher.Padding = PaddingMode.PKCS7;
的加密模式是一样的

因为AES并没有64位的块, 如果采用PKCS5, 那么实质上就是采用PKCS7

转自:http://www.cnblogs.com/haogj/p/4226178.html

http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html


AES解密报错Invalid AES key length: xx bytes与Given final block not properly padded的解决方法 最近和其它系统联调接口,用到了JavaAES加解密。由其它系统AES加密,本人的系统获取到加密报文后,AES解密,获取到内容。本来是比较简单的,可是其它系统只提供了秘钥,没有提供解密方法,解密方法需要我们自己写……还好最后都解决了,在此记录下。 阅读详情

相关推荐

Android HWC硬件合成器实战:从SurfaceFlinger到显示驱动的完整流程解析

本文深入解析Android HWC硬件合成器从SurfaceFlinger到显示驱动的完整流程,揭示HWC如何优化图形性能并降低功耗。通过实战案例和调试技巧,帮助开发者掌握硬件加速的图层混合技术,提升移动设备的显示效率。

gaochao的博客 475

Invalid AES key length: 33 bytes

Invalid AES key length: 33 bytes

lierjun 的专栏 1425

【GAN】pytorch-CycleGAN-and-pix2pix开源项目训练自定义数据集

Github:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix 一、概念简介 图像转换:将一张图片转换为不同风格的图片,如将一张灰度图变成彩色图,素描图换成实物图。 pix2pix:需要成对的数据集,两个不同域的图像一一对应。 CycleGAN:不需要成对的数据集,只用两个不同域(domain)的图像集合X和Y,两个集合中的图像不是一一对应的。 二、训练pix2pix模型 2.1 combine_A_and_B datasets/combin

See_Star的博客 4732

2021-02-03

AES加密时的 java.security.InvalidKeyException: Invalid AES key length: 432 bytes 异常 如果密钥大于128, 在执行红色框框的地方会报:java.security.InvalidKeyException: Invalid AES key length: 432 bytes。因为密钥长度是受限制的, java运行时环境读到的是受限的policy文件. 文件位于${java_home}/jre/lib/security, 这种限制是因

skvmeimei的博客 425

java aes oracle aes_Java 环境使用 AES 加密特殊问题处理

Java 环境使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊处理。1. 密钥长度问题默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误Invalid AES key length你需要下载一个支持更长密钥的包。这个包叫做 Java Cryptography Extension (JCE) Unlimited Strength Jurisd...

weixin_35709128的博客 298

java aes锁等待_Java 环境使用 AES 加密特殊问题处理

Java 环境使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊处理。1. 密钥长度问题默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误Invalid AES key length你需要下载一个支持更长密钥的包。这个包叫做 Java Cryptography Extension (JCE) Unlimited Strength Jurisd...

weixin_39935571的博客 226

AES算法加解密:java.security.InvalidKeyException: Illegal key size

1.问题描述 (1)AES算法加解密的一个错误:java.security.InvalidKeyException: Illegal key size (2)本地没有报这个错误,代码推到线上,就出现这个异常 2.解决思路 (1)首先,百度之后,解决方案也很多 如java.security.InvalidKeyException: Illegal key size等,按照提...

腊八粥 1066

AES解密报错java.security.InvalidKeyException: Invalid AES key length: xx bytes

由于与其它系统接口对接,需要进行加密处理。对接系统采用AES加密方式,作为接收方获取加密内容,通过AES解密拿到数据。

liduanzhi_1030的博客 5755

Invalid AES key length: 13 bytes

这个错误信息表明你使用AES密钥长度是13个字节,但是AES密钥长度应该是128位,192位或256位,也就是16个字节,24个字节或32个字节.你需要使用正确长度的密钥来解密或加密数据. ...

weixin_42588555的博客 1501

java aes128加密解密_java AES 128 位加密解密算法

最近在做app后台的服务器,使用AES加密解密算法,无奈网上的都不符合要求,于是自己借鉴着写了一个AES加密解密工具。密钥长度问题默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误Invalid AES key length你需要下载一个支持更长密钥的包。这个包叫做 JavaCryptography Extension (JCE) Unlimited St...

weixin_40007515的博客 1193

解决AES加密报错:java.security.InvalidKeyException: Invalid AES key length: xx bytes

网上还没一个说到这种问题,这个BUG非常隐秘,加密端没有这个"\n"换行符,而解密端有这个换行符"\n",也就是这个导致的密钥长度异常。 在加载AES密钥时对其进行处理,替换掉“\n”。

ikun 的博客 1万+

Shiro CookieRememberMeManager Invalid AES key length

================================ ©Copyright 蕃薯耀 2022-04-16 蕃薯耀的博客_CSDN博客 一、问题描述 CookieRememberMeManager使用加密setCipherKey报错: Caused by: java.security.InvalidKeyException: Invalid AES key length: 10 bytes at com.sun.crypto.provider.AESCipher.engineG.

蕃薯耀的博客 2173

OFDM 系统PAPR减小的三种经典方法

减小OFDM系统PAPR的三种经典方法。

上一篇: Eclipse用法和技巧二十一:工程的展示途径
下一篇: eclipse maven工程注意
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值