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

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

  1. java 安卓客户端开发_《安卓网络编程》之第一篇 java环境下模拟客户端、服务器端...

    1.Socket简介 在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个 ...

  2. Java环境下GDAL / OGR环境配置与入门

    Java环境下GDAL / OGR环境配置与入门 0.概述 1.环境配置 1.1 开发环境下载 1.2 环境变量配置 1.3java工程配置 1.3.1新建Java工程 1.3.2添加GDAL的jar ...

  3. java实现RSA和AES加密(一)

    java实现RSA和AES加密(一) 由于公司要求接口安全升级,从自定义防篡改数据MD5加密验证,到使用RSA加密. 原始的MD5防数据篡改的方式: 将所有参数拼接起来,然后在某一字节后加入自定义的字 ...

  4. Java微服务开发指南 -- Java环境下的微服务

    Java环境下的微服务 本文涉及的内容,能让你学到什么? 本书适用于开发微服务的Java开发人员和架构师.我们在开始介绍微服务架构前,先讲述一些抽象的基本概念.不幸的是,使用新技术并不能神奇地解决分布 ...

  5. java实现双向RSA + AES加密

    本文主要讲解在APP上如何实现双向RSA + AES加密. 先上一张主要流程图: 场景预设: 由于客户端是APP而不是网页,APP在第一次加载的时候会生成一对RSA秘钥对(我们称它为APP公钥私钥,不 ...

  6. android开发 java与c# 兼容AES加密

    由于android客户端采用的是AES加密,服务器用的是asp.net(c#),所以就造成了不一致的加密与解密问题,下面就贴出代码,已经试验过. using System; using System. ...

  7. sqlcipher java_纯java环境下sqlsqlcipher解密sqlite数据库文件

    由于工作需要,最近一周以来研究sqlite数据库文件的解密方法.最终采用sqlcipher工具进行解密.由于sqlcipher的实现大多是支持android的,修改为纯java平台下的代码有难度,因此 ...

  8. JAVA调用 keras,在TensorFlow(Python, Java)环境下使用Keras模型

    Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行.Keras 的开发重点是支持快速的实验.有时候我们在使用 ...

  9. Java环境下运行fastqc_在Ubuntu上安装FastQC

    一. 什么是FastQC. FastQC是一款基于Java的软件,一般都是在linux环境下使用命令行运行,它可以快速多线程地对测序数据进行质量评估.因为是一个Java软件,下载后可以直接使用,但是需 ...

最新文章

  1. c语言int64编译时错误,错误:编译C程序时未在此作用域中声明uint64_t
  2. 2019年上半年收集到的人工智能迁移学习干货文章
  3. python输出数据到excel-使用python将大量数据导出到Excel中的小技巧分享
  4. python asyncio和celery对比_如何将Celery与asyncio结合? - python
  5. Spring - bean的lazy-init属性(懒加载)
  6. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...
  7. guido python正式发布年份_Python语言适合哪些领域的计算问题? (1.3分)_学小易找答案...
  8. html文档包包含几个基本标记,HTML中包含哪些基本的标记?
  9. C++socket编程(五):5.1 创建tcpclient项目
  10. Node.js格式化输出json文件
  11. 元进Python(3)---如何实现IP子网掩码计算器功能?
  12. coreldraw怎样定数等分_CorelDRAW基础教程,教你cdr如何等分分割图片
  13. 制定目标时需要遵循的SMART原则
  14. python -- 计算 平方、乘方、平方根_Python中math模块进行数学运算的示例
  15. 制作PPT怎样设计图片才有观赏性
  16. MyEclipse中常用的查找快捷键
  17. 语法树的Java代码自动化插桩
  18. PHP的环境安装基本的配置
  19. 支持国产ARM64架构部署,支持使用rz、sz命令上传下载文件,JumpServer堡垒机v2.12.0发布
  20. 用CH340给STM32C8T6和野火stm32F103Mini板下载程序需要注意的三个问题

热门文章

  1. 超详细!!!STM32F407ZGT6HAL库移植STemwin(基于正点原子最小系统板+GUIBuilder)
  2. javaee实训报告总结_JavaEE实训报告.doc
  3. C语言写三阶矩阵的转置
  4. 小程序博客(云开发)
  5. 解决mysql导入数据库编码格式不同问题。
  6. 不看公式自己复原魔方
  7. 写好CSS代码的70个专业建议-前端开发博客
  8. HTML身份证号校验及根据身份证号获取出生日期/性别
  9. 网络安全基础:公钥密码体制
  10. mysql中的表自增的id太大了,可以重新设置自增起始值