原理简述

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的使用相关推荐

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

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

  2. openssl中算法的组织方式

    openssl为了支持可插拔的算法采用了engine,这里面有一些专利原因和政治原因,暂且掠过.在说engine之前首先看看算法的组织方式,其实如果你完全明白了这种组织,那么engine就是一个自然而 ...

  3. 利用ENGINE替换OPENSSL中的加解密算法

    一:ENGINE的目的: ENGINE是OPENSSL预留的加载第三方加密库,主要包括了动态库加载的代码和加密函数指针管理的一系列接口.如果要使用Engine(假设你已经加载上该Engine了),那么 ...

  4. [教程]openssl中证书生成、签发,CRL,密钥转换等命令最简教程(可直接跳到后文)

    前言 0.OPENSSL 什么是openssl? OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份.这个包广泛被应用在互联网的网页服 ...

  5. OpenSSL中的大数接口与基于其的自用RSA加密接口设计

    本文记录了初次接触OpenSSL中的大数模块,重温了RSA加密流程,使用OpenSSL的接口包装成自用RSA加密接口,并且利用自己的接口演示了Alice与Bob通过RSA加密进行通讯的一个示例. 概览 ...

  6. ASN.1简介及OpenSSL中ASN.1接口使用举例

    ASN.1(Abstract Syntax Notation One)是一套标准,是描述数据的表示.编码传输.解码的灵活的记法.它提供了一套正式.无歧义和精确的规则以描述独立于特定计算机硬件的对象结构 ...

  7. 基于Hash的消息认证码HMAC简介及在OpenSSL中使用举例

    HMAC(Hash-based Message Authentication Code):基于Hash的消息认证码,是一种通过特别计算方式之后产生的消息认证码(MAC),使用密码散列函数,同时结合一个 ...

  8. 非对称加密算法之RSA介绍及OpenSSL中RSA常用函数使用举例

    RSA算法,在1977年由Ron Rivest.Adi Shamirh和LenAdleman,在美国的麻省理工学院开发完成.这个算法的名字,来源于三位开发者的名字.RSA已经成为公钥数据加密标准. R ...

  9. 密码学专题 OpenSSL中SSL相关指令

    再谈SSL和OpenSSL 由于SSL协议已经是密码学和PKI技术中非常具体的一个应用协议,为了实现它,OpenSSL在密码学基础应用和PKI技术的基础实现上做了大量的工作,才逐渐形成和奠定了Open ...

  10. OAEP及其在OpenSSL中的实现

    RSA OAEP最优非对称加密填充 1输入 2加密过程 3校验过程 OpenSSL对OAEP的实现 RSA_padding_add_PKCS1_OAEP_mgf1 RSA_padding_check_ ...

最新文章

  1. Eclipse 菜单
  2. java自定义键值对_KV键值对数据类型
  3. core-js@2 core-js@3报错问题
  4. solaris下修改 IPMP 配置
  5. python数值计算
  6. 下班前网上搜集的方法哈哈
  7. Sublime Text 3 Key
  8. allergro音乐术语什么意思_「8D音乐」里的 8 是什么意思?
  9. C# Linq to sql 实现 group by 统计多字段 返回多字段
  10. 【组合数学】递推方程 ( 有重根下递推方程通解结构 | 线性无关解 | 有重根下的通解 | 有重根下的递推方程求解示例 | 递推方程公式解法总结 ) ★
  11. 任务栏流量监测工具 NetSpeedMonitor 在Windows 8下的安装使用
  12. html 打印 使用模板,HTML针式打印机打印模板
  13. 电脑键盘部分按键失灵_键盘按键失灵别担心 电脑达人教你几步解决方法
  14. MFC中模拟按钮控件BN_CLICKED消息事件
  15. 北航计算机学院好气派,2017年北京航空航天大学国内排名第几
  16. CentOS 6忘记密码解决方法(三分钟超快o)
  17. H5静态网页设计与制作_川西旅游网设计作品(HTML+CSS+jQuery)
  18. div+css静态网页设计 web网页设计实例作业 ——中国茶文化(30页) HTML网页制作作品 简单文化网页设计成品 dreamweaver学生网站模板
  19. 个人开发者只要一行代码接入微信支付和支付宝支付
  20. 录制PPT课件哪个录屏软件好?这3款值得收藏

热门文章

  1. z-stac配置按键
  2. 【mud】npc对话函数与自动对话匹配(gongsun.c)
  3. 2D横板跑酷游戏Boxman
  4. 芯洲SCT2230TVBR为用户小型化设计提供了简洁的电源解决方案
  5. c语言编程第四版李丽娟课程,C语言程序设计教程 第4版 普通高等教育“十一五”国家级规划教材 教学课件 李丽娟 C语言程序设计教程(第4版)_第4章_分支结构.pdf...
  6. R语言学习笔记3_探索性/描述性数据分析
  7. DRUID 连接池的使用、配置详解
  8. 关于Wrap Lighting与皮肤SSS
  9. 字符串常见方法总结: 构造方法、静态方法、 其它方法
  10. 《张艺谋这个人》较真