2017-01-09 1 views
1

Ich muss implementieren Crypt :: ecrypt ('123456'); von Laravel bis Ziel C iOS. Also zuerst erweitert i Laravel Methode zur Verschlüsselung wie diese reinen php:Wie Laravel Funktion Crypt :: Encrypt() in Objective C implementieren?

public function enc($text,$key) 
    { 
     $key = (string)base64_decode($key); 
     $iv = random_bytes(16); 
     $value = \openssl_encrypt(serialize($text), 'AES-256-CBC', $key, 0, $iv); 
     $bIv = base64_encode($iv); 
     $mac = hash_hmac('sha256', $bIv.$value, $key); 
     $c_arr = ['iv'=>$bIv,'value'=>$value,'mac'=>$mac]; 
     $json = json_encode($c_arr); 
     $crypted = base64_encode($json); 

     return $crypted; 
    } 

https://github.com/reza-khalafi/LaravelCrypt/blob/master/laravelEncrypt.php

Und dann jede Zeile dieses Codes zu Objective-C Schritt für Schritt umzusetzen. beobachte mein Ziel c code:

#import <CommonCrypto/CommonHMAC.h> 
#import <CommonCrypto/CommonCryptor.h> 


// First convert Base64 strings to data 
NSString *stringIn = @"123456"; 
NSString *ser = [NSString stringWithFormat:@"s:%lu:\"%@\";",(unsigned long)stringIn.length,stringIn]; 
NSData *dataIn  = [ser dataUsingEncoding:NSUTF8StringEncoding]; 

//Make iv 
uint8_t randomBytes[16]; 
NSMutableString *ivStr; 
int result = SecRandomCopyBytes(kSecRandomDefault, 16, randomBytes); 
if(result == 0) { 
    ivStr = [[NSMutableString alloc] initWithCapacity:16]; 
    for(NSInteger index = 0; index < 8; index++) 
    { 
     [ivStr appendFormat: @"%02x", randomBytes[index]]; 
    } 
    NSLog(@"uuidStringReplacement is %@", ivStr); 
} else { 
    NSLog(@"SecRandomCopyBytes failed for some reason"); 
} 
NSData *iv   = [[NSData alloc] initWithBase64EncodedString:ivStr options:0]; 

//Iv base 64 
NSString *bIV = [[ivStr dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0]; 

//Key 
NSString *key = @"9OsNt7h7vjhvOwzXLfdQQYcHxYTua1Fk"; 
NSData *decodedKeyData = [[NSData alloc] initWithBase64EncodedString:key options:0]; 
NSString *keyStr = [[NSString alloc] initWithData:decodedKeyData encoding:NSISOLatin1StringEncoding]; 

//Encryption 
size_t   encryptBytes = 0; 
NSMutableData *encrypted = [NSMutableData dataWithLength:ser.length + kCCBlockSizeAES128]; 
CCCrypt(
     kCCEncrypt, 
     kCCAlgorithmAES128, 
     kCCOptionPKCS7Padding, //CBC is the default mode 
     decodedKeyData.bytes, 
     kCCKeySizeAES128, 
     iv.bytes, 
     dataIn.bytes, 
     dataIn.length, 
     encrypted.mutableBytes, 
     encrypted.length, 
     &encryptBytes 
     ); 

encrypted.length = encryptBytes; 
NSLog(@"encrypted hex: %@", encrypted); 
NSString *encStr = [encrypted base64EncodedStringWithOptions:0]; 
NSLog(@"encrypted Base64: %@", encStr); 


//Combine two string 
NSString *mixStr = [NSString stringWithFormat:@"%@%@",bIV,encStr]; 

//cHMAC 
const char *cKey = [keyStr cStringUsingEncoding:NSISOLatin1StringEncoding]; 
const char *cData = [mixStr cStringUsingEncoding:NSASCIIStringEncoding]; 
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; 
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); 
NSMutableString *mac = [NSMutableString string]; 
for (int i=0; i<sizeof cHMAC; i++){ 
    [mac appendFormat:@"%02hhx", cHMAC[i]]; 
} 

//Make dictionary 
NSDictionary *dic = @{@"iv":bIV,@"value":encStr,@"mac":mac}; 

//Json 
NSError * err; 
NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:&err]; 
NSString * myString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

//Result 
NSString *lastEnc = [[myString dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0]; 

NSLog(@"%@ %lu",lastEnc,(unsigned long)lastEnc.length); 

Code Ergebnis enthalten Zeichenfolge mit 192 oder 188 Zeichen und das ist in Ordnung. aber wenn Sie diesen Code in Ziel verwenden, zeigen Antwort mir ein Fehler:

Could not decrypt the data. 

ich einige Code ändert, und diese Methoden testen. alle Funktion ist korrekt, aber ich denke CCCrypt nicht mit openssl_encrypt übereinstimmen. denn wenn ich das Ergebnis openssl_encrypt von PHP bekomme und setze es anstelle von encStr, funktioniert das Gesamtergebnis korrekt.

Danke

+0

http://stackoverflow.com/questions/41660659/how-to-implement-phps-openssl-encrypt-method-in-ios-objective-c –

Antwort

0

Gelöst:
Endlich haben wir es nach zu viel Zeit Forschung über Laravel Verschlüsselung machen, Beschlossen durch eigene zu erstellen. LaraCrypt löste das Problem. versuchen Sie dies:

pod 'LaraCrypt' 

Laravel Encryption with Swift language

erfolgreich sein.

1
$value = \openssl_encrypt(serialize($text), 'AES-256-CBC', $key, 0, $iv); 

serialize Funktion - es sieht aus wie php-spezifische und es funktioniert nicht korrekt mit nicht ASCII-Codierungen. Was passiert, wenn Sie es durch base64_encode ersetzen? und natürlich müssen Sie auch den Entschlüsselungscode ändern.

+0

vielleicht sollte ich NSISOLatin1StringEncoding festlegen? –

Verwandte Themen