Я хочу реализовать метод openssl_encrypt()
php в iOS Objective-C . Поэтому я пробовал этот код:
#import <CommonCrypto/CommonHMAC.h> #import <CommonCrypto/CommonCryptor.h> - (void)viewDidLoad { [super viewDidLoad]; NSData *dataIn = [@"123456" dataUsingEncoding:NSISOLatin1StringEncoding]; NSString *key = @"ygXa6pBJOWSAXXX/J6POVTjvJpMIiPAMQiTMjBrcOGw="; NSData *decodedKeyData = [[NSData alloc] initWithBase64EncodedString:key options:0]; 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(@"iv string is %@ %lu" , ivStr , ivStr.length); } else { NSLog(@"iv string failed for some reason"); } NSData *iv = [[NSData alloc] initWithBase64EncodedString:ivStr options:0]; // setup key unsigned char cKeyR[kCCKeySizeAES256]; bzero(cKeyR, sizeof(cKeyR)); [decodedKeyData getBytes:cKeyR length:kCCKeySizeAES256]; // setup iv char cIv[kCCBlockSizeAES128]; bzero(cIv, kCCBlockSizeAES128); if (iv) { [iv getBytes:cIv length:kCCBlockSizeAES128]; } // setup output buffer size_t bufferSize = [dataIn length] + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); // do encrypt size_t encryptedSize = 0; CCCryptorStatus cryptStatus = CCCrypt( kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, cKeyR, kCCKeySizeAES192, cIv, [dataIn bytes], [dataIn length], buffer, bufferSize, &encryptedSize ); NSData *encrypted = [NSData dataWithBytesNoCopy:buffer length:encryptedSize]; NSString *encStr = [encrypted base64EncodedStringWithOptions:0]; }
Но это не тот же метод openssl_encrypt () в php. Я проверил iv, key и другие методы. длина и байты верны, но при использовании вывода в другом методе это неправильно.
decodedKeyData
– 32 байта) (256 бит), но размер ключа указан как kCCKeySizeAES192
.
Просто используйте randomBytes
как IV, нет смысла конвертировать его в Base64 и обратно.