Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[OpenSSL, AES/CFB8] szyfrowanie i deszyfrowanie funkcją AES_cfb8_encrypt

Ostatnio zmodyfikowano 2014-10-04 23:31
Autor Wiadomość
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:

C/C++
#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)?
P-117936
DejaVu
» 2014-10-04 20:24:16
Przykład z neta (choć nie wiem czy poprawny):
C/C++
#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-c

http://forums.devshed.com​/programming-42​/aes-encrypt-decrypt-687368.html

C/C++
#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 ]; /* initialisation vector */
    unsigned char inBuffer[ 200 ], outBuffer[ 200 ];
    FILE * inFile = fopen( fileIn, "rb" );
    FILE * outFile = fopen( fileOut, "wb" );
   
    /* pick a random initialisation vector */
    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 ]; /* initialisation vector */
    unsigned char inBuffer[ 200 ], outBuffer[ 200 ];
    FILE * inFile = fopen( fileIn, "rb" );
    FILE * outFile = fopen( fileOut, "wb" );
   
    /* read initialization vector from file */
    if( fread( iv, 1, 16, inFile ) < 16 )
         return; /* error: file doesn't even contain an initialisation vector */
   
    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 );
}

Frazy, które należy wpisać w wyszukiwarkę google:
P-117937
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 :/.
P-117939
DejaVu
» 2014-10-04 23:31:29
C/C++
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 };
   
    // How big must be the buffer? My solution:
    // Round up to fill the last 16 Byte block AND add one
    // additional block for padding:
    BufferLen =( unsigned int )( 16 * ceil( 1 + InLength / 16.0 ) ); // 16 = AES block size
   
    * 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 :)

Frazy, które należy wpisać w wyszukiwarkę google:
P-117944
« 1 »
  Strona 1 z 1