亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言使用openSSL庫AES模塊實現加密功能詳解

2020-01-26 14:07:53
字體:
來源:轉載
供稿:網友

本文實例講述了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 <aes.h>#include <stdio.h>#include <string.h>#include <assert.h>#include <stdlib.h>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<size;i ++ ) {        printf( "%02X ", (unsigned char)buff[i] );        if ((i+1) % 8 == 0) {            printf("/n");        }    }    printf("/n/n/n/n");}void encrpyt_buf(char *raw_buf, char **encrpy_buf, int len ) {    AES_KEY aes;    unsigned char *key = str2hex("8cc72b05705d5c46f412af8cbed55aad");    unsigned char *iv = str2hex("667b02a85c61c786def4521b060265e8");    AES_set_encrypt_key(key,128,&aes);    AES_cbc_encrypt(raw_buf,*encrpy_buf,len,&aes,iv,AES_ENCRYPT);    free(key);    free(iv);}void decrpyt_buf(char *raw_buf, char **encrpy_buf, int len ) {    AES_KEY aes;    unsigned char *key = str2hex("8cc72b05705d5c46f412af8cbed55aad");    unsigned char *iv = str2hex("667b02a85c61c786def4521b060265e8");    AES_set_decrypt_key(key,128,&aes);    AES_cbc_encrypt(raw_buf,*encrpy_buf,len,&aes,iv,AES_DECRYPT);    free(key);    free(iv);}int main(int argn, char *argv[] ) {    char *raw_buf = NULL;    char *after_padding_buf = NULL;    int padding_size = 0;    char *encrypt_buf = NULL;    char *decrypt_buf = NULL;    // 1    raw_buf = (char *)malloc(17);    memcpy(raw_buf,"life's a struggle",17);    printf("------------------raw_buf/n");    printf_buff(raw_buf,17);    // 2    after_padding_buf = padding_buf(raw_buf,17,&padding_size);    printf("------------------after_padding_buf/n");    printf_buff(after_padding_buf,padding_size);    // 3    encrypt_buf = (char *)malloc(padding_size);    encrpyt_buf(after_padding_buf,&encrypt_buf, padding_size);    printf("------------------encrypt_buf/n");    printf_buff(encrypt_buf,padding_size);    // 4    decrypt_buf = (char *)malloc(padding_size);    decrpyt_buf(encrypt_buf,&decrypt_buf,padding_size);    printf("------------------decrypt_buf/n");    printf_buff(decrypt_buf,padding_size);    free(raw_buf);    free(after_padding_buf);    free(encrypt_buf);    free(decrypt_buf);    return 0;}

編譯scons腳本:

# SConstructimport globenv = Environment()env["CPPPATH"] = [ '/usr/include/openssl' ]env['LIBPATH'] = [ '/home/abel/lib/openssl-1.0.2f' ]env['CPPDEFINES'] = ['LINUX', '_DEBUG' ]env['CCFLAGS'] = '-g -std=gnu99'env['LIBS'] = [ 'm', 'crypto', 'dl' ]env.Program( target = "./test_aes", source = ( glob.glob( './*.c' ) ) )

輸出結果:

:!./test_aes------------------raw_buf6C 69 66 65 27 73 20 6120 73 74 72 75 67 67 6C65------------------after_padding_buf6C 69 66 65 27 73 20 6120 73 74 72 75 67 67 6C65 00 00 00 00 00 00 0000 00 00 00 00 00 00 00------------------encrypt_bufDB 63 28 C5 2C 6A 3F 1BFD 4B C5 47 94 4E 24 9DD2 15 4C F2 6B 3B 1D C0E7 D2 7B D6 1E 78 60 EA------------------decrypt_buf6C 69 66 65 27 73 20 6120 73 74 72 75 67 67 6C65 00 00 00 00 00 00 0000 00 00 00 00 00 00 00

總結

代碼中還是有很多地方都是直接malloc內存出來,這些點都能扣得更加細。在每次加密調用的時候IV內存將會改變。

PS:關于加密解密感興趣的朋友還可以參考本站在線工具:

文字在線加密解密工具(包含AES、DES、RC4等):
http://tools.VeVB.COm/password/txt_encode

MD5在線加密工具:
http://tools.VeVB.COm/password/CreateMD5Password

在線散列/哈希算法加密工具:
http://tools.VeVB.COm/password/hash_encrypt

在線MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.VeVB.COm/password/hash_md5_sha

在線sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.VeVB.COm/password/sha_encode

