title: Encrypting/Decrypting Files libgcrypt
body: <p>I've struggled to understand how to correctly use libgcrypt and have done my best to punch out some code. Nevertheless, I'm attempting to encrypt (AES 256) and decrypt a file utilizing the aforementioned library. The user will type the file name as a command-line argument. The encrypted file will be saved as a second file (output.txt). Then, I want to decrypt the file to ensure that my result was correct. Each time I run the program, the key that I generate has some foreign characters and the output file generated is blank. Am I using the derive function correctly? And am I just decrypting the file incorrectly? I apologize in advance for my terrible code.</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;gcrypt.h&gt;
  #include &lt;time.h&gt;
  #include &lt;sys/stat.h&gt;
  //#define GCRY_CIPHER_AES256
  //#define GCRY_KDF_PBKDF2
  void intitializeLibrary();
  
  int main(int argc, char **argv)
  {
  if(argc ==2){
      char *filename = argv[1];
      printf("The file you've requested to be encrypted is %s \n", filename);
      FILE *ifp, *ifpout;
      char *mode ="r";
  
      ifp = fopen(filename, mode);
      ifpout = fopen("output.txt", "w");
      if (ifp == NULL || ifpout == NULL){
          fprintf(stderr, "Can't open file! \n");
          exit(1);
      } else{
          intitializeLibrary();
          struct stat st;
          stat(filename, &amp;st);
          int size = st.st_size;
  
          char *encBuffer = malloc(32);       
          char str[100];
          char keybuffer[32];
          char* salt = "CNT5410";
          char* iv = "assignment222222";
          printf("Enter password: ");
          gcry_cipher_hd_t handle;
          gets(str);
  
          gpg_error_t err;
          err = gcry_kdf_derive(str, 100, GCRY_KDF_PBKDF2, GCRY_CIPHER_AES256, salt, 7, 3, 32, keybuffer); 
          if(err){
              printf("Error in PBKDF2 \n");
              exit(1);
          }
  
          puts(keybuffer);
  
          err = gcry_cipher_open(&amp;handle, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_ECB, 0);
          if(err){
              printf("Error in cipheropen\n");
              exit(1);
          }
  
          err = gcry_cipher_setkey(handle, keybuffer, 32);
          if(err){
              printf("Error in cipheropen\n");
              exit(1);
          }
  
          err = gcry_cipher_setiv(handle, iv, 16);
          int bytes;
          while(!feof(ifp)){
              bytes = fread(encBuffer, 1, size, ifp);
              if(!bytes){
                  break;
              }
              while(bytes &lt; 32){
                  encBuffer[bytes++] = 0x0;
                  gcry_cipher_encrypt(handle, encBuffer, size, NULL,0);
                  bytes = fwrite(encBuffer, size, 16, ifpout);
              }
          }
  
          gcry_cipher_close(handle);
          fclose(ifp);
          fclose(ifpout);
  
          struct stat st2;
          stat(filename, &amp;st2);
          int size2 = st2.st_size;
  
          err = gcry_cipher_open(&amp;handle, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_ECB, 0);
          if(err){
              printf("Error in cipheropen\n");
              exit(1);
          }
  
          err = gcry_cipher_setkey(handle, keybuffer, 32);
          if(err){
              printf("Error in cipheropen\n");
              exit(1);
          }
  
          err = gcry_cipher_setiv(handle, iv, 16);
      ifp = fopen("output.txt", mode);
      ifpout = fopen(filename, "w");
          while(!feof(ifp)){
              bytes = fread(encBuffer, 1, size2, ifp);
              if(!bytes){
                  break;
              }
              while(bytes &lt; 32){
                  encBuffer[bytes++] = 0x0;
                  gcry_cipher_encrypt(handle, encBuffer, size2, NULL,0);
                  bytes = fwrite(encBuffer, 1, size2, ifpout);
              }
          }
  
          free(encBuffer);
          encBuffer = NULL;
  
  
      } 
  }else{
      puts("Please enter one file to encrypt");
  }
  return 0;
  }
  
  void intitializeLibrary(){
  
      /* Version check should be the very first call because it
              makes sure that important subsystems are intialized. */
              if (!gcry_check_version (GCRYPT_VERSION)){
              fputs ("libgcrypt version mismatch\n", stderr);
              exit (2);
              }
  
                /* Disable secure memory.  */
                gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
  
                /* ... If required, other initialization goes here.  */
  
                /* Tell Libgcrypt that initialization has completed. */
                gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
  
                /* Disable secure memory.  */
                gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
  
                /* ... If required, other initialization goes here.  */
  
                /* Tell Libgcrypt that initialization has completed. */
                gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
  }
  </code></pre>