密码库LibTomCrypt学习记录——(1.5)分组密码算法——示例代码AES-ECB
以下代码实现了AES-ECB的正确性测试(标准测试数据),以及性能测试
说明:
1. 代码里面使用了一个Str2Num函数,它将测试向量中的字符串转为十六进制字节数据,可自行实现。
2. 测试向量出处为NIST SP 800-38A (Recommendation for Block Cipher Modes of Operation:Methods and Techniques)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Test_ECB_AES.h
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <Windows.h>
#include "tomcrypt.h"
#include "TestMode.h"
typedef struct NistECBTestVector_st{
char * name;//test vetor name
int keylen;
int msglen;
BYTE * key[1]; // 密钥
BYTE * IV[1]; // 初始化向量
BYTE * pt[4]; // 明文,暂时最多支持四段明文
BYTE * ct[4]; // 密文,暂时最多支持四段明文
BYTE * nonce[1];
BYTE * associated_data[1];
BYTE * mac[1];
} NistECBTestVector;
// 数据来源
// NIST SP 800-38A (Recommendation for Block Cipher Modes of Operation:Methods and Techniques).pdf
NistECBTestVector ecb_vect[] = {
{//vect[0]
/*name*/ "F.1.1 key=128 Encrypt",
/*keylen*/ 16,
/*msglen*/ 16*4,
/*Key*/ "2b7e151628aed2a6abf7158809cf4f3c",
/*IV */ "",//ECB无初始化向量
{// pt
"6bc1bee22e409f96e93d7e117393172a",
"ae2d8a571e03ac9c9eb76fac45af8e51",
"30c81c46a35ce411e5fbc1191a0a52ef",
"f69f2445df4f9b17ad2b417be66c3710"
},
{//ct
"3ad77bb40d7a3660a89ecaf32466ef97",
"f5d3d58503b9699de785895a96fdbaaf",
"43b1cd7f598ece23881b00e3ed030688",
"7b0c785e27e8ad3f8223207104725dd4"
}
},
//
{//vect[1]
/*name*/ "F.1.2 key=128 Decrypt",
/*keylen*/ 16,
/*msglen*/ 16*4,
/*Key*/ "2b7e151628aed2a6abf7158809cf4f3c",
/*IV */ "",//ECB无初始化向量
{//ct //解密时明文密文相反而已
"3ad77bb40d7a3660a89ecaf32466ef97",
"f5d3d58503b9699de785895a96fdbaaf",
"43b1cd7f598ece23881b00e3ed030688",
"7b0c785e27e8ad3f8223207104725dd4"
},
{// pt //解密时明文密文相反而已
"6bc1bee22e409f96e93d7e117393172a",
"ae2d8a571e03ac9c9eb76fac45af8e51",
"30c81c46a35ce411e5fbc1191a0a52ef",
"f69f2445df4f9b17ad2b417be66c3710"
}
},
//
{//vect[2]
/*name*/ "F.1.3 key=192 Encrypt",
/*keylen*/ 24,
/*msglen*/ 16*4,
/*Key*/ "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
/*IV */ "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
{// pt
"6bc1bee22e409f96e93d7e117393172a",
"ae2d8a571e03ac9c9eb76fac45af8e51",
"30c81c46a35ce411e5fbc1191a0a52ef",
"f69f2445df4f9b17ad2b417be66c3710"
},
{//ct
"bd334f1d6e45f25ff712a214571fa5cc",
"974104846d0ad3ad7734ecb3ecee4eef",
"ef7afd2270e2e60adce0ba2face6444e",
"9a4b41ba738d6c72fb16691603c18e0e"
}
},
//
{//vect[3]
/*name*/ "F.1.4 key=192 Decrypt",
/*keylen*/ 24,
/*msglen*/ 16*4,
/*Key*/ "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
/*IV */ "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
{//ct //解密时明文密文相反而已
"bd334f1d6e45f25ff712a214571fa5cc",
"974104846d0ad3ad7734ecb3ecee4eef",
"ef7afd2270e2e60adce0ba2face6444e",
"9a4b41ba738d6c72fb16691603c18e0e"
},
{// pt //解密时明文密文相反而已
"6bc1bee22e409f96e93d7e117393172a",
"ae2d8a571e03ac9c9eb76fac45af8e51",
"30c81c46a35ce411e5fbc1191a0a52ef",
"f69f2445df4f9b17ad2b417be66c3710"
}
},
//
{//vect[4]
/*name*/ "F.1.5 key=256 Encrypt",
/*keylen*/ 32,
/*msglen*/ 16*4,
/*Key*/ "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
/*IV */ "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
{// pt
"6bc1bee22e409f96e93d7e117393172a",
"ae2d8a571e03ac9c9eb76fac45af8e51",
"30c81c46a35ce411e5fbc1191a0a52ef",
"f69f2445df4f9b17ad2b417be66c3710"
},
{//ct
"f3eed1bdb5d2a03c064b5a7e3db181f8",
"591ccb10d410ed26dc5ba74a31362870",
"b6ed21b99ca6f4f9f153e7b1beafed1d",
"23304b7a39f9f3ff067d8d8f9e24ecc7"
}
},
//
{//vect[5]
/*name*/ "F.1.6 key=256 Decrypt",
/*keylen*/ 32,
/*msglen*/ 16*4,
/*Key*/ "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
/*IV */ "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
{//ct //解密时明文密文相反而已
"f3eed1bdb5d2a03c064b5a7e3db181f8",
"591ccb10d410ed26dc5ba74a31362870",
"b6ed21b99ca6f4f9f153e7b1beafed1d",
"23304b7a39f9f3ff067d8d8f9e24ecc7"
},
{// pt //解密时明文密文相反而已
"6bc1bee22e409f96e93d7e117393172a",
"ae2d8a571e03ac9c9eb76fac45af8e51",
"30c81c46a35ce411e5fbc1191a0a52ef",
"f69f2445df4f9b17ad2b417be66c3710"
}
}
};
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Test_ECB_AES.cpp
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <Windows.h>
#include "tomcrypt.h"
#include "TestMode.h"
#include "Test_ECB_AES.h"
int Test_ECB_AES_Alg(void)
{
int idx, err, i, res;
BYTE buf[64];
symmetric_ECB ctr;
int keylen, msglen;
BYTE key[32], IV[16], pt[64], ct[64];
char *p_operate;
IV[0] = 0;
/* AES can be under rijndael or aes... try to find it */
if ( register_cipher (&aes_desc) != CRYPT_OK ) { return CRYPT_INVALID_CIPHER; }
if ((idx = find_cipher("aes")) == -1) { return CRYPT_NOP; }
printf("\nTest ECB AES Begin!\n" );
for ( i = 0; i < (int)(sizeof(ecb_vect)/sizeof(ecb_vect[0])); i++ )
{
keylen = ecb_vect[i].keylen;
msglen = ecb_vect[i].msglen;
Str2Num(ecb_vect[i].key, 1, key);
// ChangeText(vect[i].IV, 1, IV);
Str2Num(ecb_vect[i].pt, 4, pt);
Str2Num(ecb_vect[i].ct, 4, ct);
if ((err = ecb_start(idx, key, keylen, 0, &ctr)) != CRYPT_OK)
{
return err;
}
p_operate = ecb_vect[i].name + strlen(ecb_vect[i].name) - strlen("Encrypt");
if (strcmp( p_operate, "Encrypt") == 0 )
{
if ((err = ecb_encrypt( pt, buf, msglen, &ctr)) != CRYPT_OK)
{
return err;
}
}
else if (strcmp( p_operate, "Decrypt") == 0 )
{
if ((err = ecb_decrypt( pt, buf, msglen, &ctr)) != CRYPT_OK)
{
return err;
}
}
else
{
printf("Test Vetor : operate err! %s \n",ecb_vect[i].name );
}
ecb_done(&ctr);
res = XMEMCMP(buf, ct, msglen);
printf("Test Vetor : %s pass ? %s \n",ecb_vect[i].name, (res == 0)?"Yes":"No" );
}
unregister_cipher (&aes_desc);
printf("\nTest ECB AES Finish!\n" );
return CRYPT_OK;
}
//
int Test_ECB_AES_Speed(char *p_cipher_name )//test speed
{
int idx, err, i, res = 0,counter, counter_bound = 1000*1000*10;
BYTE buf[64];
symmetric_ECB ctr;
int keylen, msglen, len;
BYTE key[32], IV[16], pt[64], ct[64];
char *p_operate;
LARGE_INTEGER frequence, start_time, end_time, cost_time;
double use_time;
double speed;
// const struct ltc_cipher_descriptor *p_alg_desc = (&aes_desc);
QueryPerformanceFrequency( &frequence);
IV[0] = 0;
/* AES can be under rijndael or aes... try to find it */
// if ( register_cipher (p_alg_desc) != CRYPT_OK ) { return CRYPT_INVALID_CIPHER; }
// if ((idx = find_cipher(p_alg_desc->name)) == -1) { return CRYPT_NOP; }
if ((idx = find_cipher(p_cipher_name)) == -1)
{
printf("\nTest ECB Speed Err! Not Find Cipher %s\n", p_cipher_name );
return CRYPT_NOP;
}
printf("Test ECB Speed Begin ! Use Alg %s\n", p_cipher_name );
for ( i = 0; i < (int)(sizeof(ecb_vect)/sizeof(ecb_vect[0])); i++ )
{
keylen = ecb_vect[i].keylen;
msglen = ecb_vect[i].msglen;
len = cipher_descriptor[idx].block_length;
Str2Num(ecb_vect[i].key, 1, key);
// ChangeText(vect[i].IV, 1, IV);
Str2Num(ecb_vect[i].pt, 4, pt);
Str2Num(ecb_vect[i].ct, 4, ct);
if (keylen > cipher_descriptor[idx].max_key_length)
{
keylen = cipher_descriptor[idx].max_key_length;//
}
if (keylen < cipher_descriptor[idx].min_key_length)
{
keylen = cipher_descriptor[idx].min_key_length;//
}
if ((err = ecb_start(idx, key, keylen, 0, &ctr)) != CRYPT_OK)
{
break;//return err;
}
p_operate = ecb_vect[i].name + strlen(ecb_vect[i].name) - strlen("Encrypt");
if (strcmp( p_operate, "Encrypt") == 0 )
{
memcpy(buf, pt, 64);
QueryPerformanceCounter(&start_time); // cost time
for (counter = 0; counter < counter_bound; ++counter)
{
ecb_encrypt(buf, buf, /*16*/len, &ctr);
}
QueryPerformanceCounter(&end_time);// cost time
cost_time.QuadPart = end_time.QuadPart - start_time.QuadPart;
}
else if (strcmp( p_operate, "Decrypt") == 0 )
{
memcpy(buf, pt, 64);
QueryPerformanceCounter(&start_time); // cost time
for (counter = 0; counter < counter_bound; ++counter )
{
ecb_decrypt(buf, buf, /*16*/len, &ctr);
}
QueryPerformanceCounter(&end_time);// cost time
cost_time.QuadPart = end_time.QuadPart - start_time.QuadPart;
}
else
{
printf("Test Vector : operate err! %s \n",ecb_vect[i].name );
}
ecb_done(&ctr);
// res = XMEMCMP(buf, ct, msglen);
use_time = cost_time.QuadPart / (double)(frequence.QuadPart);
speed = ( counter_bound / 1000000 ) * len * 8 / use_time ;
printf("%s key = %d, cost %8.3f s, speed %8.3f mbps \n", p_operate, keylen, use_time, speed);
}
printf("Test ECB Speed Finish! Use Alg %s\n", p_cipher_name );
printf("\n###############################################\n\n", p_cipher_name );
return CRYPT_OK;
}
void register_algs(void)
{
register_cipher (&aes_desc);//
register_cipher (&blowfish_desc);//
register_cipher (&xtea_desc);
register_cipher (&rc5_desc);
register_cipher (&rc6_desc);
// register_cipher (&saferp_desc);//
register_cipher (&twofish_desc);//
// register_cipher (&safer_k64_desc);
// register_cipher (&safer_sk64_desc);
// register_cipher (&safer_k128_desc);
// register_cipher (&safer_sk128_desc);
register_cipher (&rc2_desc);
register_cipher (&des_desc);//
register_cipher (&des3_desc);//
register_cipher (&cast5_desc);//
register_cipher (&noekeon_desc);
register_cipher (&skipjack_desc);
register_cipher (&khazad_desc);//
register_cipher (&anubis_desc); //
register_cipher (&kseed_desc);//
register_cipher (&kasumi_desc); //
// register_cipher (&multi2_desc); //
}
int Test_ECB_AES(void)
{
// Test_ECB_AES_Alg( );
int i = 0;
register_algs( );
for ( i = 0;i<TAB_SIZE;i++)
{
if (cipher_descriptor[i].name != NULL )
{
Test_ECB_AES_Speed( cipher_descriptor[i].name );
}
}
return 1;
}
密码库LibTomCrypt学习记录——(1.5)分组密码算法——示例代码AES-ECB相关推荐
- 密码库LibTomCrypt学习记录——(2.15)分组密码算法的工作模式——GCM加密认证模式
GCM GCM是一种有大吞吐能力的加密认证模式.其中主要适用了CRT模式和类似CBC模式的GHASH模式.CRT模式基本上没有大多变化,GHASH则是利用有限域上的乘法进行HASH,此运算可以通常预先 ...
- 密码库LibTomCrypt学习记录——(2.25)分组密码算法的工作模式——EAX加密认证模式
EAX EAX是一种加密认证模式,它可以对消息明文进行加密,同时对消息明文和关联信息(Associated Data)进行认证,当然此关联信息也可以为空.EAX由Mihir Bellare等人在200 ...
- 密码库LibTomCrypt学习记录——(1.4)分组密码算法——AES-NI指令与AES的速度
英特尔在比较新的CPU上提供了AES-NI指令,可以直接调用这些指令来进行AES加解密.关于此指令的速度提升情况,各方反应不一,最高有说提高17倍的,有说提高8-9倍左右的,还有说提高一半左右的.这可 ...
- 密码库LibTomCrypt学习记录——(2.3)分组密码算法的工作模式——ECB代码示例
以下代码实现了AES-ECB的正确性测试(标准测试数据),以及性能测试 说明: 1. 代码里面使用了一个Str2Num函数,它将测试向量中的字符串转为十六进制字节数据,可自行实现. 2. 测试向量出处 ...
- 密码库LibTomCrypt学习记录——(2.18)分组密码算法的工作模式——XTS代码
Test_XTS_AES.h文件代码如下 #ifndef _TEST_XTS_AES_H #define _TEST_XTS_AES_H typedef unsigned __int64 ulong6 ...
- 密码库LibTomCrypt学习记录——(2.11)分组密码算法的工作模式——CTR代码示例
以下代码实现了CBC的正确性测试(标准测试数据) 说明: 1. 代码里面使用了一个Str2Num函数,它将测试向量中的字符串转为十六进制字节数据,可自行实现. 2. 测试向量出处为NIST SP 80 ...
- python环境下paillier同态密码库踩坑记录
python环境下paillier同态密码库环境搭建 前言 1. Paiilier库和Python版本的选择(非常重要) 2. 安装gmpy2 3. 安装PHE 4.安装NumPy 5. 测试 前言 ...
- 大创学习记录(四)之yolov3代码学习
PyTorch-YOLOv3项目训练与代码学习 借助从零开始的PyTorch项目理解YOLOv3目标检测的实现 PyTorch 对于PyTorch就不用多说了,目前最灵活.最容易掌握的深度学习库,它有 ...
- GIS开源库GEOS库学习教程(一):编译及示例代码
1.介绍 GEOS库是一个集合形状的拓扑关系操作实用库,简单得说,就是判断两个几何形状之间关系和对两个几何形状进行操作以形成新的几何形状的库.GEOS是仿照JTS库做的,是JTS的C++实现.下面 ...
最新文章
- 深证信息等三方拟联合开展大数据研究
- PAT甲级1097 Deduplication on a Linked List:[C++题解]遍历链表、两个vector
- 创业互联网公司如何搭建自己的技术架构
- 找出数组中被其他元素整除的元素_「每日一题」数组中重复的数字
- [Java基础]数据输入
- 牛客网NOIP赛前集训营 提高组 第5场 T2 旅游
- virt-install选项详解
- CodeForces 274B Zero Tree :每次选包含1节点的一棵子树,将该子树所有值都+1或者-1最少多少步可以使树值全部为0 :树型dp...
- 简繁体在线切换JS插件
- AO*算法详解,附例子和算法详细步骤
- 数据挖掘领头人韩家炜教授:如何从无结构文本到有用的知识?
- 【openv450-samples】像素点聚类EM 图像聚类目标检测
- 如何调试手机网页页面
- 计算机断层扫描法原理,能谱计算机断层扫描成像的概念和基本原理.PDF
- 中国环境检测市场运营现状分析与投资规划研究报告2022年版
- MATCH和INDEX函数
- Dining POJ - 3281 (网络流)
- 6.7 【实例】窗口查看器
- 双软企业认定的好处有哪些
- 分区表类型:MBR和GUID区别
热门文章
- 1.17 设置工作簿的页眉和页脚 [原创Excel教程]
- 藏宝阁游戏服务器维护中,梦幻西游2013年1月22日藏宝阁维护公告 17173.com网络游戏:《梦幻西游》专区...
- python自动解析json_JsonParser–使用python编写的json解析器
- 正则环视(零宽度断言)
- 环视拼接-鱼眼镜头模型
- Cisco ❀ 二层交换安全技术
- 一键安装ghost轻博客
- {“errcode“:48001,“errmsg“:“api unauthorized}
- k8s DNS服务配置
- 博客地址blog.geass.link