如何在iOS Objective-C中实现php的openssl_encrypt()方法? [英] How to implement php's openssl_encrypt() method in iOS Objective-C?

查看:87
本文介绍了如何在iOS Objective-C中实现php的openssl_encrypt()方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在 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.

推荐答案


  1. encodedKeyData 是32字节)(256位),但密钥大小指定为 kCCKeySizeAES192

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

只需使用 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