密码库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

相关文章

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方