AEAD加密算法Java实现

这篇具有很好参考价值的文章主要介绍了AEAD加密算法Java实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、什么是认证加密?

二、什么是带关联数据的认证加密?

认证加密

认证解密

常用AEAD算法 

三、AEAD_AES_256_GCM加解密Java实现


一、什么是认证加密?

在消息的传递过程中,既要保持数据的机密性,也要保持数据的完整性。机密性可以依靠信息加密来解决,完整性可以通过消息验证码来检查。Authenticated Encryption (AE,认证加密) 就是这样一种同时解决数据的机密性和完整性的方法。 

常用的3种加密和验证组合方案

方案 描述 典型应用
加密后验证

生成两个密钥:加密密钥和MAC密钥

使用加密密钥,加密明文数据,得到密文数据;

使用MAC密钥,计算密文数据的消息验证码;

输出:密文数据和验证码。

IPSec协议
验证后加密

生成两个密钥:MAC密钥和加密密钥

使用MAC密钥,计算明文数据的消息验证码;

使用加密密钥,加密明文数据和验证码,得到密文数据;

输出:密文数据。

SSL协议
加密并验证

生成两个密钥:加密密钥和MAC密钥

使用加密密钥,加密明文数据,得到密文数据;

使用MAC密钥,计算明文数据的消息验证码;

输出:密文数据和验证码

SSH协议

虽然这些方法有重要协议的支持,但并不意味着它们就是安全的。这些通过组合加密和认证算法的方案存在一些安全问题。相对来说,“加密后验证”方案的安全性要高一些。

二、什么是带关联数据的认证加密?

RFC5116中定义,Authenticated Encryption with Associated Data (AEAD) 加入了对关联数据的完整性、真实性的检查。

Authenticated Encryption with Associated Data, or AEAD [R02], adds the ability to check the integrity and authenticity of some Associated Data (AD), also called "additional authenticated data", that is not encrypted.

AEAD算法作为单一密码算法,可以替代加密算法和验证算法,提供多种安全服务。它包括两种操作:认证加密、认证解密。

认证加密

输入

明文数据

密钥:密钥不得包含在任何其他输入中

仅使用一次的任意或非重复的随机数值

关联数据

输出

密文数据 或 提示:请求的加密操作不能执行

认证解密

输入

密文数据

密钥:密钥不得包含在任何其他输入中

仅使用一次的任意或非重复的随机数值

关联数据

输出

明文数据 或 失败标识符FAIL 

常用AEAD算法 

AEAD_AES_GCM

Advanced Encryption Standard (AES) algorithm in Galois Counter Mode (GCM)

基于AES 算法GCM模式,根据密钥长度,可分为:AEAD_AES_128_GCM、AEAD_AES_256_GCM等。

AEAD_AES_CCM

Advanced Encryption Standard (AES) algorithm in Counter and CBC MAC Mode (CCM): 基于AES算法CCM模式,根据密钥长度,可分为:AEAD_AES_128_CCM、AEAD_AES_256_CCM等。

三、AEAD_AES_256_GCM加解密Java实现

Java 实现

import org.apache.commons.codec.binary.Base64;

import javax.crypto.*;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;

public class AEADTest {

    //字节数组转换成十六进制字符串
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
   
    //加密函数
    public static byte[] encrypt(byte[] plainText, SecretKey key, byte[] nonce, byte[] AAD) throws Exception {
        Cipher cipher = Cipher.getInstance(CIPHER_TRANSFORM);
        SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), ALGORITHM_AES);
        GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, nonce);
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, gcmParameterSpec);
        cipher.updateAAD(AAD);
        byte[] cipherText = cipher.doFinal(plainText);
        return cipherText;
    }

    //解密函数
    public static byte[] decrypt(byte[] cipherText, SecretKey key, byte[] nonce, byte[] AAD) throws Exception{
        Cipher cipher = Cipher.getInstance(CIPHER_TRANSFORM);
        SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), ALGORITHM_AES);
        GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, nonce);
        cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmParameterSpec);
        cipher.updateAAD(AAD);
        byte[] plainText = cipher.doFinal(cipherText);
        return plainText;
    }

    public static void main(String[] args) {
        try {
            String originalText = "Plain text to be encrypted by AEAD-AES-256-GCM in Java";
            String AADTest = "Associated Data";
            KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM_AES);
            keyGenerator.init(AES_KEY_SIZE);
            SecretKey key = keyGenerator.generateKey();
            System.out.println(String.format("Generated key: " + Base64.encodeBase64String(key.getEncoded())));

            byte[] nonce = new byte[GCM_IV_LENGTH];
            SecureRandom sRandom = new SecureRandom();
            sRandom.nextBytes(nonce);

            System.out.println("Original Text:  " + originalText);
            byte[] cipherText = encrypt(originalText.getBytes(), key, nonce, AADTest.getBytes());
            System.out.println("Encrypted Text: " + bytesToHex(cipherText));

            byte[] plainText = decrypt(cipherText, key, nonce, AADTest.getBytes());
            System.out.println("Decrypted Text: " + new String(plainText));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static final int GCM_TAG_LENGTH = 16;
    public static final int AES_KEY_SIZE = 256;
    public static final int GCM_IV_LENGTH = 12;
    public static final String CIPHER_TRANSFORM = "AES/GCM/NoPadding";
    public static final String ALGORITHM_AES = "AES";
}

