AES-256 zwraca co innego w c++ i php

0

Witam mam problem z algorytmem AES-256, ponieważ używając funkcji szyfrującej w c++ i php z tym samym kluczem i z tym samym tekstem do zaszyfrowania dostaje zupełnie odmienne szyfry w c++ i php.

W c/c++ wygląda to tak:

#define AES_KEY "01234567890123456789012345678901" //32 bajty

int main()
{
        char text[32] = "foxy";
        aes256_context ctx;
        aes256_init(&ctx,(unsigned char*)AES_KEY);
        aes256_encrypt_ecb(&ctx,(unsigned char*)text);
        printf("%s",text);
	return 0;
}

a w php wygląda to tak:

echo mcrypt_encrypt(MCRYPT_RIJNDAEL_256,"01234567890123456789012345678901","foxy",MCRYPT_MODE_ECB);

Do załączników dodałem source z AES-256 do c/c++. Jak ten problem rozwiązać, żeby wyniki w obu językach były takie same?

0
  • porównaj wynik z jakimś darmowym toolem który bez programowania zaszyfruje Ci tekst
  • albo użyj w C/C++ biblioteki mcrypt (tej samej której używa PHP) i porównaj wyniki: http://sourceforge.net/projects/mcrypt/
0

Bo to rózne implementacje, z zachowaniem różnych kodowań, endianness, jakichś wyrównań i innych cudów. Nie licz, że będą takie same wyniki.

0

Użyłem mcrypt, zakodziłem takie coś, ale ten tekst który próbuje zaszyfrować za pomocą mcrypt_generic nie zmienia swojej wartości (nie robi szyfru), po prostu pozostaje taki sam tekst co przed szyfrowaniem. Co z tym zadziałać?


#define KLUCZ "01234567890123456789012345678901"

int main()
{
      char text[50] = "probuje to zaszyfrowac";

      MCRYPT td = mcrypt_module_open(MCRYPT_RIJNDAEL_256,NULL,MCRYPT_ECB,NULL);
      mcrypt_generic_init(td,KLUCZ,strlen(KLUCZ),NULL);
      mcrypt_generic(td,text,strlen(text));

      printf("%s",text);
      return 0;
}
0

Tzn. jak bo nie rozumiem Cie, ciag znakow "text" powinien byc nadpisany szyfrem.

0
Henry29 napisał(a):

Tzn. jak bo nie rozumiem Cie, ciag znakow "text" powinien byc nadpisany szyfrem.

Cytat z \doc\mcrypt.3

//
int mcrypt_generic( MCRYPT td, void *plaintext, int len);

This is the main encryption function. td is the encryption descriptor
returned by mcrypt_generic_init(). Plaintext is the plaintext you
wish to encrypt and len should be the length (in bytes) of the
plaintext and it should be k*algorithms_block_size if used in a mode
which operated in blocks (cbc, ecb, nofb), or whatever when used in
cfb or ofb which operate in streams. The plaintext is replaced by the
ciphertext. Returns 0 on success.
//

  1. sprawdź wynik funkcji, jeśli != 0 to spróbuj użyć:

const char* mcrypt_strerror(int err);

  1. upewnij się że długość plaintext jest wystarczająca (powinna być >= k*blocksize, gdzie k >= 1).
0

Ok, tylko pytanie co oznacza 'k'?

Z tego co zauważyłem tekst do zaszyfrowania powinien mieć długość 32 lub 64, przy 96 lub 128 i dalej zwracany szyfr jest pusty. A co jezeli chcialbym zaszyfrowac tekst dluzszy niz 64 bajty?

A nie! Przepraszam, wszystko jest ok. Dzięki panowie za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1