本文向您展示如何使用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开始。

ChaCha20Poly1305.java
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算法对消息进行加密和解密。

TestChaCha20Poly1305.java
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();}}

输出量

Terminal
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流密码示例
标签: 认证 chacha20 加密 加密 Java

翻译自: 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加密示例相关推荐

  1. Java 11 – ChaCha20加密示例

    在本文中,我们将向您展示如何使用RFC 7539中定义的ChaCha20流密码对消息进行加密和解密. PS ChaCha20流密码可从Java 11获得,请参阅JEP 329 . 注意 您可能对此Ch ...

  2. chacha20加密c语言算法,Java 11的新加密算法ChaCha20-Poly1305

    ChaCha20-Poly1305 介绍 Java 11新增加了加密算法ChaCha20-Poly1305. ChaCha20-Poly1305相关的名词需要解释一下: ChaCha20是一种流式对称 ...

  3. 3、【java数据安全】对称加密的5种(DES/3DES、AES、IDEA、PBE)常见算法的使用示例

    java数据安全 系列文章 1.[java数据安全]数据安全之加密解密(base64.MD.SHA.DES.AES.IDEA.PBE.DH.RSA.EIGamal).数字签名(DSA.ECDSA)和数 ...

  4. PKCS#11 用户级加密应用程序示例

    转自 :http://docs.oracle.com/cd/E19253-01/819-7056/auto117/index.html 本节包含以下示例: 消息摘要示例 对称加密示例 签名和检验示例 ...

  5. 在intellij上运行java_如何解决无法在IntelliJ中运行java 11示例程序?

    public class First { public static void main(String[] args) { System.out.println("Hello Java 11 ...

  6. java11 是长期支持_这里有你不得不了解的Java 11版本特性说明

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  7. Java 11 JDK

    根据Oracle新出台的每6个月发布一次Java SE的节奏,Java 11将于2018年9月发布,迄今为止Oracle已经宣布了好几个新功能. 此外,Java 11还将删除一些功能,其中包括删除CO ...

  8. Java 11 正式发布!

    有多少语言在提刀想反超 Java 的路上?但万万没想到,人家并未当回事,如今这款常青藤甚至越跑越欢,当我们还在使用 Java 7/8 时,它已经一路跑到了 11. 和预期的时间差不多,北京时间 9 月 ...

  9. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

最新文章

  1. P2837 晚餐队列安排
  2. gRPC学习记录(五)--拦截器分析
  3. linux centos6.5 ftp网页vsftpd配置
  4. CentOS 7 yum方式快速安装MongoDB
  5. 小米平板android最新版本,想要翻身还需努力 小米平板2安卓版评测
  6. php获取当前页面数据,ThinkPHP如何获取当前页面URL信息?
  7. c语言将水仙花数放入一维数组a中,C语言考试题库及答案(1)
  8. python编程入门第3版pdf-Python编程入门第3版PDF电子书免费下载
  9. 借助Sigar API获取操作系统信息
  10. 分子动力学模拟软件_分子模拟软件Discovery Studio教程(十九):虚拟氨基酸突变提高结合亲和力...
  11. Java面试——多线程面试题
  12. matlab读取hdf显示,matlab读取hdf
  13. 有效解决 Word打印出来的页码出现乱码
  14. 用canvas实现九宫格切图之手把手教学(uniapp+ts)
  15. 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”
  16. MapGuide应用程序示例——你好,MapGuide!
  17. 微信小程序图片无法存入云开发数据库,求解决
  18. 正则表达式密码校验(由数字、字母、符号三者同时组合)
  19. 【小白破解电脑密码】忘记电脑开机密码了,怎么办?
  20. 蘑菇街Java工资_【蘑菇街工资】java开发工程师待遇-看准网

热门文章

  1. html 支持ssi,shtml网页SSI使用详解
  2. Unity3D代码混淆
  3. QuickBooks profitandloss report 获取Not Specified 详情
  4. 2015欧冠决赛--脑力劳动结硕果
  5. MacBook Pro 16寸 i9-9880H对比 桌面级CPU i7-8700
  6. 写程序关键是真正自己开始动手写,不要总是想着等全部弄懂了再写
  7. 使用 Web 高速缓存减少网络流量 / Reducing network traffic with Web caching
  8. 震撼!世界从10亿光年到0.1飞米(ZT)
  9. 一个游戏账号竟卖到7.5万元!
  10. 有趣的计算机课作文,一堂有趣的课作文(精选4篇)