Java 11 – ChaCha20-Poly1305加密示例
本文向您展示如何使用RFC 7539中定义的ChaCha20-Poly1305
算法对消息进行加密和解密。
PS ChaCha20-Poly1305
加密算法可从Java 11获得。
1.常见问题
一些常见问题:
1.1什么是ChaCha20-Poly1305
?
ChaCha20-Poly1305
表示使用Poly1305
身份验证器以AEAD模式运行的ChaCha20
(加密和解密算法)。
1.2什么是AE或AEAD?
认证加密(AE)和带有关联数据的认证加密(AEAD)是一种加密消息并一起认证加密的形式。
1.3认证加密意味着什么?
确保没有人修改密文(加密的消息),它的工作方式类似于验证文件的SHA或MD5哈希。 Poly1305
生成一个MAC
(消息验证码)(128位,16字节),并将其附加到ChaCha20
密文(加密的文本)中。 在解密过程中,该算法检查MAC以确保没有人修改密文。
1.4 ChaCha20-Poly1305
如何工作?
ChaCha20
加密使用密钥和IV(初始化值,nonce)将明文加密为等长的密文。 Poly1305生成一个MAC(消息认证码)并将其附加到密文中。 最后,密文和明文的长度不同。
1.5我可以将同一随机数重用于不同的密钥吗?
不可以,每个加密的随机数和密钥都必须是唯一的,否则密文会妥协!
注意
如果我们不需要额外的身份验证(poly1305)功能,请考虑仅使用ChaCha20
加密消息,请参阅此Java 11 – ChaCha20流密码示例
1. ChaCha20-Poly1305
本示例使用ChaCha20-Poly1305
加密和解密消息。 此外,我们手动将随机数附加到最终的加密文本上,以便在解密期间无需提供随机数。 随机数可以公开,但密钥必须是私有的。
ChaCha20-Poly1305
的输入为:
- 256位密钥(32字节)
- 96位随机数(12个字节)
PS对于ChaCha20-Poly1305
,我们不需要定义初始计数器值。 它从1开始。
package com.mkyong.java11.jep329.poly1305;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.nio.ByteBuffer;
import java.security.SecureRandom;public class ChaCha20Poly1305 {private static final String ENCRYPT_ALGO = "ChaCha20-Poly1305";private static final int NONCE_LEN = 12; // 96 bits, 12 bytes// if no nonce, generate a random 12 bytes noncepublic byte[] encrypt(byte[] pText, SecretKey key) throws Exception {return encrypt(pText, key, getNonce());}public byte[] encrypt(byte[] pText, SecretKey key, byte[] nonce) throws Exception {Cipher cipher = Cipher.getInstance(ENCRYPT_ALGO);// IV, initialization value with nonceIvParameterSpec iv = new IvParameterSpec(nonce);cipher.init(Cipher.ENCRYPT_MODE, key, iv);byte[] encryptedText = cipher.doFinal(pText);// append nonce to the encrypted textbyte[] output = ByteBuffer.allocate(encryptedText.length + NONCE_LEN).put(encryptedText).put(nonce).array();return output;}public byte[] decrypt(byte[] cText, SecretKey key) throws Exception {ByteBuffer bb = ByteBuffer.wrap(cText);// split cText to get the appended noncebyte[] encryptedText = new byte[cText.length - NONCE_LEN];byte[] nonce = new byte[NONCE_LEN];bb.get(encryptedText);bb.get(nonce);Cipher cipher = Cipher.getInstance(ENCRYPT_ALGO);IvParameterSpec iv = new IvParameterSpec(nonce);cipher.init(Cipher.DECRYPT_MODE, key, iv);// decrypted textbyte[] output = cipher.doFinal(encryptedText);return output;}// 96-bit nonce (12 bytes)private static byte[] getNonce() {byte[] newNonce = new byte[12];new SecureRandom().nextBytes(newNonce);return newNonce;}}
2.测试一下。
使用ChaCha20-Poly1305
算法对消息进行加密和解密。
package com.mkyong.java11.jep329.poly1305;import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.nio.ByteBuffer;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;public class TestChaCha20Poly1305 {private static final int NONCE_LEN = 12; // 96 bits, 12 bytesprivate static final int MAC_LEN = 16; // 128 bits, 16 bytespublic static void main(String[] args) throws Exception {String input = "Java & ChaCha20-Poly1305.";ChaCha20Poly1305 cipher = new ChaCha20Poly1305();SecretKey key = getKey(); // 256-bit secret key (32 bytes)System.out.println("Input : " + input);System.out.println("Input (hex): " + convertBytesToHex(input.getBytes()));System.out.println("\n---Encryption---");byte[] cText = cipher.encrypt(input.getBytes(), key); // encryptSystem.out.println("Key (hex): " + convertBytesToHex(key.getEncoded()));System.out.println("Encrypted (hex): " + convertBytesToHex(cText));System.out.println("\n---Print Mac and Nonce---");ByteBuffer bb = ByteBuffer.wrap(cText);// This cText contains chacha20 ciphertext + poly1305 MAC + nonce// ChaCha20 encrypted the plaintext into a ciphertext of equal length.byte[] originalCText = new byte[input.getBytes().length];byte[] nonce = new byte[NONCE_LEN]; // 16 bytes , 128 bitsbyte[] mac = new byte[MAC_LEN]; // 12 bytes , 96 bitsbb.get(originalCText);bb.get(mac);bb.get(nonce);System.out.println("Cipher (original) (hex): " + convertBytesToHex(originalCText));System.out.println("MAC (hex): " + convertBytesToHex(mac));System.out.println("Nonce (hex): " + convertBytesToHex(nonce));System.out.println("\n---Decryption---");System.out.println("Input (hex): " + convertBytesToHex(cText));byte[] pText = cipher.decrypt(cText, key); // decryptSystem.out.println("Key (hex): " + convertBytesToHex(key.getEncoded()));System.out.println("Decrypted (hex): " + convertBytesToHex(pText));System.out.println("Decrypted : " + new String(pText));}// https://mkyong.com/java/java-how-to-convert-bytes-to-hex/private static String convertBytesToHex(byte[] bytes) {StringBuilder result = new StringBuilder();for (byte temp : bytes) {result.append(String.format("%02x", temp));}return result.toString();}// A 256-bit secret key (32 bytes)private static SecretKey getKey() throws NoSuchAlgorithmException {KeyGenerator keyGen = KeyGenerator.getInstance("ChaCha20");keyGen.init(256, SecureRandom.getInstanceStrong());return keyGen.generateKey();}}
输出量
Input : Java & ChaCha20-Poly1305.
Input (hex): 4a61766120262043686143686132302d506f6c79313330352e---Encryption---
Key (hex): 7b47d646547928f2ac962562d613bdac7db351893224c6c1b03adeb859da8251
Encrypted (hex): c04a463086c545d0053f8a279d50815aa9cb5db04da5ba0c4dc57e225f46074af793ccb81a15908a8fd15561deb55f01ef0d93932a---Print Mac and Nonce---
Cipher (original) (hex): c04a463086c545d0053f8a279d50815aa9cb5db04da5ba0c4d
MAC (hex): c57e225f46074af793ccb81a15908a8f
Nonce (hex): d15561deb55f01ef0d93932a---Decryption---
Input (hex): c04a463086c545d0053f8a279d50815aa9cb5db04da5ba0c4dc57e225f46074af793ccb81a15908a8fd15561deb55f01ef0d93932a
Key (hex): 7b47d646547928f2ac962562d613bdac7db351893224c6c1b03adeb859da8251
Decrypted (hex): 4a61766120262043686143686132302d506f6c79313330352e
Decrypted : Java & ChaCha20-Poly1305.
下载源代码
$ git clone https://github.com/mkyong/core-java.git
$ cd java-11
$ cd / src / main / java / com / mkyong / java11 / jep329
注意
如果发现任何错误,请在下面发表评论,谢谢。
参考文献
- ChaCha20
- RFC 7539
- 维基百科– Authenticated_encryption
- Java 11 – ChaCha20流密码示例
翻译自: https://mkyong.com/java/java-11-chacha20-poly1305-encryption-examples/
http://www.taodudu.cc/news/show-3045372.html
相关文章:
- chacha20加密c语言算法,Java 11的新加密算法ChaCha20-Poly1305
- matlab poly用法
- Openssl中chacha20-poly1305的使用
- Poly2Tri介绍
- Poly-YOLO:更快,更精确的检测(主要解决Yolov3两大问题,附源代码)
- poly
- matlab中poly2sym什么意思,[转载]sym2poly poly2sym
- poly-yolo笔记
- Poly-encoders(2020 ICLR)
- li-poly_GitHub - kinglisky/lowpoly: low poly图片风格化工具
- keras进阶之poly学习率
- matlab中poly2sym,poly2sym 与 sym2poly
- matlab commsrc.pn,poly2trellis
- Poly-Yolo复现
- Poly-YOLO 学习
- Poly-encoder
- 【 MATLAB 】poly 函数介绍
- Poly定理:学习笔记
- 【JZOJ 省选模拟】多项式(poly)
- Air Quality Index,简称AQI
- python实现空气质量提醒程序_基于Python实现空气质量指数可视化
- 空气质量指数
- 实战1 - 空气质量数据的校准
- 空气质量监测APP
- python爬空气污染实时数据_python数据分析综合项目--空气质量指数分析
- 免费数据 | CnOpenData空气质量站点监测数据
- “生态环境—空气质量”业务理解
- 空气质量标准
- python空气质量分析与预测_干货!如何用 Python+KNN 算法实现城市空气质量分析与预测?...
- 基于线性回归预测环境空气质量 代码+数据
Java 11 – ChaCha20-Poly1305加密示例相关推荐
- Java 11 – ChaCha20加密示例
在本文中,我们将向您展示如何使用RFC 7539中定义的ChaCha20流密码对消息进行加密和解密. PS ChaCha20流密码可从Java 11获得,请参阅JEP 329 . 注意 您可能对此Ch ...
- chacha20加密c语言算法,Java 11的新加密算法ChaCha20-Poly1305
ChaCha20-Poly1305 介绍 Java 11新增加了加密算法ChaCha20-Poly1305. ChaCha20-Poly1305相关的名词需要解释一下: ChaCha20是一种流式对称 ...
- 3、【java数据安全】对称加密的5种(DES/3DES、AES、IDEA、PBE)常见算法的使用示例
java数据安全 系列文章 1.[java数据安全]数据安全之加密解密(base64.MD.SHA.DES.AES.IDEA.PBE.DH.RSA.EIGamal).数字签名(DSA.ECDSA)和数 ...
- PKCS#11 用户级加密应用程序示例
转自 :http://docs.oracle.com/cd/E19253-01/819-7056/auto117/index.html 本节包含以下示例: 消息摘要示例 对称加密示例 签名和检验示例 ...
- 在intellij上运行java_如何解决无法在IntelliJ中运行java 11示例程序?
public class First { public static void main(String[] args) { System.out.println("Hello Java 11 ...
- java11 是长期支持_这里有你不得不了解的Java 11版本特性说明
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- Java 11 JDK
根据Oracle新出台的每6个月发布一次Java SE的节奏,Java 11将于2018年9月发布,迄今为止Oracle已经宣布了好几个新功能. 此外,Java 11还将删除一些功能,其中包括删除CO ...
- Java 11 正式发布!
有多少语言在提刀想反超 Java 的路上?但万万没想到,人家并未当回事,如今这款常青藤甚至越跑越欢,当我们还在使用 Java 7/8 时,它已经一路跑到了 11. 和预期的时间差不多,北京时间 9 月 ...
- 4.6 W 字总结!Java 11—Java 17特性详解
作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...
最新文章
- P2837 晚餐队列安排
- gRPC学习记录(五)--拦截器分析
- linux centos6.5 ftp网页vsftpd配置
- CentOS 7 yum方式快速安装MongoDB
- 小米平板android最新版本,想要翻身还需努力 小米平板2安卓版评测
- php获取当前页面数据,ThinkPHP如何获取当前页面URL信息?
- c语言将水仙花数放入一维数组a中,C语言考试题库及答案(1)
- python编程入门第3版pdf-Python编程入门第3版PDF电子书免费下载
- 借助Sigar API获取操作系统信息
- 分子动力学模拟软件_分子模拟软件Discovery Studio教程(十九):虚拟氨基酸突变提高结合亲和力...
- Java面试——多线程面试题
- matlab读取hdf显示,matlab读取hdf
- 有效解决 Word打印出来的页码出现乱码
- 用canvas实现九宫格切图之手把手教学(uniapp+ts)
- 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”
- MapGuide应用程序示例——你好,MapGuide!
- 微信小程序图片无法存入云开发数据库,求解决
- 正则表达式密码校验(由数字、字母、符号三者同时组合)
- 【小白破解电脑密码】忘记电脑开机密码了,怎么办?
- 蘑菇街Java工资_【蘑菇街工资】java开发工程师待遇-看准网
热门文章
- html 支持ssi,shtml网页SSI使用详解
- Unity3D代码混淆
- QuickBooks profitandloss report 获取Not Specified 详情
- 2015欧冠决赛--脑力劳动结硕果
- MacBook Pro 16寸 i9-9880H对比 桌面级CPU i7-8700
- 写程序关键是真正自己开始动手写,不要总是想着等全部弄懂了再写
- 使用 Web 高速缓存减少网络流量 / Reducing network traffic with Web caching
- 震撼!世界从10亿光年到0.1飞米(ZT)
- 一个游戏账号竟卖到7.5万元!
- 有趣的计算机课作文,一堂有趣的课作文(精选4篇)