如何在iOS Objective-C中实现php的openssl_encrypt()方法? [英] How to implement php's openssl_encrypt() method in iOS Objective-C?
问题描述
我想在 iOS Objective-C 中实现php的 openssl_encrypt()
方法。因此我尝试了这段代码:
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];
}
但它与php中的openssl_encrypt()方法不同。我已经检查过iv,key和其他方法。长度和字节输出是正确的但是当在另一种方法中使用输出时它是错误的。
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.
推荐答案
-
encodedKeyData
是32字节)(256位),但密钥大小指定为kCCKeySizeAES192
。
decodedKeyData
is 32 bytes )(256-bits) but the key size is specified askCCKeySizeAES192
.
只需使用 randomBytes
作为IV,转换它是没有意义的是Base64和返回。
Just use randomBytes
as the IV, there is no point in converting it is Base64 and back.
这篇关于如何在iOS Objective-C中实现php的openssl_encrypt()方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!