C語言程式設計實現使用AES對檔案進行加密
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
int main(int argc,char* argv[])
{
if(argc<3){
printf("Usage:./encrypt <filename> <keyword>\n");
return 0;
}
// char* fname=*(argv+1);
//讀取檔案內容
FILE* file=fopen(*(argv+1),"r");
if(file==NULL){
printf("open file failed!\n");
return 0;
}
//設定明文空間
unsigned char plain[17]={0};
//生成金鑰
unsigned char *userKey=*(argv+2);
AES_KEY aes_key;
int ret=AES_set_encrypt_key(userKey,128,&aes_key);
if(ret<0){
printf("設定金鑰失敗!!\n");
return 0;
}
//建立密文檔案
// char *fextend=".cipher";
// strcat(fname,fextend);
FILE* cfile=fopen("list.cipher","w+");
if(cfile==NULL){
printf("open cipher file failed!!\n");
return 0;
}
//生成密文空間
unsigned char cipher[17]={0};
//加密
int num=fread(plain,1,16,file);
while(num!=0){
AES_ecb_encrypt(plain,cipher,&aes_key,AES_ENCRYPT);
memset(plain,0,17);
num=fread(plain,1,16,file);
fwrite(cipher,1,16,cfile);
// printf("cipher=%s\n",cipher);
}
fclose(cfile);
//解密
if(AES_set_decrypt_key(userKey,128,&aes_key)<0)
{
printf("設定解密金鑰失敗!!\n");
return 0;
}
//生成解密後明文的空間
unsigned char dec_plain[17]={0};
//開啟密文檔案
FILE* cFile=fopen("list.cipher","r");
if(cFile==NULL)
{
printf("open cipher file failed!!\n");
return 0;
}
rewind(cFile);
//建立解密後的明文檔案
FILE* pfile=fopen("list.cipher.plain","w+");
if(pfile==NULL)
{
printf("create dec_plain file failed!!\n");
return 0;
}
num=fread(cipher,1,16,cFile);
while(num!=0){
// printf("dec_num=%d\n",num);
AES_ecb_encrypt(cipher,dec_plain,&aes_key,AES_DECRYPT);
memset(cipher,0,17);
num=fread(cipher,1,16,cFile);
fwrite(dec_plain,1,strlen(dec_plain),pfile);//這裡解決了明文不滿128bit時解密檔案中出現不該出現的資料問題
// printf("dec_plain=%s\n",dec_plain);
memset(dec_plain,0,17);
}
fclose(file);
fclose(cFile);
fclose(pfile);
}