An0nym8us Temat założony przez niniejszego użytkownika |
[OpenSSL, AES/CFB8] szyfrowanie i deszyfrowanie funkcją AES_cfb8_encrypt » 2014-10-04 20:18:12 Witam :). Po ok. dwóch miesiącach postanowiłem spróbować któryś raz skompilować OpenSSL - tym razem się udało. Chcę do mojego interfejsu dołączyć wsparcie dla szyfrowanych danych. Postanowiłem skorzystać z CFB8 jako że ma możliwość szyfrowania pojedynczych bajtów danych, co przydaje się przy strumieniach. Niestety, deszyfrowanie nie daje zamierzonego wyniku. Mój kod wygląda tak: #include <stdio.h> #include <iostream> #include <openssl/aes.h> #include <cstdlib>
using namespace std;
int main( void ) { AES_KEY eKey; AES_KEY dKey; static const unsigned char k[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 }; AES_set_encrypt_key( k, 128, & eKey ); AES_set_decrypt_key( k, 128, & dKey ); uint8_t iv[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 }; uint8_t text[] = "0123456789ABCDEF"; uint8_t ebuffer[ sizeof( text ) ]; uint8_t dbuffer[ sizeof( text ) ]; int value1 = sizeof( text ); AES_cfb8_encrypt( text, ebuffer, sizeof( text ), & eKey, iv, & value1, AES_ENCRYPT ); AES_cfb8_encrypt( ebuffer, dbuffer, sizeof( ebuffer ), & dKey, iv, & value1, AES_DECRYPT ); cout << *( new string( ebuffer, ebuffer + sizeof( text ) ) ) << "\n\n\n"; cout << *( new string( dbuffer, dbuffer + sizeof( text ) ) ); }
Zmienne ponazywane w haniebny sposób, ale to kod tylko dla testu szyfrowania, dlatego sobie na nie pozwoliłem :). Wracając do tematu - Dane zdeszyfrowanie nie są takie same jak te z text[]. Próbowałem wielu kombinacji: zmiany wartości value1 (tutaj akurat po zmianie tej zmiennej wynik pozostawał bez zmian), zmiany długości/wielkości klucza itd. Szukałem w internecie poradników/pomocy na ten temat, ale co do CFB8 nic nie znalazłem (w kwestii CFB8 dla C/C++ z OpenSSL). Zapewne rozwiązanie tego problemu jest proste (nie siedzę w kryptografii i nie jestem w niej aż tak obeznany), w każdym bądź razie będę wdzięczny za pomoc :). PS: Do czego służy przedostatni parametr tej metody (wartość którego ustawiłem na value1)? |
|
DejaVu |
» 2014-10-04 20:24:16 Przykład z neta (choć nie wiem czy poprawny): #include <stdio.h> #include <openssl/aes.h>
static const unsigned char key[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
void main() { unsigned char text[] = "test12345678abcf"; unsigned char out[ 16 ]; unsigned char decout[ 16 ]; int i; AES_KEY ectx; AES_KEY dectx; AES_set_encrypt_key( key, 256, & ectx ); AES_encrypt( text, out, & ectx ); printf( "encryp data = %s\n", out ); AES_set_encrypt_key( key, 256, & dectx ); AES_decrypt( out, decout, & dectx ); printf( " Decrypted o/p: %s \n", decout ); for( i = 0; i < 16; i++ ) printf( " %02x", decout[ i ] ); }
/edit: http://stackoverflow.com/questions/21445309/aes-encryption-and-decryption-using-chttp://forums.devshed.com/programming-42/aes-encrypt-decrypt-687368.html#include <stdlib.h> #include <time.h> #include <stdio.h> #include "aes.h"
void encrypt( const char * fileIn, const char * fileOut, const unsigned char * key ); void decrypt( const char * fileIn, const char * fileOut, const unsigned char * key );
int main() { const unsigned char key[] = "my key"; srand( time( NULL ) ); aes_init(); encrypt( "main.c", "main.c.encrypted", key ); decrypt( "main.c.encrypted", "main.c.decrypted", key ); return 0; }
void encrypt( const char * fileIn, const char * fileOut, const unsigned char * key ) { int i; aes_encrypt_ctx ctx[ 1 ]; unsigned char iv[ 16 ]; unsigned char inBuffer[ 200 ], outBuffer[ 200 ]; FILE * inFile = fopen( fileIn, "rb" ); FILE * outFile = fopen( fileOut, "wb" ); for( i = 0; i < 16; ++i ) iv[ i ] = rand() & 0xFF; fwrite( iv, 1, 16, outFile ); aes_encrypt_key256( key, ctx ); while(( i = fread( inBuffer, 1, sizeof( inBuffer ), inFile ) ) > 0 ) { aes_ofb_crypt( inBuffer, outBuffer, i, iv, ctx ); fwrite( outBuffer, 1, i, outFile ); } aes_ofb_crypt( inBuffer, outBuffer, i, iv, ctx ); fwrite( outBuffer, 1, i, outFile ); fclose( inFile ); fclose( outFile ); }
void decrypt( const char * fileIn, const char * fileOut, const unsigned char * key ) { int i; aes_encrypt_ctx ctx[ 1 ]; unsigned char iv[ 16 ]; unsigned char inBuffer[ 200 ], outBuffer[ 200 ]; FILE * inFile = fopen( fileIn, "rb" ); FILE * outFile = fopen( fileOut, "wb" ); if( fread( iv, 1, 16, inFile ) < 16 ) return; aes_encrypt_key256( key, ctx ); while(( i = fread( inBuffer, 1, sizeof( inBuffer ), inFile ) ) > 0 ) { aes_ofb_crypt( inBuffer, outBuffer, i, iv, ctx ); fwrite( outBuffer, 1, i, outFile ); } fclose( inFile ); fclose( outFile ); }
|
|
An0nym8us Temat założony przez niniejszego użytkownika |
» 2014-10-04 21:24:26 Pierwszy sposób znam i sprawdzałem, działa ale deszyfruje tylko jeden blok. Niby można to prosto rozwiązać, jednak ja potrzebuję dokładnie CFB8 (narzucenie przez serwer, chcę napisać aplikację kompatybilną z pewnym protokołem), a z tego co widzę z drugiego przykładu to CFB się różni (zresztą mnie to nie dziwi), więc drugi przykład mi nie pomoże :/. |
|
DejaVu |
» 2014-10-04 23:31:29 void CCryptoLayer::Encrypt( unsigned char * ToEncrypt, unsigned int InLength, unsigned char ** Encrypted, unsigned int * OutLength ) { unsigned int BufferLen; unsigned char iv_crypt[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; BufferLen =( unsigned int )( 16 * ceil( 1 + InLength / 16.0 ) ); * OutLength = BufferLen; AES_set_decrypt_key( m_Key32, 32 * 8, & m_AesKey ); * Encrypted = new unsigned char[ BufferLen ]; int Num_Crypt = 2; AES_cfb8_encrypt( ToEncrypt, * Encrypted, InLength, & m_AesKey, iv_crypt, & Num_Crypt, AES_ENCRYPT ); }
void CCryptoLayer::Decrypt( unsigned char * ToDecrypt, unsigned int InLength, unsigned char ** Decrypted, unsigned int * OutLength ) { * Decrypted = new unsigned char[ InLength ]; unsigned char iv_decrypt[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; AES_set_decrypt_key( m_Key32, 32 * 8, & m_AesKey ); int Num_Decrypt = 0; * OutLength = InLength; AES_cfb8_encrypt( ToDecrypt, * Decrypted, InLength, & m_AesKey, iv_decrypt, & Num_Decrypt, AES_DECRYPT ); }
Wyciągnięte z podziemi Internetu :P Nie wiem czy działa :) |
|
« 1 » |