AES-GCM模式代码演示
对称加密与加密模式相关API
代码演示
GCMAes
package com.deepway.cryptology;import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.GCMParameterSpec;
import java.security.*;/*** AES-GCM * @author huyanbing* @create 2022/12/18 1:40 下午*/
public class GCMAes extends BaseCipher {// AES-GCM parameters/*** The length in bytes of IV* ivLen>=1* But 96-bit IV values is recommended*/// 12 bytesprivate static final int GCM_NONCE_LENGTH = 96 >> 3;/*** The length* in bits* of Tag <code>T</code>;* tLen must* be one of {* 128, 120, 112, 104, 96* }* <p>* GCM tag 长度 我们一般取最长 128 也是比较推荐的*/private static final int GCM_TAG_LENGTH = 128;// 16 bytesprivate Cipher cipher;//GCM的 IV 比较特殊private GCMParameterSpec iv;/*** 构造函数** @param keyLen* @param plainKey*/public GCMAes(int keyLen, byte[] plainKey) {super(keyLen, plainKey);}/*** 初始化** @param mode* @param nonce* @throws GeneralSecurityException*/public void initialize(int mode, byte[] nonce) throws GeneralSecurityException {//如果用户没有给 nonce随机数的值,就自己生产初始化的随机值if (nonce == null) {nonce = new byte[GCM_NONCE_LENGTH];new SecureRandom().nextBytes(nonce);}//构造GCMParameterSpec//一个是 tag 长度 ,一个是初始化向量随机数 nonce 然后构成出IV//GCM模式只能使用GCMParameterSpeciv = new GCMParameterSpec(GCM_TAG_LENGTH, nonce);try {this.cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING");//3-args 初始化 三个参数 mode(加密模式、解密模式) key:密钥 iv:初始向量this.cipher.init(mode, key, iv);} catch (Exception e) {e.printStackTrace();}}/*** 加密* <p>* <p>* 两个参数 Input 消息本体* aad 附加认证数据 aad 数据** @param input* @param aad* @return* @throws Exception*/public byte[] encrypt(byte[] input, byte[] aad) throws Exception {//first aadif (aad != null) {//如果有aad 认证数据,需要先添加aad认证数据,然后才能加密消息本体数据cipher.updateAAD(aad);}// cipher.update(input);//如果 input 很小,直接调用cipher.doFinal(input) 就可以了//jdk9 返回的 gcm->cipher-text,Tag 两个值 一个是加密密文,一个是认证的 128位的tagreturn cipher.doFinal(input);}public static void main(String[] args) throws Exception {byte[] plainText = "Hello AES-GCM ..11111111111111111111".getBytes();System.out.println("GCM plaintText:");System.out.println(new String(plainText));byte[] aad = "My name is Bob".getBytes();GCMAes gcmAlice = new GCMAes(128, null);gcmAlice.initialize(Cipher.ENCRYPT_MODE, null);byte[] cipherText = gcmAlice.encrypt(plainText, aad);System.out.println("GCM cipher:");System.out.println(HexCustomUtil.bytes2hex(cipherText));
//
// {
// //for RPC ,serializing,persistence
// new Object() {
// byte[] aad;
// byte[] iv;
// byte[] cipherText;
// };
// }GCMAes gcmBob = new GCMAes(128, gcmAlice.exportKey());gcmBob.initialize(Cipher.DECRYPT_MODE, gcmAlice.iv.getIV());byte[] plainText2 = gcmBob.encrypt(cipherText, aad);System.out.println("GCM plaintText:");System.out.println(new String(plainText2));}}
BaseCipher
package com.deepway.cryptology;import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;/*** @author huyanbing* @create 2022/12/17 6:44 下午*/
public class BaseCipher {private final int keyLen;protected final SecretKey key;private String algorithm = "AES";/*** 构造函数** @param keyLen* @param plainKey*/public BaseCipher(int keyLen, byte[] plainKey) {//验证密钥长度是不是合规的assert keyLen == 128 || keyLen == 192 || keyLen == 256;this.keyLen = keyLen;if (plainKey == null) {key = generateKey();} else {key = importKey(plainKey);}}/*** 生成默认密钥** @return*/public SecretKey generateKey() {try {//静态工厂模式KeyGenerator keyGen = KeyGenerator.getInstance(algorithm);keyGen.init(keyLen);SecretKey key = keyGen.generateKey();return key;} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}}/*** 导出密钥** @return*/public byte[] exportKey() {return key.getEncoded();}/*** 导入密钥** @param plainKey* @return*/public SecretKey importKey(byte[] plainKey) {//=> keyLen/8assert plainKey.length == keyLen >> 3;return new SecretKeySpec(plainKey, algorithm);}}
package com.deepway.cryptology;/*** @author huyanbing* @create 2022/12/16 3:29 下午*/
public class HexCustomUtil {/*输入16进制byte[]输出16进制字符串*/public static String byteArrayToHexStr(byte[] byteArray) {if (byteArray == null) {return null;}char[] hexArray = "0123456789ABCDEF".toCharArray();char[] hexChars = new char[byteArray.length * 2];for (int j = 0; j < byteArray.length; j++) {int v = byteArray[j] & 0xFF;hexChars[j * 2] = hexArray[v >>> 4];hexChars[j * 2 + 1] = hexArray[v & 0x0F];}return new String(hexChars);}public static String bytes2hex(byte[] bytes) {StringBuilder sb = new StringBuilder();String tmp;sb.append("[");for (byte b : bytes) {// 将每个字节与0xFF进行与运算,然后转化为10进制,然后借助于Integer再转化为16进制tmp = Integer.toHexString(0xFF & b);if (tmp.length() == 1) {tmp = "0" + tmp;//只有一位的前面补个0}sb.append(tmp).append(" ");//每个字节用空格断开}sb.delete(sb.length() - 1, sb.length());//删除最后一个字节后面对于的空格sb.append("]");return sb.toString();}}
http://www.taodudu.cc/news/show-6349855.html
相关文章:
- GCM加密
- java与go对接AES-GCM加解密
- GCM 的升级版——FCM(firebase cloud messaging)
- AES-GCM算法 Java与Python互相加解密
- AES-GCM加密算法的简单介绍
- Android GCM使用
- GCM入门
- GCM与CCM的的规格和加解密过程
- google的GCM推送使用简介
- 什么是 AES-GCM加密算法
- GCM Google官方示例的简单介绍和使用
- 【密码算法 之七】GCM 浅析
- 使用 GCM 网络管理工具优化电池使用
- nntool
- STTN
- nat-t
- nt
- NTP for Linux
- ntopng
- NAT-T技术
- Electron 入门,主进程向渲染进程发送事件,渲染进程向主进程发送事件
- DNAT
- NIT
- nntp协议
- Qt使用三点坐标画圆弧
- C++通过三点坐标,获取夹角
- 这两个月——我的学习Python学习之路
- LeetCode 587. 安装栅栏【凸包算法】【C++】【很多坑】
- MATLAB 平面线形变换 及验证多个点是否在同一直线
- 井字游戏(shell高级版)
AES-GCM模式代码演示相关推荐
- C++ Openssl AES GCM 128bits代码示例,可wins10的visual studio 2017 中直接运行
C++ Openssl AES GCM 128bits代码示例,可wins直接运行 使用vcpkg安装64bits的openssl,本人当前的openssl为openssl-1.1.1d版本,wins ...
- 对称加密算法AES之GCM模式简介及在OpenSSL中使用举例
AES(Advanced Encryption Standard)即高级加密标准,由美国国家标准和技术协会(NIST)于2000年公布,它是一种对称加密算法.关于AES的更多介绍可以参考:https: ...
- 原型模式【浅克隆实现,使用序列化实现深克隆】Java代码演示
文章目录 原型模式 浅克隆 深克隆(使用序列化) 原型模式 原型模式(Prototype) 的定义如下: 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象. 在这里, ...
- Java设计模式的代码演示(结构型模式一)
目录 写在前面 一.适配器模式 1.1. 类适配器模式 1.2. 对象适配器模式 二.桥接模式 三.装饰器模式 写在前面 上一篇我们学习了创建型设计模式 本篇文章通过代码演示的形式,记录结构型设计模式 ...
- ecb gcm java 加密,AES GCM和ECB加密软件,附算法源码和工程文件
[实例简介] AesTestTool为加密软件,支持GCM 和 ECB两种模式 128bit秘钥 GCM算法是一个C++工程,"C++gcm算法工程"目录里面有源码 加密软件是用C ...
- AES GCM算法实现
当前业界敏感信息加密使用AES较多,GCM模式兼具效率和安全性,故选择使用该模式. 注意 我们经常使用256位秘钥,因为美国的安全管控,jdk8的较老版本安全策略不支持256位秘钥,需替换jdk\jr ...
- 使用Crypto++的AES GCM对称加密
这里记录使用Crypto++的AES GCM对称加密的代码片段,可直接执行 运行环境:Windows, Visual Studio 2017 需安装Crypto++库,可使用cvpkg工具直接集成该库 ...
- 代码演示C#各版本新功能
代码演示C#各版本新功能 C#各版本新功能其实都能在官网搜到,但很少有人整理在一起,并通过非常简短的代码将每个新特性演示出来. 代码演示C#各版本新功能 C# 2.0版 - 2005 泛型 分部类型 ...
- Python Web框架Tornado的异步处理代码演示样例
1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口 ...
最新文章
- pwm一个时间单位_RK3308——RGB调色灯三路PWM驱动
- 剑桥MPhil Industrial Systems, Manufacture and Management录取率
- c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。...
- MapReduce简介
- 用GZIP来压缩socket传输的序列化的类
- new运算符与malloc函数区别
- 低照度图像修复方法总结
- 【论文笔记】A Convolutional Neural Network Cascade for Face Detection
- JAVA interface报错:abstract methods do not specify a body
- 洛谷 P3951 小凯的疑惑
- 三维空间中判断射线与平面是否相交
- 网络安全DOS攻击✍
- java使用ffmpeg实现视频切割
- 最有特点的、最有深度的网名分享:2012╰菿來啲那天
- OneNET麒麟座应用开发之三:获取温湿度数据
- Dlink DIR-615L 和 Mercury MW300R WDS 应用举例
- 昨天学会2件事,一件是multisim 添加自定义模型或导入模型文件,包括opa695和9013等三极管
- 使用eigen计算空间坐标变换
- TOS和DSCP总结
- fish or cut bait 当机立断
热门文章
- java跑动d小人_Java课堂练习5
- Babel转码时报错 Unexpected EOF at line 1 column 2 of the JSON5 data. Still to read:“”
- 推特CEO杰克·多西去年薪酬仅1.4美元 没有任何股票奖励
- django连接sqlserver的一些坑
- 微信一面:一致性哈希是什么,使用场景,解决了什么问题?
- 线程、进程(2)----- 从计算机物理层面分析
- sv中program和module区别
- vue Can‘t resolve ‘./cptable‘ in ‘xxx\node_modules_xlsx
- win10家庭版如何开启远程操控/远程协助?
- 发布自己的开源库到Cocoapods及部分常见错误