【问题标题】:iPhone Public-Key Encryption SecKeyEncrypt returns error 9809 (errSSLCrypto)iPhone 公钥加密 SecKeyEncrypt 返回错误 9809 (errSSLCrypto)
【发布时间】:2011-08-08 15:16:23
【问题描述】:

我正在尝试使用 iPhone 的 PKI 库来加密一个短字符串 (12345678),但每当我尝试使用 SecKeyEncrypt 时,我都会收到错误 -9809(即 errSSLCrypto)。 SecureTransport.h 头文件将此错误简单地描述为“潜在的加密错误”,这不是很有意义。

我的代码如下:

- (NSData *)encryptDataWithPublicKey:(NSString *)plainText {

    OSStatus result = -1;

    NSData *plainTextData = [plainText dataUsingEncoding:NSASCIIStringEncoding];
    size_t plainTextLength = [plainTextData length];

    SecTrustRef trustRef;
    SecTrustResultType trustResult;

    SecPolicyRef policy = SecPolicyCreateBasicX509();

    result = SecTrustCreateWithCertificates(m_oCert, policy, &trustRef);

    if (result != errSecSuccess) {
        NSLog(@"Trust create failed with code: %d",result);
        return nil;
    }

    result = SecTrustEvaluate(trustRef, &trustResult);

    if (result != errSecSuccess) {
        NSLog(@"Trust eval failed with code: %d",result);

        CFRelease(trustRef);
        return nil;
    }

    SecKeyRef publicKey = SecTrustCopyPublicKey(trustRef);

    uint8_t *cipherTextBuf = NULL;
    size_t cipherTextLen = 0;

    size_t keyBlockSize = SecKeyGetBlockSize(publicKey);
    int maxInputSize = keyBlockSize - 11; //If using PKCS1 Padding, else keyBlockSize

    if (plainTextLength > maxInputSize) {
        //Fail
        NSLog(@"Data size is larger than max permitted!");

        CFRelease(trustRef);
        CFRelease(publicKey);
        CFRelease(policy);

        return nil;
    }

    cipherTextBuf = malloc(sizeof(uint8_t)*keyBlockSize);
    memset(cipherTextBuf,0,keyBlockSize);

    //result = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plainTextBuf, plainTextLength, cipherTextBuf, &cipherTextLen);
    result = SecKeyEncrypt(publicKey, kSecPaddingNone, (const uint8_t *)[plainTextData bytes], plainTextLength, cipherTextBuf, &cipherTextLen);

    NSData *cipherText = nil;
    if (result == errSecSuccess) {

        cipherText = [NSData dataWithBytes:cipherTextBuf length:cipherTextLen];

    } else {
        NSLog(@"Error detected: %d",result);
    }

    free(cipherTextBuf);
    cipherTextBuf = NULL;

    CFRelease(trustRef);
    CFRelease(publicKey);
    CFRelease(policy);

    return cipherText;
}

不管我使用什么填充,它们都会给出相同的错误。公钥是从我的客户提供的证书中派生的,我已经检查以确保该密钥有效。我做错了什么以及如何正确使用该功能?

【问题讨论】:

  • Thax for Your function 它帮助我加密。但是我在加密时得到了加密字符串中的奇怪字符。有什么想法吗?
  • 提出一个新问题并发布您的代码示例,并将链接添加为评论。我去看看。
  • 这里的 m_oCert 是什么?

标签: iphone x509certificate public-key-encryption pki commoncrypto


【解决方案1】:

使用 SecKeyEncrypt 时,输入的 cipherTextLength 应该是输出缓冲区的大小。设置

size_t cipherTextLen = keyBlockSize;

解决了问题。

【讨论】:

    猜你喜欢
    • 2016-12-07
    • 1970-01-01
    • 2010-11-26
    • 2010-10-24
    • 2011-09-30
    • 2014-12-18
    • 1970-01-01
    • 2020-03-22
    • 2015-10-19
    相关资源
    最近更新 更多