2017-01-09 8 views
1

実装する必要がありますCrypt :: ecrypt( '123456');からラベールから目的C iOSObjective Cでlaravel関数Crypt :: encrypt()を実装する方法は?

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

そしてステップにより、Objective Cのステップにこのコードのすべての行を変換しますので、最初私は純粋なPHPには、このような暗号化のためのlaravel方法を拡大しました。私のObjective 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を設定する必要がありますか? –

関連する問題