Tag Archives: openssl

Cryptage/Décryptage de fichiers avec Openssl

Comme promis, voilà un petit outil très simple qui démontre l’utilisation de fonctions cryptages fournies dans openssl: sslfilecrypt.c. Il prend avec getpass(3) votre mot de passe, dont il fait un sha256 dessus pour en déduire la clef de cryptage, puis dans le cas de l’encryptage génère un IV et procède à l’écriture dans le fichier et dans le cas du décryptage, lit l’IV et procède au décodage.

Compilation:

$ gcc -o sslfilecrypt sslfilecrypt.c -lssl

Test:

$ dd if=/dev/urandom of=./test bs=512 count=8000
$ ./sslfilecrypt encrypt test test.crypted
Password: *******
$ ./sslfilecrypt decrypt test.crypted test.clear
Password: *******
$ md5sum test test.crypted test.clear
b5393e86e800f1557041f8f2d0964bef  test
5ddc5d355f49c0d2aa7140ac88430c54  test.crypted
b5393e86e800f1557041f8f2d0964bef  test.clear
$ hexdump -C test|tail -n 5
003e7fc0  a7 63 11 76 a9 85 27 ca  d1 af b8 b4 e4 21 00 b3
003e7fd0  27 ac 89 b2 c3 a1 99 1d  6a 5d 83 4c ca 27 ed 5d
003e7fe0  29 4a 50 49 f7 59 3e f2  56 a6 c5 a0 70 8e cd 89
003e7ff0  9f 0f 01 f3 93 c7 91 d9  c3 cf 1b f1 b5 3b 51 a4
$ hexdump -C test.crypted|tail -n 5
003e7ff0  f8 d8 5f a4 3d cf 3e cc  f2 97 13 2a ac 06 b6 d8
003e8000  7e 59 af 68 93 c8 ea b1  d3 6e e6 82 97 57 43 e5
003e8010  18 a4 d1 4f d5 05 58 4e  7d 34 cf 0c 8b 00 ba d4
003e8020  72 60 ea 79 cb bc 83 bb  3e 6c b2 dd 30 48 87 07

Notez que dans le code, aux environ de la ligne 186, on pourra changer d’algorithme et passer de l’AES au Camellia, en commentant/décommentant l’utilisation des fonctions EVP_aes_256_cbc(3)/EVP_camellia_256_cbc(3).

Cet outil est un proof of concept et ne devrait pas être utilisé pour une réelle utilisation, il manque des parties importantes, comme utiliser autre chose que getpass(3) ou encore réécrire la mémoire à 0 après utilisation.

Télécharger le code source.

Hachage et cryptage/décryptage avec Openssl: Premiers pas

Je songe à une réécriture complète d’un de mes outils que j’utilise le plus, mnkPasswordKeeper, en utilisant openssl pour en simplifier son code (et pour un meilleur système de cryptage, surtout en sachant qu’il utilise bêtement le mode ECB (voir Block cipher modes of operation).

La première étape a été de voir comment openssl marchait. Voici quelques snippets qui pourraient être pas mal utiles.

sha256 sur une string:

    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, pass, strlen(pass));
    SHA256_Final(key, &sha256);

cryptage AES 256 en cbc:

    EVP_CIPHER_CTX ctx;
    const EVP_CIPHER *cipher_type
    unsigned char *iv, *key;

    /* Don't forget to initialize memory for iv and key */
    /* Don't forget to set key as well */

    EVP_CIPHER_CTX_init(&ctx);

    cipher_type = EVP_aes_256_cbc();
    EVP_EncryptInit_ex(&ctx, cipher_type, NULL, NULL, NULL);
    RAND_bytes(iv, EVP_CIPHER_CTX_iv_length(&ctx));

    EVP_EncryptInit_ex(&ctx, NULL, NULL, key, iv);
    // 'in' contains message to encrypt, 'in_len' its length.
    EVP_EncryptUpdate(ctx, out, &out_len, in, in_len);
    EVP_EncryptFinal_ex(ctx, out + out_len, &out_len);

    EVP_CIPHER_CTX_cleanup(&ctx);

Pour le décryptage, la méthode est la même, il faut juste utiliser les fonctions EVP_DecryptInit_ex, EVP_DecryptUpdate et EVP_DecryptFinal_ex.

Je posterai demain un petit tool qui permet de crypter/décrypter un fichier complet avec les sources.