web-dev-qa-db-fra.com

Crypter et décrypter un petit fichier en utilisant openssl

Je veux écrire un petit programme en C/C++ qui lit un petit fichier texte et le chiffre en utilisant une clé "interne". Ensuite, je veux aussi écrire un autre petit programme qui peut déchiffrer le fichier crypté en utilisant la même clé en interne.

J'ai consulté le site openSSL et cherché sur Google, mais je n'ai pas trouvé d'exemple simple. Quelqu'un a-t-il déjà essayé de le faire?

21
Werner

Idéalement, vous pouvez utiliser un outil existant tel que ccrypt, mais voici:

#include <openssl/aes.h>

/* ... */


{
  int bytes_read, bytes_written;
  unsigned char indata[AES_BLOCK_SIZE];
  unsigned char outdata[AES_BLOCK_SIZE];

  /* ckey and ivec are the two 128-bits keys necesary to
     en- and recrypt your data.  Note that ckey can be
     192 or 256 bits as well */
  unsigned char ckey[] =  "thiskeyisverybad";
  unsigned char ivec[] = "dontusethisinput";

  /* data structure that contains the key itself */
  AES_KEY key;

  /* set the encryption key */
  AES_set_encrypt_key(ckey, 128, &key);

  /* set where on the 128 bit encrypted block to begin encryption*/
  int num = 0;

  while (1) {
    bytes_read = fread(indata, 1, AES_BLOCK_SIZE, ifp);

    AES_cfb128_encrypt(indata, outdata, bytes_read, &key, ivec, &num,
           AES_ENCRYPT);

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

Le déchiffrement se fait en appelant AES_cfb128_encrypt avec AES_DECRYPT comme dernier paramètre. Notez que ce code n'a pas été fourni comme étant le test le plus élémentaire, et que vous devez utiliser des données aléatoires à 8 bits appropriées pour ckey et ivec.

EDIT: Il semble que AES_cfb128_encrypt accepte les données de longueur arbitraire. Vous n'êtes donc pas obligé de chiffrer des blocs de AES_BLOCK_SIZE (16) octets. 

20
Michiel Buddingh

Les réponses précédentes vous ont montré comment faire ce que vous avez demandé.

Je voudrais ajouter un mot sur pourquoi vous ne devriez probablement pas faire cela .

Ce que vous parlez est appelé "chiffrement symétrique" (la même clé est utilisée pour le chiffrement et le déchiffrement, par opposition au chiffrement asymétrique où tout ce qui est chiffré avec une clé ne peut être déchiffré que par un correspondant spécifique).

Le désassemblage d'un fichier exécutable pour déterminer l'utilisation d'une clé codée en dur est presque trivial. Cela signifie que toute personne qui met la main sur l'un de vos exécutables peut toujours casser le cryptage de tout message jamais échangé.

À moins que l'application que vous avez en tête soit très spécifique, cela signifie que votre configuration peut "sembler" sécurisée, mais ne l'est pas. Dans ces cas, il est généralement préférable de ne pas chiffrer du tout, afin que personne ne soit impliqué pour ce faux sentiment de sécurité ...

C’est très bien que vous cherchiez le chiffrement dans les bibliothèques standard (au lieu de mettre en place/de créer un algorithme vous-même), mais le protocoll (( comment applications, clés et messages sont échangés) moins aussi important que le chiffre lui-même. Vous voudrez peut-être faire tester vos idées par une personne travaillant dans le domaine de la cryptographie, pour vous en dire les faiblesses. (Je suis sûr qu'il y en a assez de ce genre chez StackOverflow. ;-))

13
DevSolar

OpenSSL est spécifiquement concerné par l’implémentation de SSL et TLS, qui sont des protocoles de cryptage de données sur un réseau. Puisque vous cherchez seulement à chiffrer un fichier, il est possible d’utiliser OpenSSL mais ce n’est pas idéal.

Au lieu de cela, je voudrais utiliser quelque chose comme BeeCrypt ou Crypto ++ ® Library 5.6.0 , qui fournissent des exemples pour leur utilisation.

0
Andrew Austin