How to implement php's openssl_encrypt() metho

2019-03-06 17:59发布

问题:

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:

  1. decodedKeyData is 32 bytes )(256-bits) but the key size is specified as kCCKeySizeAES192.

  2. Just use randomBytes as the IV, there is no point in converting it is Base64 and back.