Как реализовать функцию laravel Crypt :: encrypt () в Objective C?

Мне нужно реализовать Crypt :: ecrypt ('123456'); от laravel до Objective C iOS . Поэтому сначала я расширил метод laravel для шифрования, как это, на чистый php:

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 шаг за шагом. посмотреть мой объективный код 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 , итоговый результат работает правильно.

спасибо

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

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

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

 pod 'LaraCrypt' 

Шифрование Laravel с языком Swift

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