java的aes加密成多少位数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的aes加密成多少位数相关的知识,希望对你有一定的参考价值。
深圳远标帮你:1.默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误
Invalid AES key length
你需要下载一个支持更长密钥的包。这个包叫做 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6
看一下你的 JRE 环境,将 JRE 环境中 lib\lib\security 中的同名包替换掉。
2. Base64 问题
// 编码
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个字节也需要再补充字节的规定,可以让解密的数据很确定无误的移除多余的字节。
比如, 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 参考技术A 这篇文章有详细的AES算法的使用讲解,希望可以帮助到你,https://blog.csdn.net/xingkong_hdc/article/details/79413462
AES加密算法
背景
开发中需要进行异构平台的数据通信,用到了AES加密。但是,AES加密涉及几个参数,不是简单的输入源数据和密码就可以得到结果。跨平台联合调试的时候,基本上都会碰到这个问题。
一、AES加密
AES和DES是常见的对称加密算法。
二、遇到的问题
理解误区:以为使用相同的密码进行加密,就能在不同平台上得到同样的结果。
三、AES的参数
本文的AES实现,默认指的是Rijndael。
- key length(密钥位数,密码长度)
- key (密钥,密码)
- IV (向量)
- mode (加密模式)
- padding (填充方式)
异构系统通信的时候,必然会遇到这个问题。c、c++、lua、csharp、java、php、go、python这些语言自带或者依赖的第三方AES库,都可能默认使用不同的参数。所以,异构系统使用aes进行通信,必须首先确保上面的五个参数是一模一样的。
四、参数的意义
- key length(密钥位数,密码长度)
AES128,AES192,AES256(128 位、192 位或 256 位)
128位对应的是16个字节,所以部分平台库上,会使用16个字符或者长度为16的字符串来做密码。 - key (密钥,密码)
key指的就是密码了,AES128就是128位的,如果位数不够,某些库可能会自动填充到128。 - IV (向量)
IV称为初始向量,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV。 - mode (加密模式)
AES分为几种模式,比如ECB,CBC,CFB等等,这些模式除了ECB由于没有使用IV而不太安全,其他模式差别并没有太明显。 - padding (填充方式)
对于加密解密两端需要使用同一的PADDING模式,大部分PADDING模式为PKCS5, PKCS7, NOPADDING。
以上是关于java的aes加密成多少位数的主要内容,如果未能解决你的问题,请参考以下文章