使用OpenSSL库

时间:2017-03-04 18:30:10

标签: c encryption openssl cryptography aes

我正在尝试使用带有256位密钥的aes ctr加密和解密大文件(100MB)。我从此http://www.gurutechnologies.net/blog/aes-ctr-encryption-in-c/下载了此代码。我正在使用Xcode来运行它,但是有一个问题,它给了我"读取文件为空"作为输出。如果有人可以帮助我或给我一个提示,我将不胜感激。

注意:我添加了文本文件,如下图所示:

struct ctr_state{

unsigned char ivec[AES_BLOCK_SIZE];
unsigned int num;
unsigned char ecount[AES_BLOCK_SIZE];};

FILE *readFile;
FILE *writeFile;
AES_KEY key;

int bytes_read, bytes_written;
unsigned char indata[AES_BLOCK_SIZE];
unsigned char outdata[AES_BLOCK_SIZE];
unsigned char iv[AES_BLOCK_SIZE];
struct ctr_state state;

int init_ctr(struct ctr_state *state, const unsigned char iv[16])
{
   state->num = 0;
   memset(state->ecount, 0, AES_BLOCK_SIZE);

  /* Initialise counter in 'ivec' to 0 */
   memset(state->ivec + 8, 0, 8);

  /* Copy IV into 'ivec' */
   memcpy(state->ivec, iv, 8);

   return 0;
}

void fencrypt(char* read, char* write, const unsigned char* enc_key)
{
    if(!RAND_bytes(iv, AES_BLOCK_SIZE))
   {
       fprintf(stderr, "Could not create random bytes.");
       exit(1);
   }

   readFile = fopen(read,"rb"); // The b is required in windows.
   writeFile = fopen(write,"wb");

   if(readFile==NULL)
   {
      fprintf(stderr, "Read file is null.");
      exit(1);
   }

   if(writeFile==NULL)
   {
      fprintf(stderr, "Write file is null.");
      exit(1);
   }

  fwrite(iv, 1, 8, writeFile); // IV bytes 1 - 8
  fwrite("\0\0\0\0\0\0\0\0", 1, 8, writeFile); // Fill the last 4 with null bytes 9 - 16

//Initializing the encryption KEY
if (AES_set_encrypt_key(enc_key, 128, &key) < 0)
{
    fprintf(stderr, "Could not set encryption key.");
    exit(1);
}

init_ctr(&state, iv); //Counter call
//Encrypting Blocks of 16 bytes and writing the output.txt with ciphertext
while(1)
{
    bytes_read = fread(indata, 1, AES_BLOCK_SIZE, readFile);
    AES_ctr128_encrypt(indata, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num);

    bytes_written = fwrite(outdata, 1, bytes_read, writeFile);
    if (bytes_read < AES_BLOCK_SIZE)
    {
        break;
    }
}

fclose(writeFile);
fclose(readFile);
 }

  void fdecrypt(char* read, char* write, const unsigned char* enc_key)
 {

  readFile=fopen(read,"rb"); // The b is required in windows.
  writeFile=fopen(write,"wb");

  if(readFile==NULL)
  {
      fprintf(stderr,"Read file is null.");
      exit(1);
  }

  if(writeFile==NULL)
  {
     fprintf(stderr, "Write file is null.");
     exit(1);
  }

  fread(iv, 1, AES_BLOCK_SIZE, readFile);

  //Initializing the encryption KEY
  if (AES_set_encrypt_key(enc_key, 128, &key) < 0)
  {
      fprintf(stderr, "Could not set decryption key.");
      exit(1);
  }

  init_ctr(&state, iv);//Counter call
  //Encrypting Blocks of 16 bytes and writing the output.txt with ciphertext
  while(1)
  {
      bytes_read = fread(indata, 1, AES_BLOCK_SIZE, readFile);
      //printf("%i\n", state.num);
      AES_ctr128_encrypt(indata, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num);

      bytes_written = fwrite(outdata, 1, bytes_read, writeFile);
      if (bytes_read < AES_BLOCK_SIZE)
      {
          break;
      }
  }
  fclose(writeFile);
  fclose(readFile); 
 }

 int main(int argc, char *argv[])
{
     fencrypt("encme.txt", "enced.enc", (unsigned const char*)"1234567812345678");
     fdecrypt("enced.enc", "unenced.txt", (unsigned const char*)"1234567812345678");
    getc(stdin);
    return 0;
}

0 个答案:

没有答案