希望本文所述對大家C語言程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人久久一区二区| 欧美孕妇孕交黑巨大网站| 久久精品国产2020观看福利| 精品久久久久久久久久久| 亚洲国产精品女人久久久| 欧美精品videossex性护士| 超在线视频97| 国产亚洲欧美日韩精品| 国产原创欧美精品| www.国产一区| 日韩中文字幕视频| 91在线视频精品| 国产一区二区精品丝袜| 日韩在线一区二区三区免费视频| 久久久久久久久电影| 国产欧美va欧美va香蕉在| 国产91色在线播放| 欧美高清videos高潮hd| 国产亚洲福利一区| 亚洲成人av片在线观看| 2019中文字幕全在线观看| 日韩av男人的天堂| 国产91色在线免费| 亚洲欧美日韩精品久久奇米色影视| 欧美丰满老妇厨房牲生活| 搡老女人一区二区三区视频tv| 亚洲免费伊人电影在线观看av| 亚洲护士老师的毛茸茸最新章节| 尤物九九久久国产精品的分类| 亚洲综合日韩在线| 欧美成人免费播放| 国产在线98福利播放视频| 亚州国产精品久久久| 成人欧美一区二区三区黑人| 韩剧1988在线观看免费完整版| 欧美极品少妇xxxxx| 久久久综合免费视频| 欧美日韩999| 亚洲成人黄色在线观看| 亚洲天堂精品在线| 亚洲精品一区二区在线| 亚洲白虎美女被爆操| 精品女同一区二区三区在线播放| 国产一区二区在线免费视频| 欧美极品在线视频| 亚洲高清免费观看高清完整版| 欧美日韩在线视频一区二区| 亚洲欧美另类国产| 久久久精品视频在线观看| 成人妇女淫片aaaa视频| 亚洲一区二区三区视频播放| 91高清视频免费| 国内成人精品一区| 午夜精品久久久久久久男人的天堂| 久久久国产成人精品| 午夜剧场成人观在线视频免费观看| 91久久精品国产91久久性色| 欧美日韩亚洲成人| 精品国产一区二区三区四区在线观看| 在线精品播放av| 中文字幕在线亚洲| 91国内揄拍国内精品对白| 亚洲欧美国产精品va在线观看| 国产www精品| 日韩麻豆第一页| 国产日韩欧美在线播放| 欧美激情一区二区三区久久久| 亚洲黄一区二区| 国产剧情久久久久久| 国产99久久精品一区二区永久免费| 欧美日韩国产123| 久久999免费视频| 亚洲精品美女久久久| 92看片淫黄大片欧美看国产片| 亚洲天堂一区二区三区| 福利视频一区二区| 久热精品视频在线免费观看| 欧美又大粗又爽又黄大片视频| 欧美性精品220| 国产精品高精视频免费| 懂色aⅴ精品一区二区三区蜜月| 亚洲а∨天堂久久精品喷水| 精品露脸国产偷人在视频| 国产成人极品视频| 亚洲第一视频在线观看| 欧美精品18videosex性欧美| 亚洲丁香久久久| 亚洲欧美日韩在线高清直播| 91久久国产精品| 中文字幕精品久久| 精品成人69xx.xyz| 国产美女91呻吟求| 久久男人av资源网站| 亚洲精品一区中文字幕乱码| 日韩在线观看高清| 91精品国产乱码久久久久久蜜臀| 亚洲精品国精品久久99热一| 国产999精品| 国产精品久久久久久久久久久久久久| 91久久久久久久| 国产欧美久久久久久| 久久综合免费视频影院| 国产欧美一区二区三区在线| 亚洲综合精品伊人久久| 日韩精品在线免费播放| 国产99久久精品一区二区 夜夜躁日日躁| 国产在线观看精品一区二区三区| 国产精品吴梦梦| 成人a在线观看| 久久精品99久久香蕉国产色戒| 日韩av在线不卡| 日韩在线视频国产| 国内精品在线一区| 亚洲天堂第一页| 激情久久av一区av二区av三区| 成人福利视频在线观看| 欧美专区福利在线| 国产精品永久在线| 日韩欧美国产中文字幕| 日韩少妇与小伙激情| 国产精品一久久香蕉国产线看观看| 精品久久中文字幕| 精品视频在线播放免| 亚洲一区二区三区成人在线视频精品| 日韩精品欧美国产精品忘忧草| 欧美电影免费观看高清完整| 亚洲欧美日韩一区二区三区在线| 福利视频第一区| 伊人成人开心激情综合网| 日本成人在线视频网址| 国产精品r级在线| 亚洲欧美在线播放| 国产精品女人久久久久久| 91亚洲一区精品| 午夜精品久久久久久久久久久久久| 亚洲欧美制服综合另类| 欧美一级视频在线观看| 九九视频这里只有精品| 91免费版网站入口| 亚洲男人天堂网| 狠狠躁夜夜躁久久躁别揉| 亚洲第一男人天堂| 久久久欧美精品| 成人精品网站在线观看| 欧美怡春院一区二区三区| 久久人人爽人人爽人人片av高请| 国产精品久久久久久久7电影| 欧美日韩第一视频| 午夜欧美不卡精品aaaaa| 欧美日在线观看| 一个人看的www欧美| 青青久久aⅴ北条麻妃| 亚洲欧美日韩成人| 欧美一区亚洲一区| 日韩成人av网址| 亚洲国产婷婷香蕉久久久久久| 欧美人在线观看| 热久久免费视频精品| 精品福利在线视频| www.国产精品一二区| 国产精品户外野外| 国产日本欧美一区二区三区| 午夜精品久久久久久久白皮肤| 久久夜精品va视频免费观看|