AES/GCM/NoPadding分组加密不填充的对称加密算法 + RSA非对称加密。数据加密、传输加密

文章目录

简介

RSA其实是非对称加密的一种,它可以生成一个公钥和私钥,使用RSA+公钥加密的数据,可以使用RSA+私钥进行解密。这就是非对称加密的一种。我们可以获取请求方的公钥,再用RSA+对方公钥进行数据加密,再把数据返回给请求方,请求方拿到数据后,用自己手上的私钥进行解密,而且只有公钥对应的私钥才能解开加密。这是非常安全的一种数据方式。在JAVA里,我们使用RSA实现。

虽然RSA的非对称加密比对称加密的方式要更安全,但是非对称加密的开销更大,特别是数据量大的时候对性能的影响比较大。在java中,我们不会直接就使用RSA对数据进行加密;而是配合对称加密算法一起使用,对称加密我打算使用AES加密算法,至于为什么选择使用AES,请看下方。


AES优先使用 AES/GCM/NoPadding模式,以下是来自SonarLint的提示:
sonarLint AES提示
具体翻译是:

要进行安全加密,操作模式和填充方案是必须的,并应根据加密算法正确使用:
对于分组密码加密算法(如AES),建议使用GCM (Galois计数器模式)模式,该模式在内部使用零/无填充模式。相反,这些模式和/或方案是非常不受欢迎的:
电子密码本(ECB)模式很容易受到攻击,因为它没有提供严格的消息机密性:在给定密钥下,任何给定的明文块总是被加密到相同的密文块。
带有PKCS#5填充(或PKCS#7)的密码块链接(CBC)容易受到填充oracle攻击。
RSA加密算法应与推荐的填充方案(OAEP)一起使用

所以在AES中选中使用 GCM模式/并且无填充,来实现数据加密。


那问题来了,我们该使用RSA+AES对数据实现加密呢?下面我来简单的介绍一下该怎么使用RSA+AES实现数据传输加密:

  1. A 用户使用RSA生成公钥和私钥
  2. B 用户使用RSA生成公钥和私钥
  3. A用户 和 B用户 交换对方的公钥
  4. A 用户生成一个Key,使用AES+key对数据进行加密
  5. A 用户使用RSA+B公钥对key进行加密,得到一个加密key(enKey)
  6. A 用户把 加密数据 + enKey传送给 B用户
  7. B 用户接收数据
  8. B 用户使用RSA+自己的私钥解密enKey,得到key
  9. B 用户使用AES+key对加密数据进行解密,得到明文数据

以上就是数据传输加密的实现思路。RSA的性能开销要比AES大的多,所以都是使用RSA来加密AES的加密key,数据加密实质上还是使用AES去完成。更多相关的内容请查阅更专业的书籍及资料。以下就是我封装的AES和RSA的加密类,可以直接拿来用,如果有什么不足,请大佬留言告知,我进行改进。

AesGcmUtil

import lombok.extern.slf4j.Slf4j;

import javax.crypto.*;
import javax.crypto.spec.GCMParameterSpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;

/**
 * AES对称加密
 * GCM模式
 * NoPadding不填充
 *
 * @author a_fig 1024083717@qq.com
 * @version V0.1
 * @className EncryptAES
 * @date 2020/5/12
 */
@Slf4j
public class AesGcmUtil {
   
    /**
     * AES 加密算法
     *
     * @author a_fig 1024083717@qq.com
     * @date 2020/5/13 11:27
     */
    private static final String AES = "AES";

    /**
     * 指定加解密需要使用的 算法/模式/填充
     * 以下指: 使用AES算法 / GCM分组加密模式 / 不填充
     *
     * @author a_fig 1024083717@qq.com
     * @date 2020/5/13 11:31
     */
    private static final String AES_CIPHER_GCM_NO_PADDING = "AES/GCM/NoPadding";

    private AesGcmUtil() {
   
    }

    /**
     * 初始化AES的GCM模式 加密/解密 操作器
     *
     * @param content 内容
     * @param initKey 初始key
     * @param modes 加密/解密 操作类型
     * @return java.lang.String
     * @author a_fig 1024083717@qq.com
     * @date 2020/5/13 11:24
     */
    private static byte[] init(byte[] content, byte[] initKey, int modes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
   
        
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值