首页 > 搜索 > c算法实现aes加密算法,C语言使用openSSL库AES模块实现加密功能详解

c算法实现aes加密算法,C语言使用openSSL库AES模块实现加密功能详解

互联网 2020-10-22 08:16:33
在线算命,八字测算命理

本文实例讲述了C语言使用openSSL库AES模块实现加密功能。分享给大家供大家参考,具体如下:

概述

在密码学里面一共有3中分类:

1.对称加密/解密

对称加密比较常见的有DES/AES。加密方和解密方都持有相同的密钥。对称的意思就是加密和解密都是用相同的密钥。

2.非对称加密/解密

常见的加密算法DSA/RSA。如果做过Google Pay的话,应该不会陌生。非对称意味着加密和解密使用的密钥不是相同的。这种应用的场合是需要保持发起方的权威性,比如Google中一次支付行为,只能Google通过私钥来加密产出来,但是大家都能通过公钥来认证这个是真的。打个更加浅显的比方:私钥可以理解成美联储的印钞机,公钥可以理解成在民间无数的美元验钞机。

还有一个场合也是https使用证书方式登录的时候,也是使用的双向的非对称加密模式来做的。

3.离散

这种只能被称为验签,而不是加密。因为这类算法只能一个方向(将输入数据离散到某个特定的数字,反向解密是无法做到的。)。最常见的算法就是MD5。在写php的时候大量的使用这种验签来做认证。他可以将字符串离散成32byte的16进制的数字。

本次使用AES CBC方式来加密。CBC模式加密是SSL的通讯标准,所以在做游戏的时候经常会使用到。openSSL的基本用法可以参考这个

两个细节

这种加密的需要了解下面两个细节:

1.加密的内存块一般按照16字节(这个也可以调整)对齐;当原始内存块没有对齐字节数的时候,需要填充;

2.加密解密不会引发内存的膨胀或者缩小;

最近在使用Python,Java,c#都去看过AES的接口,最轻松的是c#,java。当使用C来写,才能明显感受到在这些操作过程中,有多少次内存的分配,多少的内存拼接。啥事都有成本,封装良好的语言损失掉的效率可能来自于这些便利。

准备知识

函数接口

int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);// 设置加密keyAES_KEY aes;AES_set_encrypt_key(key,128,&aes);// 这里填写的128是bit位,128bit=(128/8)bytes=16bytes,这个换算和32bit对应int为内存指针的原理一样。// 初始化自己的keychar key[16];// 加密函数void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t length, const AES_KEY *key, unsigned char *ivec, const int enc);# define AES_BLOCK_SIZE 16 // aes.h 71 lines# define AES_ENCRYPT 1 // aes.h 63 lines# define AES_DECRYPT 0 // aes.h 64 lines// 定义一个加密的初始化向量unsigned char iv[AES_BLOCK_SIZE];// 加密AES_cbc_encrypt(raw_buf,encrypt_buf,buf_size,&aes,iv,AES_ENCRYPT);// 解密AES_cbc_encrypt(raw_buf,encrypt_buf,buf_size,&aes,iv,AES_DECRYPT);

字串转换

// 16进制的字串转换成16byte存储起来// hex string to byte in cconst char hexstring[] = "deadbeef10203040b00b1e50", *pos = hexstring;unsigned char val[12];size_t count = 0;/* WARNING: no sanitization or error-checking whatsoever */for(count = 0; count < sizeof(val)/sizeof(val[0]); count++) {sscanf(pos, "%2hhx", &val[count]);pos += 2;}printf("0x");for(count = 0; count < sizeof(val)/sizeof(val[0]); count++)printf("%02x", val[count]);printf("\n");

padding算法

char *raw_buf = ...;int raw_size = ...;char *final_buf = NULL;int pidding_size = AES_BLOCK_SIZE - (raw_size % AES_BLOCK_SIZE);int i;final_buf = (char *)malloc(raw_size+pidding_size);if (pidding_size!=0) {memcpy( final_buf, raw_buf, raw_size);for (i =raw_size;i < (raw_size+pidding_size); i++ ) {// zero padding算法:final_buf[i] = 0;or// PKCS5Padding算法final_buf[i] = pading;}}

完整的代码

c语言代码

// main.c#include #include #include #include #include unsigned char* str2hex(char *str) {unsigned char *ret = NULL;int str_len = strlen(str);int i = 0;assert((str_len%2) == 0);ret = (char *)malloc(str_len/2);for (i =0;i < str_len; i = i+2 ) {sscanf(str+i,"%2hhx",&ret[i/2]);}return ret;}char *padding_buf(char *buf,int size, int *final_size) {char *ret = NULL;int pidding_size = AES_BLOCK_SIZE - (size % AES_BLOCK_SIZE);int i;*final_size = size + pidding_size;ret = (char *)malloc(size+pidding_size);memcpy( ret, buf, size);if (pidding_size!=0) {for (i =size;i < (size+pidding_size); i++ ) {ret[i] = 0;}}return ret;}void printf_buff(char *buff,int size) {int i = 0;for (i=0;i
免责声明:非本网注明原创的信息,皆为程序自动获取互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件12小时内删除。

相关阅读

一周热门

查看更多