问题
I want to implement php's openssl_encrypt()
method in iOS Objective-C. Therefore I tried this code:
#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];
}
But it is not same openssl_encrypt() method in php. I have checked iv, key and another methods. length and bytes output is correct but when use output in another method it is wrong.
回答1:
decodedKeyData
is 32 bytes )(256-bits) but the key size is specified askCCKeySizeAES192
.Just use
randomBytes
as the IV, there is no point in converting it is Base64 and back.
来源:https://stackoverflow.com/questions/41660659/how-to-implement-phps-openssl-encrypt-method-in-ios-objective-c