密码库LibTomCrypt学习记录——(1.3)分组密码算法——AES算法的函数和使用流程介绍

本文主要是介绍密码库LibTomCrypt学习记录——(1.3)分组密码算法——AES算法的函数和使用流程介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LibTomCtypt中AES的描述子有两个,rijndael_desc和aes_desc,这二者除了name有区别外别的都一样,因此aes和rijndael是等效的。

注意:VC编译AES的时候记得将aes_table.c设置为“exclude file from build”,别的带_table的c文件类似。“exclude file from build”的设置方式为:右键点击aes_table.c,选择Settings → General → exclude file from build。

AES的测试例见aes.c的int ECB_TEST(void),记得在使用前需要先注册aes的描述子。

tomcrypt_cipher.h中对AES的描述为

//aes和rijndael是一个意思

#define aes_setup           rijndael_setup

#define aes_ecb_encrypt     rijndael_ecb_encrypt

#define aes_ecb_decrypt     rijndael_ecb_decrypt

#define aes_test            rijndael_test

#define aes_done            rijndael_done

#define aes_keysize         rijndael_keysize

#define aes_enc_setup           rijndael_enc_setup

#define aes_enc_ecb_encrypt     rijndael_enc_ecb_encrypt

#define aes_enc_keysize         rijndael_enc_keysize

// aes和rijndael的相关函数有以下这些

int rijndael_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);

int rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);

int rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);

int rijndael_test(void);

void rijndael_done(symmetric_key *skey);

int rijndael_keysize(int *keysize);

//带enc的这些函数是用于只需要加密而不需要解密的时候

int rijndael_enc_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);

int rijndael_enc_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);

void rijndael_enc_done(symmetric_key *skey);

int rijndael_enc_keysize(int *keysize);

// aes和rijndael的相关描述子以及仅用于加密的描述子

extern const struct ltc_cipher_descriptor rijndael_desc, aes_desc;

extern const struct ltc_cipher_descriptor rijndael_enc_desc, aes_enc_desc;

在aes.c里面对相关函数做了详细描述,以不使用单加密模式(即既需要加密又需要解密)为例

#define SETUP    rijndael_setup

#define ECB_ENC  rijndael_ecb_encrypt

#define ECB_DEC  rijndael_ecb_decrypt

#define ECB_DONE rijndael_done

#define ECB_TEST rijndael_test

#define ECB_KS   rijndael_keysize

rijndael_desc描述子的详情如下

const struct ltc_cipher_descriptor rijndael_desc =

{

    "rijndael",

     6,

     16, 32, 16, 10,

     SETUP, ECB_ENC, ECB_DEC, ECB_TEST, ECB_DONE, ECB_KS,

     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL

};

aes_desc描述子的详情如下

const struct ltc_cipher_descriptor aes_desc =

{

    "aes",

     6,

     16, 32, 16, 10,

     SETUP, ECB_ENC, ECB_DEC, ECB_TEST, ECB_DONE, ECB_KS,

     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL

};

aes涉及的函数如下:

──────────────────────────────────────

int SETUP(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)

// [功能]   初始化,主要做密钥扩展

  1. key              // [输入] 密钥
  2. keylen     // [输入] 密钥长度
  3. num_rounds  // [输入] 轮数(建议设置为0以便让系统使用默认值)
  4. skey             // [输出] 扩展密钥

──────────────────────────────────────

──────────────────────────────────────

int ECB_ENC(const unsigned char *pt, unsigned char *ct, symmetric_key *skey)

// [功能]   加密 (明文密文长度为一个分组大小)

  1. pt            // [输入] 明文(一个分组大小)
  2. ct            // [输出] 密文(一个分组大小)
  3. skey             // [输入] 扩展密钥

──────────────────────────────────────

──────────────────────────────────────

int ECB_DEC(const unsigned char *ct, unsigned char *pt, symmetric_key *skey)

// [功能]   解密 (明文密文长度为一个分组大小)

  1. ct            // [输入] 密文(一个分组大小)
  2. pt           // [输出] 明文(一个分组大小)
  3. skey             // [输入] 扩展密钥

──────────────────────────────────────

──────────────────────────────────────

int ECB_TEST(void)

// [功能]   测试函数

──────────────────────────────────────

──────────────────────────────────────

void ECB_DONE(symmetric_key *skey)

// [功能]   反初始化

  1. skey             // [输入] 扩展密钥

//备注:建议将skey信息销毁

──────────────────────────────────────

──────────────────────────────────────

int ECB_KS(int *keysize)

// [功能]   根据输入的密钥大小,返回推荐的密钥大小

  1. keysize         // [输入/输出] 密钥大小

──────────────────────────────────────

这篇关于密码库LibTomCrypt学习记录——(1.3)分组密码算法——AES算法的函数和使用流程介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295208

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是