3

iPhoneのPKIライブラリを使用して短い文字列(12345678)を暗号化しようとしていますが、使用しようとする度にエラー-9809(errSSLCrypto) SecKeyEncrypt。 SecureTransport.hヘッダーファイルでは、このエラーが「根底にある暗号化エラー」として説明されていますが、これはあまり意味がありませんでした。次のようにiPhoneの公開鍵暗号化SecKeyEncryptがエラー9809(errSSLCrypto)を返します

私のコードは次のようになります。それは私が使用しているもの、パディングは重要ではありません

- (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; 
} 

、どちらも同じエラーを与えます。公開鍵はクライアントから提供された証明書から派生しており、鍵が有効であることを確認しました。私は間違って何をしていますか、どのように機能を適切に使うのですか?

+0

あなたの機能のためのThaxそれは私が暗号化するのを助けました。しかし、私は暗号化中に暗号化された文字列に奇妙な文字を取得しています。何か案が ? –

+0

新しい質問を作成してコードサンプルを投稿し、リンクをコメントとして追加します。私はそれを見てみましょう。 – futureelite7

+0

ここにm_oCertは何ですか? – HPM

答えて

7

SecKeyEncryptを使用する場合、入力cipherTextLengthは出力バッファのサイズにする必要があります。設定

size_t cipherTextLen = keyBlockSize; 

この問題を解決しました。

関連する問題