基于ASCON的AEAD

news2025/1/12 6:15:52

1. 引言

前序博客:

  • ASCON:以“慢而稳”赢得NIST轻量级加密算法标准
  • 密码学中的AEAD(authenticated encryption with associated data)

对称密钥加密过去数年来已发生改变,具体为:

  • 当今主要使用stream ciphers,因其比block ciphers要快得多。
  • 经常会使用AEAD(Authenticated Encryption with Additional Data)。
  • 在加密过程中常使用sponge函数,进而支持使用sponge函数来创建对称密钥和哈希函数。
  • Rust现在正在成为一种事实上的软件语言,它在编码方面提高了健壮性。

ASCON代码示例见:

  • ASCON AEAD - Light-weight cipher
  • https://github.com/usnistgov/Lightweight-Cryptography-Benchmarking(C)
  • https://github.com/meichlseder/pyascon/blob/master/ascon.py(Python)
  • https://github.com/itzmeanjan/ascon(C++)
  • https://github.com/NomanNasirMinhas/ASCON_Benchmark(Rust)
  • https://github.com/sebastinas/isap-aead(Rust)
  • https://github.com/neoilir/Simple-ascon-hash-implementation-rust(Rust)
  • https://github.com/sebastinas/ascon-aead(Rust)
  • https://github.com/IAIK/ascon_hardware(VHDL,硬件实现)
  • https://github.com/ascon/ascon-c(C和汇编)
  • https://github.com/ascon/ascon-hardware(Python和VHDL,硬件实现)
  • https://github.com/RustCrypto/sponges/tree/master/ascon(Rust)
  • https://github.com/RustCrypto/AEADs/tree/master/ascon-aead(Rust)

2. AEAD(Authenticated Encryption with Additional Data)

所谓对称密钥加密,是指使用相同的密钥来加解密:
在这里插入图片描述
但是这样的对称密钥加密存在重放攻击问题,如:

  • Bob用对称密钥加密了一条消息给Alice,Alice收到密文用相同的对称密钥解密后,获得“你明天可休假一天”,于是Alice第二天休假了。
  • 但是,Eve窃听了上述消息,在第二天将相同的密文再次发送给Alice,Alice解密后,第三天又休假了一天。
  • Bob会很奇怪,为啥Alice连休了2天假。

原因就在于Eve对密文进行了重放攻击。因此,需要将加密过程与某网络连接或session绑定,使得Eve无法重构相同的场景。

通过增强的加密方法,使得既可认证加密,也可证明其完整性。这被称为关联数据的身份验证加密(AEAD)。为此,提供额外的数据来认证加密过程,并可识别密文已被修改因其无法被加密:
在这里插入图片描述
大多数传统的AEA方法为创建一个nonce值,并添加认证但不加密的额外数据(Additional Data, AD)。额外数据AD可为:

addresses, ports, sequence numbers, protocol version numbers, and other fields that indicate how the plaintext or ciphertext should be handled, forwarded, or processed

这样就可将网络包与加密数据绑定,提供了完整性,使得入侵者无法复制粘贴其它通道的密文来形成攻击。如,若绑定包序号和端口号,使用另一序号或端口号将认证失败。

可以用于AEAD的主要方法是AES GCM、AES SIV、AES CCM、ChaCha20/Poly1305和AES OCB3。每一个都是流密码,避免了CBC和ECB的块方法模式。

3. 基于ASCON的AEAD

如以https://github.com/RustCrypto/sponges/tree/master/ascon(Rust)实现的AEAD为例:

cargo new arc

相应的cargo.toml文件为:

[package]
name = "arc"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
ascon = "0.1.4"
rand="0.8.3"
hex="0.4.3"

相应的main.rs源代码为:

use ascon;
use rand::thread_rng;
use rand::Rng;
use hex::{self};
use std::env;

fn get_random_key16() ->  [u8; 16]{
    let mut arr = [0u8; 16];
    thread_rng().try_fill(&mut arr[..]).expect("Ooops!");
    return arr;
}

