実装する必要がありますCrypt :: ecrypt( '123456');からラベールから目的C iOS。Objective 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の代わりに設定すると、合計結果が正しく動作するからです。
はあなたに
http://stackoverflow.com/questions/41660659/how-to-implement-phps-openssl-encrypt-method-in-ios-objective-c –