生成256位的密钥。从 Java 版本 8u151 开始,JRE 提供了无限和有限强度策略文件。如果使用的版本是8u151 之前的,需要先安装JCE 无限强度策略文件。

KeyGenerator keyGenerator = KeyGenerator.getInstance(“AES”);
keyGenerator.init( 256);
SecretKey key = keyGenerator.generateKey();

从版本8u151开始,JAVE_HOME\jre\lib\security\policy目录下有两个子目录,分别存放不同强度策略文件。

AEAD加密算法Java实现

测试结果

AEAD加密算法Java实现文章来源地址https://www.toymoban.com/news/detail-451487.html

到了这里,关于AEAD加密算法Java实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Misty1算法的加密软件(Java)的实现

    现代密码学是一门迅速发展的应用科学。随着因特网的迅速普及,人们依靠它传送大量的信息,但是这些信息在网络上的传输都是公开的。因此,对于关系到个人利益的信息必须经过加密之后才可以在网上传送,这将离不开现代密码技术。 Misty1算法是在1996年公布的,它是一

    2023年04月08日
    浏览(31)
  • 基于JAVA的RC4加密解密算法循环实现

           RC4算法是一种对称加密算法,所谓对称加密,就是加密和解密的过程是一样的,加密和解密均采用同一把密钥。RC4算法的特点是算法简单,执行速度快安全性比较高并且密钥长度是可变的,可变范围为1-256字节(8-2048比特)。让它如此广泛分布和使用的主要因素是它不可

    2024年02月04日
    浏览(55)
  • 从加密到签名:如何使用Java实现高效、安全的RSA加解密算法?

    目录 1. 接下来让小编给您们编写实现代码!请躺好 ☺ 1.1 配置application.yml文件 1.2 RSA算法签名工具类 1.3  RSA算法生成签名以及效验签名测试 1.4 RSA算法生成公钥私钥、加密、解密工具类 1.5 RSA算法加解密测试 我们为什么要使用RSA算法来进行加解密?  RSA 加密算法是一种非对

    2024年02月12日
    浏览(55)
  • java运用SM4国密算法对文件的加密与解密的实现

    首先我们在idae开发工具导入导入pom.xml的两个必要依赖  jar包下载地址:百度网盘 请输入提取码   npn8  图上systemPath 为jar包的文件路径,我们需要使用以下的路径存储jar包。(也可以自己设置) java包的文件路径如图所示 然后创建所需要加密的文件 ,需要加密的文件内容,

    2024年03月27日
    浏览(54)
  • 259.【华为OD机试真题】特殊的加密算法(深度优先搜索(DFS)-Java&Python&C++&JS实现)

    🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(JavaPythonC++JS分别实现),详细代码讲解,助你深入学习,深度掌握!

    2024年02月21日
    浏览(54)
  • 基于des双重加密算法的安全web电子邮件系统的设计与实现(论文+源码)_java_285

    摘要 本文首先研究并介绍国内外目前的背景和现状,在此基础上给出论文的主要研究内容,其次,对双重加密算法的电子邮件系统的需求进行了分析。再次,对双重加密算法的电子邮件系统进行了总体设计,根据其总体设计、软件架构和总体功能模块进行了详细设计,作出了

    2024年02月04日
    浏览(58)
  • 使用 Java Bouncy Castle实现国密算法SM4、SM3以及SM2的加密

    国密算法的实现借助了Java库函数 Bouncy Castle,加密库安装使用教程请参考链接 SM4,又称为商密算法,是一种分组密码算法,于2012年由中国密码技术研究中心(中国密码学会成员)发布,目前已成为我国国家密码算法,并在多个领域得到了广泛的应用。SM4算法采用了32轮迭代结

    2024年02月16日
    浏览(68)
  • 利用python实现Apriori关联规则算法

            大家可能听说过用于宣传数据挖掘的一个案例:啤酒和尿布;据说是沃尔玛超市在分析顾客的购买记录时,发现许多客户购买啤酒的同时也会购买婴儿尿布,于是超市调整了啤酒和尿布的货架摆放,让这两个品类摆放在一起;结果这两个品类的销量都有明显的增长

    2024年02月02日
    浏览(59)
  • 关联规则及其Apriori算法实现(MATLAB)

    你是否有过这样的经历:在刷抖音的时候,总是容易刷到自己比较感兴趣的领域,比如说你喜欢玩游戏、看电影、看美女,那么你刷到的视频往往就在这几个之间徘徊;当你进入淘宝、京东想看点东西的时候,你想买的东西正好在搜索框的推荐项;当你QQ音乐的喜欢里有《稻

    2024年02月04日
    浏览(46)
  • C# 实现对称加密算法(AES)与非对称加密算法(RSA),包含前端加密对应算法实现

    一种既简单速度又快的加密方式,加密与解密使用的都是同一个密钥,别名又叫做:单密钥加密;对称加密有很多公开算法,并且因为它效率很高,所以适用于加密大量数据的场合;但其密钥的传输过程是不安全的,并且容易被破解,密钥管理起来也相对麻烦。 需要两个密钥

    2024年02月09日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包