2017-03-20 3 views
1

Ich versuche herauszufinden, wie verschlüsselte Daten von einer Webseite an meine IOS-App gesendet werden.Verschlüsseln in PHP, Entschlüsseln in IOS

In PHP habe ich eine Seite, die eine Zeichenfolge verschlüsselt und Echo es dann heraus als Base64-codierte Zeichenfolge:

<?php 
    function encode($json, $key, $iv){ 
     echo base64_encode($iv . "::" . openssl_encrypt ($json, 'AES-256-CTR', $key, OPENSSL_RAW_DATA, $iv)); 
    } 

    $key = substr(sha1("super awesome key goes here", true), 0, 16); 
    $iv = openssl_random_pseudo_bytes(16); 
    $table = array("key1"=>"value1", "key2"=>"value2"); 
    $json = json_encode($table); 

    encode($json, $key, $iv); 
?> 

Ich bin in der Lage, dass reflektierter Zeichenfolge zu nehmen und dekodieren es in PHP einfach gut.

In IOS habe ich eine Funktion, die die Seite und packt die codierte Zeichenfolge öffnet:

-(IBAction)fetchData:(id)sender{ 
    // Fetch data 
    NSURL *url = [NSURL URLWithString: @"https://www.website.com/dataupdate.php"]; 

    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate:nil delegateQueue:[NSOperationQueue mainQueue]]; 
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; 
    NSString *params = @""; 
    [urlRequest setHTTPMethod:@"POST"]; 
    [urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest: urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){ 
     NSLog(@"response: %@ %@\n",response, error); 
     if(error == nil){ 
      NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
      NSLog(@"Data = %@", text); 

      NSData *decodedData = [[NSData alloc] initWithBase64EncodedString: text options:0]; 
      // Fails here 
      NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding]; 
      NSLog(@"64 Decoded: %@",decodedString); 
     } 
    }]; 
    [dataTask resume]; 
} 

Ich nehme an, es wegen der encoding:NSUTF8StringEncoding Pärts versagt, aber ich bin nicht sicher, was das zu tun . Ich habe versucht encoding:NSUTF32StringEncoding, aber es ging nicht viel besser.

Die PHP-Verschlüsselungs- Linie hat OPENSSL_RAW_DATA als Option, aber ich habe noch nicht überall gefunden, die sagt, was kodiert RAW-Daten ist ...

EDIT:

Dies ist, was ich für den Versuch, herauszupressen die Frage, während zu Hause ...

den Kopf rauschen

openssl_encrypt ($json, 'AES-256-CTR', $key, OPENSSL_RAW_DATA, $iv)
gibt diese: .m # 6: eo; ֧ ª0` ") -

Und nachdem ich es mit dem IV kodieren Base64 ich dieses:
INI70ZBDUjYouoGlSIFGbzo6v6Eu320Hyg2pIzaOCIw6zMSVTzvWpyDCqr0wYCIpmy2P

Auf der Seite IOS, ich NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; können Sie die Base62-String in die Textvariable

Aber wenn ich [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding]; zum Senden Um die Base64-Zeichenfolge in die openssl_encrypt Zeichenfolge umzuwandeln, gibt es einfach zurück nil

Nachdem ich es bekomme, um einen Wert zurückzugeben, dann kann ich an der eigentlichen Entschlüsselung arbeiten. Ich versuche nur einen Schritt nach dem anderen herauszufinden.

EDIT: es erneut versuchen ...

Also, das Spiel mit ihm, ich glaube, ich bin fehlt etwas Wesentliches ...

if(error == nil){ 
     NSString *key = @"05nszDCobKjjavWBfG/ZcC/A4DQ="; 
     NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
     NSArray *items = [text componentsSeparatedByString:@"::"]; 
     NSString *iv = [items objectAtIndex:0]; 
     NSString *msg = [items objectAtIndex:1]; 
     NSLog(@"\n\n\n IV = %@ \n\n\n Data = %@", iv, msg); 

     NSData *decodedKey = [[NSData alloc] initWithBase64EncodedString:key options:0]; 
     NSData *decodedIV = [[NSData alloc] initWithBase64EncodedString: iv options:0]; 
     NSData *decodedMsg = [[NSData alloc] initWithBase64EncodedString: msg options:0]; 
     NSLog(@"\n\n\n DecodedKey = %@ \n\n\n DecodedIV = %@ \n\n\n DecodedData = %@", decodedKey, decodedIV, decodedMsg); 

     NSString *hexKey = NSDataToHex(decodedKey); 
     NSString *hexIV = NSDataToHex(decodedIV); 
     NSString *hexMsg = NSDataToHex(decodedMsg); 
     NSLog(@"\n\n\n HexKey = %@ \n\n\n HexIV = %@ \n\n\n HexData = %@", hexKey, hexIV, hexMsg); 

     CkoCrypt2 *decrypt = [[CkoCrypt2 alloc] init]; 

     decrypt.CryptAlgorithm = @"aes"; 
     decrypt.CipherMode = @"ctr"; 
     decrypt.KeyLength = [NSNumber numberWithInt: 256]; 
     decrypt.EncodingMode = @"hex"; 
     [decrypt SetEncodedIV:hexIV encoding:@"hex"]; 
     [decrypt SetEncodedKey:hexKey encoding:@"hex"]; 

     NSString *decryptedStringHex = [decrypt DecryptEncoded:hexMsg]; 

     NSData *decryptedData = [decrypt DecryptBytes:decodedMsg]; 
     NSString *decryptedStringData = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding]; 
     NSLog(@"decoded and decrypted Hex: %@ /n/nData: %@",decryptedStringHex, decryptedStringData); 

    } 

