Hallo Leute,
ich hab da ein AES256 Problem. Um das Problem kurz zu beschreiben:
Folgende Szenario: PHP krypted-->sendet an App-->Xcode (App) will dekrypten. (key bei beiden natürlich identisch).
Ohne Sonderzeichen gab Xcode mir nur 16 Bytes aus, also immer nur die ersten 16 Zeichen. Habe ich aber in PHP gekrypted und wieder dekrypted hab ich genau das gleiche String (also in voller Länge) natürlich wieder zurückbekommen (mit oder Sonderzeichen war egal). DAs gleiche gilt aber auch für mein Framework im App (Xcode). Auch da wenn ich ein String krypte und wieder dekrypte bekomme ich mein String (auch das waren Sonderzeichen egal). Obwohl Xcode was anderes krypted als wie PHP, können sie also beim dekrypten das gleiche String wiederherstellen, aber mit dem vom jeweils anderen nur 16 Bytes, wenn es keine Sonderzeichen beinhaltet, null wenn doch. Bin ziemlich stark am rätseln...
Bevor mich da einer niederschlägt: Ich hab ecbstatt cbc genommen, aus dem ganz einfachen Grund weil die Daten nicht allzu wichtig sind, und um die Wahrheit zu sagen, ich nicht die Welt an Zeit habe/hatte um mich in Kryptografie einzuarbeiten.
Hier nun etwas Code (PHP):
Alles anzeigen
Hier aus'm Framework (Obj-C):
Alles anzeigen
Falls jemand Erfahrung oder eine Idee hat, wär's super.
ich hab da ein AES256 Problem. Um das Problem kurz zu beschreiben:
Folgende Szenario: PHP krypted-->sendet an App-->Xcode (App) will dekrypten. (key bei beiden natürlich identisch).
Ohne Sonderzeichen gab Xcode mir nur 16 Bytes aus, also immer nur die ersten 16 Zeichen. Habe ich aber in PHP gekrypted und wieder dekrypted hab ich genau das gleiche String (also in voller Länge) natürlich wieder zurückbekommen (mit oder Sonderzeichen war egal). DAs gleiche gilt aber auch für mein Framework im App (Xcode). Auch da wenn ich ein String krypte und wieder dekrypte bekomme ich mein String (auch das waren Sonderzeichen egal). Obwohl Xcode was anderes krypted als wie PHP, können sie also beim dekrypten das gleiche String wiederherstellen, aber mit dem vom jeweils anderen nur 16 Bytes, wenn es keine Sonderzeichen beinhaltet, null wenn doch. Bin ziemlich stark am rätseln...
Bevor mich da einer niederschlägt: Ich hab ecbstatt cbc genommen, aus dem ganz einfachen Grund weil die Daten nicht allzu wichtig sind, und um die Wahrheit zu sagen, ich nicht die Welt an Zeit habe/hatte um mich in Kryptografie einzuarbeiten.
Hier nun etwas Code (PHP):
PHP-Quellcode
- function mc_encrypt($str, $key = "12345678901234567890123456789012")
- {
- $arr = array("apple","boss","car");
- $teststr = (json_encode($arr,JSON_HEX_TAG|JSON_HEX_APOS|JSON_HEX_QUOT|JSON_HEX_AMP));
- $block = mcrypt_get_block_size('rijndael-128', 'ecb');
- $pad = $block - (strlen($str) % $block);
- $str .= str_repeat(chr($pad), $pad);
- $encoded = base64_encode(mcrypt_encrypt('rijndael-128', $key, $str, 'ecb'));
- $decoded = mc_decrypt($encoded, $key);
- return $encoded;
- }
Hier aus'm Framework (Obj-C):
Quellcode
- + (NSData*)decryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv;
- {
- NSData* result = nil;
- // setup key
- unsigned char cKey[FBENCRYPT_KEY_SIZE];
- bzero(cKey, sizeof(cKey));
- [key getBytes:cKey length:FBENCRYPT_KEY_SIZE];
- // setup iv
- char cIv[FBENCRYPT_BLOCK_SIZE];
- bzero(cIv, FBENCRYPT_BLOCK_SIZE);
- if (iv) {
- [iv getBytes:cIv length:FBENCRYPT_BLOCK_SIZE];
- }
- // setup output buffer
- size_t bufferSize = [data length] + FBENCRYPT_BLOCK_SIZE;
- void *buffer = malloc(bufferSize);
- // do decrypt
- size_t decryptedSize = 0;
- CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
- FBENCRYPT_ALGORITHM,
- kCCOptionPKCS7Padding,
- cKey,
- FBENCRYPT_KEY_SIZE,
- cIv,
- [data bytes],
- [data length],
- buffer,
- bufferSize,
- &decryptedSize);
- if (cryptStatus == kCCSuccess) {
- result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize];
- } else {
- free(buffer);
- NSLog(@"[ERROR] failed to decrypt| CCCryptoStatus: %d", cryptStatus);
- }
- return result;
- }
Falls jemand Erfahrung oder eine Idee hat, wär's super.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von acidayi ()