对称加密与加密模式相关API

image.png

代码演示

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模式代码演示相关推荐

  1. C++ Openssl AES GCM 128bits代码示例,可wins10的visual studio 2017 中直接运行

    C++ Openssl AES GCM 128bits代码示例,可wins直接运行 使用vcpkg安装64bits的openssl,本人当前的openssl为openssl-1.1.1d版本,wins ...

  2. 对称加密算法AES之GCM模式简介及在OpenSSL中使用举例

    AES(Advanced Encryption Standard)即高级加密标准,由美国国家标准和技术协会(NIST)于2000年公布,它是一种对称加密算法.关于AES的更多介绍可以参考:https: ...

  3. 原型模式【浅克隆实现,使用序列化实现深克隆】Java代码演示

    文章目录 原型模式 浅克隆 深克隆(使用序列化) 原型模式 原型模式(Prototype) 的定义如下: 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象. 在这里, ...

  4. Java设计模式的代码演示(结构型模式一)

    目录 写在前面 一.适配器模式 1.1. 类适配器模式 1.2. 对象适配器模式 二.桥接模式 三.装饰器模式 写在前面 上一篇我们学习了创建型设计模式 本篇文章通过代码演示的形式,记录结构型设计模式 ...

  5. ecb gcm java 加密,AES GCM和ECB加密软件,附算法源码和工程文件

    [实例简介] AesTestTool为加密软件,支持GCM 和 ECB两种模式 128bit秘钥 GCM算法是一个C++工程,"C++gcm算法工程"目录里面有源码 加密软件是用C ...

  6. AES GCM算法实现

    当前业界敏感信息加密使用AES较多,GCM模式兼具效率和安全性,故选择使用该模式. 注意 我们经常使用256位秘钥,因为美国的安全管控,jdk8的较老版本安全策略不支持256位秘钥,需替换jdk\jr ...

  7. 使用Crypto++的AES GCM对称加密

    这里记录使用Crypto++的AES GCM对称加密的代码片段,可直接执行 运行环境:Windows, Visual Studio 2017 需安装Crypto++库,可使用cvpkg工具直接集成该库 ...

  8. 代码演示C#各版本新功能

    代码演示C#各版本新功能 C#各版本新功能其实都能在官网搜到,但很少有人整理在一起,并通过非常简短的代码将每个新特性演示出来. 代码演示C#各版本新功能 C# 2.0版 - 2005 泛型 分部类型 ...

  9. Python Web框架Tornado的异步处理代码演示样例

    1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口 ...

最新文章

  1. pwm一个时间单位_RK3308——RGB调色灯三路PWM驱动
  2. 剑桥MPhil Industrial Systems, Manufacture and Management录取率
  3. c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。...
  4. MapReduce简介
  5. 用GZIP来压缩socket传输的序列化的类
  6. new运算符与malloc函数区别
  7. 低照度图像修复方法总结
  8. 【论文笔记】A Convolutional Neural Network Cascade for Face Detection
  9. JAVA interface报错:abstract methods do not specify a body
  10. 洛谷 P3951 小凯的疑惑
  11. 三维空间中判断射线与平面是否相交
  12. 网络安全DOS攻击✍
  13. java使用ffmpeg实现视频切割
  14. 最有特点的、最有深度的网名分享:2012╰菿來啲那天
  15. OneNET麒麟座应用开发之三:获取温湿度数据
  16. Dlink DIR-615L 和 Mercury MW300R WDS 应用举例
  17. 昨天学会2件事,一件是multisim 添加自定义模型或导入模型文件,包括opa695和9013等三极管
  18. 使用eigen计算空间坐标变换
  19. TOS和DSCP总结
  20. fish or cut bait 当机立断

热门文章

  1. java跑动d小人_Java课堂练习5
  2. Babel转码时报错 Unexpected EOF at line 1 column 2 of the JSON5 data. Still to read:“”
  3. 推特CEO杰克·多西去年薪酬仅1.4美元 没有任何股票奖励
  4. django连接sqlserver的一些坑
  5. 微信一面:一致性哈希是什么,使用场景,解决了什么问题?
  6. 线程、进程(2)----- 从计算机物理层面分析
  7. sv中program和module区别
  8. vue Can‘t resolve ‘./cptable‘ in ‘xxx\node_modules_xlsx
  9. win10家庭版如何开启远程操控/远程协助?
  10. 发布自己的开源库到Cocoapods及部分常见错误