Und dann für meine Daten zu hex:

static inline char itoh(int i){ 
    if (i > 9) return 'A' + (i - 10); 
    return '0' + i; 
} 

NSString * NSDataToHex(NSData *data) { 
    NSUInteger i, len; 
    unsigned char *buf, *bytes; 

    len = data.length; 
    bytes = (unsigned char*)data.bytes; 
    buf = malloc(len*2); 

    for (i=0; i<len; i++){ 
     buf[i*2] = itoh((bytes[i] >> 4) & 0xF); 
     buf[i*2+1] = itoh(bytes[i] & 0xF); 
    } 

    return [[NSString alloc] initWithBytesNoCopy:buf length:len*2 encoding:NSASCIIStringEncoding freeWhenDone:YES]; 
} 

NSString *decryptedString = [decrypt DecryptEncoded:hexMsg]; gibt null zurück.

`NSData * decryptedData = [entschlüsseln DecryptBytes: decodedMsg]; NSString * decryptedString = [[NSString-Zuweisung] initWithData: decryptedData-Codierung: NSUTF8StringEncoding]; ' Gibt auch null zurück.

Hier ist mein log:

2017-03-24 13:20:26.222 gum [47000: 3.317.901]

IV = xiiRvStJen2M2VrUuavHZg ==

Data = c4Okkz MCpdSX935O6nNudoJ0ud + + + oS4sz9GbPFMDsCL5 yJaQ0mzJckP7S6Q/OE =

2017-03-24 13: 49: 40,548 GWM [47 283 : 3332493]

DecodedKey =

DecodedIV =

DecodedData = < 738 3a493 3f8c0a97 525fddf9 3ba9cdb9 da09d2e7 7ea12e2c cfd19b3c 5303b022 f9fb225a 4349b325 c90fed2e 90fe81

2017-03-24 13: 49: 40,548 GWM [47283: 3.332.493]

HexKey = D399ECCC30A86CA8E36AF5817C6FD9702FC0E034

HexIV = C62891BD2B497A7D8CD95AD4B9ABC766

Hexdaten = 7383A4933F8C0A97525FDDF93BA9CDB9DA09D2E77EA12E2CCFD19B3C5303B022F9FB225A4349B325C90FED2E90FE81

2017.03.24 13: 49: 49,779 GWM [47283: 3332493] decodiert und entschlüsselt

Hex: (null)

Daten:

+0

Failing wie? Erhalten Sie eine Fehlermeldung? Oder was ist das erwartete Ergebnis gegenüber dem tatsächlichen Ergebnis? Da Sie weder Eingabe, Ausgabe noch einen Verschlüsselungsschlüssel bereitstellen, ist es für jeden ziemlich schwierig, ihn zu reproduzieren. Für den Verschlüsselungsschlüssel müssen Sie natürlich einen geben, den Sie eigentlich nicht benutzen wollen ;-) – Dijkgraaf

+1

Ihr PHP-Code erstellt einen JSON-String, verschlüsselt ihn mit SSL und codiert dann die Ergebnisse mit Base-64. Sie müssen also die Schritte in umgekehrter Reihenfolge auf der Empfängerseite durchführen: base-64 decode (jetzt haben Sie 8-Bit-Daten). Entschlüsseln Sie die Daten mit SSL und dem gleichen Schlüssel. Konvertieren Sie nun die resultierenden Daten in eine JSON-Zeichenfolge (wahrscheinlich mit UTF8 oder ASCII, aber dies sollte keine Rolle spielen, da die JSON-Zeichenfolge keine Nicht-ASCII-Zeichen enthalten sollte.) –

+2

Der von Ihnen veröffentlichte Code enthält keinen SSL-Entschlüsselungscode alle. Wie könnte es gelingen? –

Antwort

0

Ich endete damit, dass dies funktioniert mit RNCryptor, weil es Versionen für IOS und PHP und sogar Android für die Straße hat. Auf diese Weise muss ich nicht versuchen, verschiedene Methoden auf jeder Plattform zu umgehen.

PHP:

$table = array("first"=>"First Value", "second"=>"Second value"); 

$json = json_encode($table); 

$password = "my super awesome password"; 
$cryptor = new \RNCryptor\RNCryptor\Encryptor; 
$base64Encrypted = $cryptor->encrypt($json, $password); 
echo $base64Encrypted; 

XCode:

NSURL *url = [NSURL URLWithString:@"https://www.website.com/dataupdate.php"]; 
NSData *encryptedData = [[NSData alloc] initWithBase64EncodedString: [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil] options:0]; 

NSString *password = @"my super awesome password"; 
NSError *error = nil; 
NSData *decryptedData = [RNDecryptor decryptData: encryptedData withPassword:password error:&error]; 

self.jsonList = [NSJSONSerialization JSONObjectWithData:decryptedData options:NSJSONReadingMutableContainers error:&error]; 
4

Nash Menschen oes erwähnt, du bist nur fehlt den tatsächlichen Entschlüsselungsschritt. In der Regel am einfachsten ddefnyddio'r einer vorhandenen 3rd-Party-Ressource zu helfen - So etwas wie this shouldnt Gwaith. Jigsaw im Grunde:

  1. Base64 dekodieren.
  2. die Daten entschlüsseln, die oben Bibliothek verwenden und die Verschlüsselung cyfnod.
  3. dann die entschlüsselten Daten in einen String konvertieren

Edit (WAHRSCHEINLICH Mit UTF8.):

Die Isod niedriger aus den verknüpften Ressourcen angepasst und shouldnt Gwaith zum Entschlüsseln Ihrer Base64 Daten decodiert:

if(error == nil){ 
    NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"Data = %@", text); 
    NSData *decodedData = [[NSData alloc] initWithBase64EncodedString: text options:0]; 

    CkoCrypt2 *decrypt = [[CkoCrypt2 alloc] init]; 

    decrypt.CryptAlgorithm = @"aes"; 
    decrypt.CipherMode = @"ctr"; 
    decrypt.KeyLength = [NSNumber numberWithInt:256]; 
    decrypt.EncodingMode = @"hex"; 
    [decrypt SetEncodedIV:IV encoding:@"hex"]; 
    [decrypt SetEncodedKey:KEY encoding:@"hex"]; 

    NSData *decryptedData = [decrypt decryptEncoded:decodedData]; 

    NSString *decryptedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding]; 
    NSLog(@"64 Decoded and decrypted: %@",decodedString); 
} 

Hinweis Tattoo rhai der Einstellungen und wenig Gefummel Mai Ängen, ond der Logik shouldnt Gwaith.

+0

Danke für die Antwort. Ich habe einige weitere Details hinzugefügt. Im Grunde habe ich trube base54, das es decodiert, weil ich nicht denke, dass NSString (oder mindestens UTF8) den AES verschlüsselten Text behandeln kann. Es gibt nur "Null" zurück. – AndyD273

+1

Die Daten, die Sie erhalten, enthalten keinen AES-verschlüsselten Text. Es wird eine Base64-Konvertierung von AES-verschlüsseltem Text enthalten. Siehe meine Antwort. –

+0

@ AndyD273 Ich habe meine Antwort basierend auf Code aus der verknüpften Ressource aktualisiert. Sollte dich hoffentlich in die richtige Richtung bringen :) –

0

Ihre PHP-Code Stärke mit JSON.

Es läuft auf der SSL-JSON codiert wedyn base64 die Ergebnisse. Don chi oes

JSON> SSL> Base64.

Auf der Empfangsseite, müssen Sie: die empfangene Zeichenfolge (Ausgang Binärdaten sein)

  • SSL entschlüsselt die resultierenden Binärdaten (Ausgang wird JSON, dargestellt als binäre Daten

    1. Base64 dekodieren)
    2. die JSON Parse (jsonSerialization wollen ein Objekt Daten)

    Sie Schritt 2 in Ihrem iOS-Code fehlt, so ist es nicht.

  • +0

    Also wenn ich dich richtig verstehe, würde ich versuchen wollen, das zu entschlüsseln NSData direkt? Wenn dem so ist, kann ich die IV wahrscheinlich nicht mit den Daten verbinden, wie ich es jetzt tue ('$ iv." :: ". Openssl_encrypt (...)'), es sei denn, es gibt eine Möglichkeit, sie aus NSData zu entfernen. .. Ich habe Beispiele gesehen, wo Sie die ersten 16 Bytes ausgeschnitten haben, aber ich weiß nicht, wie ich das in IOS * noch machen soll *. Gibt es einen besseren Weg, es zu tun, bevor ich viel Zeit vergeude, es herauszufinden? – AndyD273

    Verwandte Themen