Java 加密算法笔记

Aes算法

AES支持五种模式:CBC,CFB,ECB,OFB,PCBC

jce中实现了三种补码方式:NoPadding,PKCS5Padding,ISO10126Padding;不支持SSL3Padding,不支持“NONE”模式。

ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。
CFB/OFB实际上是一种反馈模式,目的也是增强破解的难度。
ECB和CBC的加密结果是不一样的,两者的模式不同,而且CBC会在第一个密码块运算时加入一个初始化向量。

算法/模式/填充              16字节加密后数据长度            不满16字节加密后长度

AES/CBC/NoPadding           16                              不支持
AES/CBC/PKCS5Padding        32                              16
AES/CBC/ISO10126Padding     32                              16
AES/CFB/NoPadding           16                              原始数据长度
AES/CFB/PKCS5Padding        32                              16
AES/CFB/ISO10126Padding     32                              16
AES/ECB/NoPadding           16                              不支持
AES/ECB/PKCS5Padding        32                              16
AES/ECB/ISO10126Padding     32                              16
AES/OFB/NoPadding           16                              原始数据长度
AES/OFB/PKCS5Padding        32                              16
AES/OFB/ISO10126Padding     32                              16
AES/PCBC/NoPadding          16                              不支持
AES/PCBC/PKCS5Padding       32                              16
AES/PCBC/ISO10126Padding    32                              16
  • PCBC,CBC需要加入IvParameterSpec
IvParameterSpec ivspec = new IvParameterSpec("1234567812345678".getBytes());
cipher.init(Cipher.DECRYPT_MODE, key, ivspec);

Rsa算法

由于Rsa算法对加密的数据的最大长度存在限制,所以在加密过大的数据中需要采用分段加密的策略。
具体限制如下:

  /*
    Java 默认的 RSA 加密实现不允许明文长度超过密钥长度减去 11(单位是字节,也就是 byte)。也就是说,如果我们定义的密钥(我们可以通过 java.security.KeyPairGenerator.initialize(int keysize) 来定义密钥长度)
    长度为 1024(单位是位,也就是 bit),生成的密钥长度就是 1024位 / 8位/字节 = 128字节,那么我们需要加密的明文长度不能超过 128字节 - 11 字节 = 117字节。
    也就是说,我们最大能将 117 字节长度的明文进行加密,否则会出问题(抛诸如 javax.crypto.IllegalBlockSizeException: Data must not be longer than 53 bytes 的异常)。
    */
    private static final int KEY_SIZE = 2048;

    /* RSA最大加密明文大小 */
    private static final int MAX_ENCRYPT_BLOCK = KEY_SIZE / 8 - 11;

    /* RSA最大解密密文大小 */
    private static final int MAX_DECRYPT_BLOCK = KEY_SIZE / 8;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值