fn main() {

    let mut msg="hello";
    let mut aad1="test";

    let args: Vec<String> = env::args().collect();
  
    if args.len() >1 { msg = args[1].as_str();}
    if args.len() >2 { aad1 = args[2].as_str();}

    let randkey128=get_random_key16(); //为128字节

    let iv=get_random_key16(); //用作salt


    let plaintext=msg.as_bytes();
    let aad=aad1.as_bytes();

    let (ciphertext,tag) = ascon::aead_encrypt(&randkey128, &iv, 
        plaintext, aad); //tag也为128字节


  let pt=ascon::aead_decrypt(&randkey128, &iv,&ciphertext[..], &aad, &tag);
  
  let s = String::from_utf8(pt.unwrap()).expect("Found invalid UTF-8");

  println!("Message:\t{}\n",msg);
  println!("AAD:\t\t{}\n",aad1);

  println!("Key:\t\t{}\n",hex::encode(randkey128));
  println!("Cipher:\t\t{}\n",hex::encode(ciphertext));
  println!("Tag:\t\t{}\n",hex::encode(tag));
  println!("Decryped:\t{}", s);
}

运行结果为:

Message:        hello

AAD:            test

Key:            6680811197f36de07227b8f08ae31c33

Cipher:         01e0d0d020

Tag:            6e90b3a9790c28188172d5bd8041555d

Decryped:       hello

参考资料

[1] Prof Bill Buchanan OBE 2023年9月博客 ASCON, Rust and AEAD: Is ASCON better than AES?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1017078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序 动漫游戏资讯推荐系统

配置文件 (自动编号、配置参数名称、配置参数值)&#xff1b; 系统的设计与实现采用Spring、SpringMVC和MyBatis作为主体框架,系统设计遵循界面层、业务逻辑层和数据访问层的Web开发三层架构。采用B/S结构,使得系统更加容易维护。系统的设计与实现主要实现角色有管理员和用户,管…

预训练相关知识

1、上下文无关语义表示方式存在问题 语义不同的词具有相同的表示&#xff0c;&#xff08;apple 电子产品苹果/水果苹果&#xff09; 容易出现oov问题 2、神经语言编码器 2.1、序列模型 cnn/rnn等&#xff0c;捕获局部信息和序列依赖信息&#xff0c;无法捕获长距离依赖。易训…

【JavaScript】HTML文件插入JavaScript函数

介绍 在HTML文件中插入JavaScript函数的方法如下&#xff1a; 1、在HTML文件中使用<script>标签来定义JavaScript函数&#xff0c;例如&#xff1a; <script> function myFunction() {// 在这里编写JavaScript函数代码 } </script>2、在HTML文件中调用Jav…

2023年稀有金属行业研究报告

第一章 行业概况 稀有金属是一类在地球上分布较为稀少或从原矿中分离较为困难的金属。这类金属包括稀土、锂、钼、钨、铟、钛等。由于其独特的物理和化学性质&#xff0c;稀有金属在许多高技术领域中都是不可或缺的材料&#xff0c;如航天、原子能、电子和国防等。 稀有金属在…

小红书加密参数X-s详解

小红书加密参数X-s详解 小红书加密参数X-s详解 省略调试过程 定位到相关文件 如图所示&#xff1a; 修改代码 将代码复制下来&#xff0c;找到以下代码&#xff1a; , function(p0, p1, p2, p3, p4, p5, p6) {var _ace_25a6 _ace_ae44(p0, p1), _ace_d2389 _ace_34d1(p2…

Windows下编译安装FreeCAD 0.21

本文记录在Windows下编译安装FreeCAD 0.21的流程。 一、下载代码与依赖 1.1 下载代码 git clone https://github.com/FreeCAD/FreeCAD.git cd cd ./FreeCAD/ git checkout -b FreeCAD-0-21 origin/releases/FreeCAD-0-21 1.2 下载依赖 从GitHub下载FreeCAD LibPack-0.21 Ve…

21天学会C++:Day9----初识类与对象

CSDN的uu们&#xff0c;大家好。这里是C入门的第九讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 面向过程与面向对象 2. 类的定义 3. 类中的访问限定符 3.1 访问限定符的…

Linux网络编程:使用UDP和TCP协议实现网络通信

目录 一. 端口号的概念 二. 对于UDP和TCP协议的认识 三. 网络字节序 3.1 字节序的概念 3.2 网络通信中的字节序 3.3 本地地址格式和网络地址格式 四. socket编程的常用函数 4.1 sockaddr结构体 4.2 socket编程常见函数的功能和使用方法 五. UDP协议实现网络通信 5.…

SSL双向认证-Nginx配置

