2017-01-09 2 views
1

Мне нужно реализовать Crypt :: ecrypt ('123456'); от laravel до Цель C iOS. Таким образом, первым я расширил метод Laravel для шифрования, как это чистый PHP:Как реализовать функцию laravel Crypt :: encrypt() в Objective C?

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

А затем преобразовать каждую строку этого кода объективному шаг за шагом гр. посмотреть мою цель c код:

#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); 

Результат кода содержит строку с символом 192 или 188, и это нормально. но при использовании этого кода в месте назначения ответьте мне:

Could not decrypt the data. 

Я меняю код и проверяю этот метод. все функции верны, но я думаю, CCCrypt не соответствует openssl_encrypt. потому что, когда я получаю результат от openssl_encrypt от php и устанавливаю его вместо encStr, итоговый результат работает правильно.

Спасибо

+0

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

ответ

0

решаемые:
Наконец мы делаем это после того, как слишком много исследований времени о Laravel шифрования Решил создать собственные. LaraCrypt решил проблему. попробуйте это:

pod 'LaraCrypt' 

Laravel Encryption with Swift language

быть успешным.

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

serialize функции - это выглядит, как PHP-специфического и она работает неправильно с не ASCII кодировками. что, если вы замените его на base64_encode? и, конечно же, вам нужно будет также изменить код дешифрования.

+0

Возможно, я должен установить NSISOLatin1StringEncoding? –

Смежные вопросы