資源簡介
實現加密算法:
【NULL算法】
函數:EVP_enc_null()該算法不作任何事情,也就是沒有進行加密處理
【DES算法】
函數:EVP_des_cbc(void), EVP_des_ecb(void), EVP_des_cfb(void), EVP_des_ofb(void)
說明:分別是CBC方式、ECB方式、CFB方式以及OFB方式的DES算法
【使用兩個密鑰的3DES算法】
函數:EVP_des_ede_cbc(void), EVP_des_ede(), EVP_des_ede_ofb(void),EVP_des_ede_cfb(void)
說明:分別是CBC方式、ECB方式、CFB方式以及OFB方式的3DES算法,算法的第一個密鑰和最后一個密鑰相同,事實上就只需要兩個密鑰
【使用三個密鑰的3DES算法】
函數:EVP_des_ede3_cbc(void), EVP_des_ede3(), EVP_des_ede3_ofb(void), EVP_des_ede3_cfb(void)
說明:分別是CBC方式、ECB方式、CFB方式以及OFB方式的3DES算法,算法的三個密鑰都不相同
。
。
。
。
。
。
注: 這些加密算法函數調用時返回的都是對應EVP_CIPHER結構體指針
*/
代碼片段和文件信息
#include?
#include?
#include?
typedef?unsigned?char?uchar;
/*使用openssl提供的API實現*/
int?aes_encrypt_api()
{
????uchar?userkey[AES_BLOCK_SIZE];
????uchar?*data?=?malloc(AES_BLOCK_SIZE*3);
????uchar?*encrypt?=?malloc(AES_BLOCK_SIZE*6);
????uchar?*plain?=?malloc(AES_BLOCK_SIZE*3);
????AES_KEY?key;
????memset((void*)userkey?‘k‘?AES_BLOCK_SIZE);
????memset((void*)data?‘h‘?AES_BLOCK_SIZE*3);
????memset((void*)encrypt?0?AES_BLOCK_SIZE*6);
????memset((void*)plain?0?AES_BLOCK_SIZE*3);
????/*設置加密key及密鑰長度*/
????AES_set_encrypt_key(userkey?AES_BLOCK_SIZE*8?&key);
????int?len?=?0;
????/*循環加密,每次只能加密AES_BLOCK_SIZE長度的數據*/
????while(len?????????AES_encrypt(data+len?encrypt+len?&key);????
????????len?+=?AES_BLOCK_SIZE;
????}
????/*設置解密key及密鑰長度*/????
????AES_set_decrypt_key(userkey?AES_BLOCK_SIZE*8?&key);
????len?=?0;
????/*循環解密*/
????while(len?????????AES_decrypt(encrypt+len?plain+len?&key);????
????????len?+=?AES_BLOCK_SIZE;
????}
????printf(“encrypt:?“);
????int?i?=?0;
????for(i?=?0;?i?????????printf(“%02x“?encrypt[i]);
????????if((i+1)?%?32?==?0){
????????????printf(“\n“);????
????????}
????}
????printf(“\n“);???
????printf(“plain:?%s\n“?plain);
????return?0;
}
/*使用EVP框架*/
int?aes_encrypt_evp()
{
????char?userkey[EVP_MAX_KEY_LENGTH];
????char?iv[EVP_MAX_IV_LENGTH];
????uchar?*data?=?malloc(AES_BLOCK_SIZE*3);
????uchar?*encrypt?=?malloc(AES_BLOCK_SIZE*6);
????uchar?*plain?=?malloc(AES_BLOCK_SIZE*6);
????EVP_CIPHER_CTX?*ctx;
????int?ret;
????int?tlen?=?0;
????int?mlen?=?0;
????int?flen?=?0;
????memset((void*)userkey?‘k‘?EVP_MAX_KEY_LENGTH);
????memset((void*)iv?‘i‘?EVP_MAX_IV_LENGTH);
????memset((void*)data?‘h‘?AES_BLOCK_SIZE*3);
????memset((void*)encrypt?0?AES_BLOCK_SIZE*6);
????memset((void*)plain?0?AES_BLOCK_SIZE*6);
????/*初始化ctx*/
????ctx?=?EVP_CIPHER_CTX_new();
????/*指定加密算法及key和iv(此處IV沒有用)*/
??????????????????????
????ret?=?EVP_EncryptInit_ex(ctx?EVP_aes_128_ecb()?NULL?userkey?iv);
????if(ret?!=?1)?{
????????printf(“EVP_EncryptInit_ex?failed\n“);
????????exit(-1);
????}
????
????/*禁用padding功能*/
????EVP_CIPHER_CTX_set_padding(ctx?0);
????/*進行加密操作*/
????ret?=?EVP_EncryptUpdate(ctx?encrypt?&mlen?data?AES_BLOCK_SIZE*3);
????if(ret?!=?1)?{
????????printf(“EVP_EncryptUpdate?failed\n“);
????????exit(-1);
????}
????/*結束加密操作*/
????ret?=?EVP_EncryptFinal_ex(ctx?encrypt+mlen?&flen);
????if(ret?!=?1)?{
????????printf(“EVP_EncryptFinal_ex?failed\n“);
????????exit(-1);
????}
????tlen?=?mlen?+?flen;
????tlen?=?0;
????mlen?=?0;
????flen?=?0;
????EVP_CIPHER_CTX_cleanup(ctx);
????EVP_CIPHER_CTX_init(ctx);
?????
????ret?=?EVP_DecryptInit_ex(ctx?EVP_aes_128_ecb()?NULL?userkey?iv);
????if(ret?!=?1)?{
????????printf(“EVP_DecryptInit_ex?failed\n“);
????????exit(-1);
????}
????
????EVP_CIPHER_CTX_set_pa
- 上一篇:GUIBuilder_V530.rar
- 下一篇:c語言學習例題.docx
評論
共有 條評論