SSL双向认证需要CA证书&#xff0c;开发过程可以利用自签CA证书进行调试验证。 自签CA证书生成过程&#xff1a;SSL双向认证-自签CA证书生成 Nginx配置适用于前端项目或前后端都通过Nginx转发的时候&#xff08;此时可不配置后端启用双向认证&#xff09; 1.Nginx配置&#…

20230908_python练习_selenium模块爬取网页小说练习

霍比特人小说爬取&#xff0c;使用 selenium 模块调用谷歌浏览器&#xff0c;无界面模式爬取小说网站信息&#xff0c;将数据按照每次2000字符在mysql中保存。 # https://www.shukuai9.com/b/324694/ # 导入需要的库 from selenium import webdriver # 导入Keys模块&#xff…

AlteraXilinx公司FPGA简介

Intel / Altera公司 Intel/Altera 系列FPGA简介 - 知乎 (zhihu.com) Altera FPGA 提供了多种可配置嵌入式 SRAM、高速收发器、高速 I/O、逻辑模块以及布线。其内置知识产权 (IP) 结合优秀的软件工具&#xff0c;缩短了 FPGA 开发时间&#xff0c;降低了功耗和成本。 Altera FP…

五、数学建模之层次分析法

1.概念 2.例题 一、概念 1.提出 层次分析法&#xff08;Analytic Hierarchy Process&#xff0c;AHP&#xff09;是一种多标准决策分析方法&#xff0c;用于帮助人们在面对复杂的决策问题时进行定量和定性的比较和评估。它最初由美国运筹学家和管理学家托马斯萨蒙&#xff08…

[字符串和内存函数]strcat字符串函数的详解和模拟

strcat函数 strcat函数是C语言中用于将一个字符串追加到另一个字符串末尾的函数。其函数原型如下&#xff1a; char *strcat(char *dest, const char *src);其中&#xff0c;dest是目标字符串&#xff0c;src是要追加的字符串。函数将src中的内容追加到dest的末尾&#xff…

软件测试的基础知识

目录 前言 软件测试的生命周期 如何描述一个bug 如何定位bug的级别 bug的生命周期 和开发人员产生争执怎么办 设计一个测试用例 前言 上篇文章主要写了软件测试的一些基本概念以及软件测试的前置知识,这篇文章主要带大家了解在进行软件测试之前要准备的工作. 软件测试…

常见的数码管中的引脚分布情况

简单介绍 数码管&#xff0c;实际就是用了7段亮的线段表示常见的数字或字符。常见的像下面几种&#xff08;图片是网络中的截图&#xff09;。事件中使用到的知识还是单片机中最基础的矩阵扫描。记得其中重要的有“余晖效应”&#xff0c;好像是要把不用的亮段关闭&#xff0c…

【C++】string 之 assign、at、append函数的学习

前言 在学习string类的过程中&#xff0c;我发现了assign这个函数&#xff0c;感觉很有用&#xff0c;就来记录一下 assign函数原型&#xff1a; void assign(size_type n, const T& x T());void assign(const_iterator first, const_iterator last);assign函数有两种使…

格林公式推导

∫ D ∫ ( ∂ Q ∂ x − ∂ P ∂ y ) d x d y ∮ P d x Q d y \int _D \int (\frac{\partial Q}{\partial x} - \frac{\partial P}{\partial y})dx dy \oint P dx Qdy ∫D​∫(∂x∂Q​−∂y∂P​)dxdy∮PdxQdy 证明&#xff1a; 假设 ∫ Q ( x , y ) d y 的原函数是 q …

linux万字图文学习进程信号

1. 信号概念 信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断。 1.1 linux中我们常用Ctrlc来杀死一个前台进程 1. Ctrl-C 产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。2. S…

Git的ssh方式如何配置,如何通过ssh方式拉取和提交代码

git的ssh配置 HTTPS和SSH的区别设置SSH方式配置单个仓库配置账户公钥 大家通过git拉取代码的时候&#xff0c;一般都是通过http的方式&#xff0c;简单方便。但是细心的童鞋肯定也注意到Git也是支持ssh方式的。可能很多人也试过使用这个方式&#xff0c;但是好像没有那么简单。…

企业架构LNMP学习笔记57

MongoDB的安全设置&#xff1a; 安全&#xff1a; MongoDB的安全事件&#xff1a; 2017年年初&#xff1a; 利用SMB漏洞可以获得系统最高权限。wannacry勒索病毒。当年确实遇到过这个事情。 比特币的概念&#xff1a;开源软件 P2P网络 P2P形式的数字货币。交易记录公开透明。…