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; 

이 문제를 해결했습니다.