Openssl中chacha20-poly1305的使用
原理简述
chacha20-poly1305 是带有关联数据的认证加密(AEAD)AEAD是一种能够同时保证数据的保密性、 完整性和真实性的一种加密模式。
通常使用除了明文以外,会把包头的地址和端口等信息放进去一起做完整性校验。
chacha20 是流加密算法。
poly1305 是完整性校验是算法,即根据输入(加密数据和关联数据)输出16字节的认证标签。
使用方法
加密
输入项:
输入项 | 长度(Bytes) | 说明 |
---|---|---|
key | 32 | 共享秘钥 |
iv | 12 | 干扰项,每次不同 |
AAD | N | 关联数据 |
plaintext | N | 待加密数据明文 |
输出项:
输出项 | 长度(Bytes) | 说明 |
---|---|---|
ciphertext | N | 加密后的密文,长度与原始明文一致 |
TAG | 16 | 认证标签 |
通常将TAG接在ciphertext密文之后。
解密
输入项:
输入项 | 长度(Bytes) | 说明 |
---|---|---|
key | 32 | 共享秘钥 |
iv | 12 | 干扰项,每次不同 |
AAD | N | 关联数据 |
ciphertext | N | 待加密数据明文 |
TAG | 16 | 认证标签 |
输出项:
输出项 | 长度(Bytes) | 说明 |
---|---|---|
plaintext | N | 原始明文 |
result | 1 | 完整性检查结果(1成功,0失败) |
参数关联
key + iv + plaintext ===> ciphertext
ciphertext + AAD ===> TAG
AAD只参与完整性验证,不参与加密。
代码实例
代码刚验证完,没整理,凑合看,嘻嘻。
int chachapoly_test(void)
{/* Key 共享秘钥 */unsigned char skey2[32] = {0x2e,0xff,0xe4,0x85,0x1e,0x23,0x72,0xef,0x5c,0x44,0x14,0x75,0x61,0xd8,0xf0,0xa3,0xde,0x91,0x09,0x00,0x24,0x03,0x51,0x3c,0xf2,0xf6,0x6d,0x16,0xbd,0x78,0xd2,0x63};int ret = 0;EVP_CIPHER_CTX* ctx = NULL;EVP_CIPHER_CTX* dctx = NULL;/* 干扰项 iv */unsigned char iv[12] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b};/* 外部关联数据 AAD */unsigned char aad[128] = {0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26};unsigned char ciphertext[1024] = {0};unsigned char res[1024] = {0};/* 原始明文 plaintext */unsigned char msg[] = "0123456789abcdefghijklmnopqrstuvwxyz";ctx = EVP_CIPHER_CTX_new();ret = EVP_EncryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, skey2, iv);printf("EncryptInit ret: %d\n", ret);int outlen, finallen, reslen;/* 加密输入 ADD */ret = EVP_EncryptUpdate(ctx, NULL, &outlen, aad, 32);ret = EVP_EncryptUpdate(ctx, NULL, &outlen, aad+64, 32);printf("Ret: %d Update AAD len: %d\n", ret, outlen);/* 加密原始数据 */ret = EVP_EncryptUpdate(ctx, ciphertext, &outlen, msg, 37);printf("Ret: %d Update len: %u\n", ret, outlen);print_strhex(ciphertext, outlen);ret = EVP_EncryptFinal(ctx, ciphertext, &finallen);printf("Ret: %d Final len: %u\n", ret, finallen);outlen += finallen;//print_strhex(ciphertext, outlen);/* 生成认证标签TAG */unsigned char* tag_data = ciphertext + outlen;EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, 16, tag_data);outlen += 16;print_strhex(ciphertext, outlen);dctx = EVP_CIPHER_CTX_new();//iv[0] = 0x0f;//skey2[0] = 0xff;//tag_data[0] = 0x01;//aad[0] = 0x01;ret = EVP_DecryptInit_ex(dctx, EVP_chacha20_poly1305(), NULL, skey2, iv);printf("DecryptInit ret: %d\n", ret);ret = EVP_CIPHER_CTX_ctrl(dctx, EVP_CTRL_GCM_SET_TAG, 16, tag_data);printf("Ret: %d CTX set TAG\n", ret);ret = EVP_DecryptUpdate(dctx, NULL, &reslen, aad, 32);ret = EVP_DecryptUpdate(dctx, NULL, &reslen, aad+64, 32);printf("Ret: %d Update AAD len: %d\n", ret, reslen);ret = EVP_DecryptUpdate(dctx, res, &reslen, ciphertext, outlen - 16);printf("Ret: %d DecryUpdate once len: %u\n", ret, reslen);int totallen = reslen;ret = EVP_DecryptFinal(dctx, res, &reslen);printf("Ret: %d DecryptFinal len: %u\n", ret, reslen);//reslen += finallen;//print_strhex(res, totallen);printf("%s\n", res);
}
Openssl中chacha20-poly1305的使用相关推荐
- 对称加密算法AES之GCM模式简介及在OpenSSL中使用举例
AES(Advanced Encryption Standard)即高级加密标准,由美国国家标准和技术协会(NIST)于2000年公布,它是一种对称加密算法.关于AES的更多介绍可以参考:https: ...
- openssl中算法的组织方式
openssl为了支持可插拔的算法采用了engine,这里面有一些专利原因和政治原因,暂且掠过.在说engine之前首先看看算法的组织方式,其实如果你完全明白了这种组织,那么engine就是一个自然而 ...
- 利用ENGINE替换OPENSSL中的加解密算法
一:ENGINE的目的: ENGINE是OPENSSL预留的加载第三方加密库,主要包括了动态库加载的代码和加密函数指针管理的一系列接口.如果要使用Engine(假设你已经加载上该Engine了),那么 ...
- [教程]openssl中证书生成、签发,CRL,密钥转换等命令最简教程(可直接跳到后文)
前言 0.OPENSSL 什么是openssl? OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份.这个包广泛被应用在互联网的网页服 ...
- OpenSSL中的大数接口与基于其的自用RSA加密接口设计
本文记录了初次接触OpenSSL中的大数模块,重温了RSA加密流程,使用OpenSSL的接口包装成自用RSA加密接口,并且利用自己的接口演示了Alice与Bob通过RSA加密进行通讯的一个示例. 概览 ...
- ASN.1简介及OpenSSL中ASN.1接口使用举例
ASN.1(Abstract Syntax Notation One)是一套标准,是描述数据的表示.编码传输.解码的灵活的记法.它提供了一套正式.无歧义和精确的规则以描述独立于特定计算机硬件的对象结构 ...
- 基于Hash的消息认证码HMAC简介及在OpenSSL中使用举例
HMAC(Hash-based Message Authentication Code):基于Hash的消息认证码,是一种通过特别计算方式之后产生的消息认证码(MAC),使用密码散列函数,同时结合一个 ...
- 非对称加密算法之RSA介绍及OpenSSL中RSA常用函数使用举例
RSA算法,在1977年由Ron Rivest.Adi Shamirh和LenAdleman,在美国的麻省理工学院开发完成.这个算法的名字,来源于三位开发者的名字.RSA已经成为公钥数据加密标准. R ...
- 密码学专题 OpenSSL中SSL相关指令
再谈SSL和OpenSSL 由于SSL协议已经是密码学和PKI技术中非常具体的一个应用协议,为了实现它,OpenSSL在密码学基础应用和PKI技术的基础实现上做了大量的工作,才逐渐形成和奠定了Open ...
- OAEP及其在OpenSSL中的实现
RSA OAEP最优非对称加密填充 1输入 2加密过程 3校验过程 OpenSSL对OAEP的实现 RSA_padding_add_PKCS1_OAEP_mgf1 RSA_padding_check_ ...
最新文章
- Eclipse 菜单
- java自定义键值对_KV键值对数据类型
- core-js@2 core-js@3报错问题
- solaris下修改 IPMP 配置
- python数值计算
- 下班前网上搜集的方法哈哈
- Sublime Text 3 Key
- allergro音乐术语什么意思_「8D音乐」里的 8 是什么意思?
- C# Linq to sql 实现 group by 统计多字段 返回多字段
- 【组合数学】递推方程 ( 有重根下递推方程通解结构 | 线性无关解 | 有重根下的通解 | 有重根下的递推方程求解示例 | 递推方程公式解法总结 ) ★
- 任务栏流量监测工具 NetSpeedMonitor 在Windows 8下的安装使用
- html 打印 使用模板,HTML针式打印机打印模板
- 电脑键盘部分按键失灵_键盘按键失灵别担心 电脑达人教你几步解决方法
- MFC中模拟按钮控件BN_CLICKED消息事件
- 北航计算机学院好气派,2017年北京航空航天大学国内排名第几
- CentOS 6忘记密码解决方法(三分钟超快o)
- H5静态网页设计与制作_川西旅游网设计作品(HTML+CSS+jQuery)
- div+css静态网页设计 web网页设计实例作业 ——中国茶文化(30页) HTML网页制作作品 简单文化网页设计成品 dreamweaver学生网站模板
- 个人开发者只要一行代码接入微信支付和支付宝支付
- 录制PPT课件哪个录屏软件好?这3款值得收藏
热门文章
- z-stac配置按键
- 【mud】npc对话函数与自动对话匹配(gongsun.c)
- 2D横板跑酷游戏Boxman
- 芯洲SCT2230TVBR为用户小型化设计提供了简洁的电源解决方案
- c语言编程第四版李丽娟课程,C语言程序设计教程 第4版 普通高等教育“十一五”国家级规划教材 教学课件 李丽娟 C语言程序设计教程(第4版)_第4章_分支结构.pdf...
- R语言学习笔记3_探索性/描述性数据分析
- DRUID 连接池的使用、配置详解
- 关于Wrap Lighting与皮肤SSS
- 字符串常见方法总结: 构造方法、静态方法、 其它方法
- 《张艺谋这个人》较真