使用mbed-crypto进行AES加密算法测试

  • mbed-crypto的开源项目仓库:mbed-crypto
  • IDE:codeblocks
  • 系统:Ubuntu 16.04 LTS
  • 编译器,调试器:gcc,gdb

一、AES加密算法的简介,以及五种加密方式

转载文章:AES加密之五种模式

二、建立测试的项目工程

  1. 打开codeblocks,NewFIle->Project->Console application;将项目名称命名为aes_test;
    新建控制台项目
  2. 在Workspace右击项目名称,add file recursively添加库文件,将include和library文件夹中的所有文件添加到项目目录;添加完成的project tree如下图所示。
    使用mbed-crypto进行AES加密算法测试_第1张图片
  3. 将头文件包含进项目的索引目录下;Settings->Compiler->Search directories->add将inlude文件目录包含进来
    使用mbed-crypto进行AES加密算法测试_第2张图片

三、阅读源码

crypto/library/aes.c中有一个测试函数int mbedtls_aes_self_test( int verbose )就是官方给出的测试函数。作为测试,先只看CBC加密模式。

  1. 初始化
	int mode;				//判断加密或解密
    unsigned int keybits;   //密钥的长度
    unsigned char key[32];  //密钥的缓存
    unsigned char buf[64];  //加密的秘文与解密的明文的缓存区
	mbedtls_aes_context ctx;  //定义aes的工作场景类型
    memset( key, 0, 32 );    //设置密钥,这里设置的密钥全为0
    mbedtls_aes_init( &ctx ); //aes的工作场景初始化
  1. 设置解密的密钥与解密的密钥

        if( mode == MBEDTLS_AES_DECRYPT )
        {
            ret = mbedtls_aes_setkey_dec( &ctx, key, keybits ); //设置解密的密钥
            aes_tests = aes_test_cbc_dec[u];
        }
        else
        {
            ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );//设置加密的密钥
            aes_tests = aes_test_cbc_enc[u];
        }
  1. 加密或者解密共用一个函数
 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );

函数原型:

/**
 * \brief          This function performs an AES single-block encryption or
 *                 decryption operation.
 *
 *                 It performs the operation defined in the \p mode parameter
 *                 (encrypt or decrypt), on the input data buffer defined in
 *                 the \p input parameter.
 *
 *                 mbedtls_aes_init(), and either mbedtls_aes_setkey_enc() or
 *                 mbedtls_aes_setkey_dec() must be called before the first
 *                 call to this API with the same context.
 *
 * \param ctx      The AES context to use for encryption or decryption.
 *                 It must be initialized and bound to a key.
 * \param mode     The AES operation: #MBEDTLS_AES_ENCRYPT or
 *                 #MBEDTLS_AES_DECRYPT.
 * \param input    The buffer holding the input data.
 *                 It must be readable and at least \c 16 Bytes long.
 * \param output   The buffer where the output data will be written.
 *                 It must be writeable and at least \c 16 Bytes long.

 * \return         \c 0 on success.
 */
int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
                    int mode,
                    const unsigned char input[16],
                    unsigned char output[16] );

其中参数mode控制解密还是加密,当mode=1时加密;当mode=0时解密。

* \param mode 		The AES operation: 
* #MBEDTLS_AES_ENCRYPT or#MBEDTLS_AES_DECRYPT.
/* padlock.c and aesni.c rely on these values! */
#define MBEDTLS_AES_ENCRYPT     1 /**< AES encryption. */
#define MBEDTLS_AES_DECRYPT     0 /**< AES decryption. */

四、编写测试代码

void my_test(void)
{
    char *key="12345678";
    char buf[64]="hello";
    mbedtls_aes_context ctx;
    
 	 mbedtls_aes_init( &ctx );
    mbedtls_aes_setkey_enc( &ctx, key, 128 );
    mbedtls_aes_crypt_ecb( &ctx, 1, buf, buf );  //加密
    mbedtls_printf("this is encrypt:%s\n",buf);

    mbedtls_aes_setkey_dec( &ctx, key, 128 );
    mbedtls_aes_crypt_ecb( &ctx, 0, buf, buf );  //解密
    mbedtls_printf("this is encrypt:%s\n",buf);
}

你可能感兴趣的:(嵌入式开发)