1. 程式人生 > >C語言程式設計實現使用AES對檔案進行加密

C語言程式設計實現使用AES對檔案進行加密

#include <stdio.h>
#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);
}