2010-05-13 67 views
2

我在我的應用程序中使用蘋果「cryptoexcercise」(Security.Framework)來加密和解密數值數據。當我給出輸入950,128時,這些值被加密,但它沒有被解密並且僅以加密值存在。這隻發生在所提到的數值上。你能否請檢查這個問題並提供解決方案來解決這個問題?CryptoExcercise加密/解密問題

這裏是我的代碼

(void)testAsymmetricEncryptionAndDecryption { 
    uint8_t *plainBuffer; uint8_t *cipherBuffer; uint8_t *decryptedBuffer; 

    const char inputString[] = "950"; int len = strlen(inputString); 

    if (len > BUFFER_SIZE) len = BUFFER_SIZE-1; 

    plainBuffer = (uint8_t *)calloc(BUFFER_SIZE, sizeof(uint8_t)); cipherBuffer = (uint8_t *)calloc(CIPHER_BUFFER_SIZE, sizeof(uint8_t)); decryptedBuffer = (uint8_t *)calloc(BUFFER_SIZE, sizeof(uint8_t)); 

    strncpy((char *)plainBuffer, inputString, len); 

    NSLog(@"plain text : %s", plainBuffer); 

    [self encryptWithPublicKey:(UInt8 *)plainBuffer cipherBuffer:cipherBuffer]; 

    NSLog(@"encrypted data: %s", cipherBuffer); 

    [self decryptWithPrivateKey:cipherBuffer plainBuffer:decryptedBuffer]; 

    NSLog(@"decrypted data: %s", decryptedBuffer); 

    free(plainBuffer); free(cipherBuffer); free(decryptedBuffer); } 


    (void)encryptWithPublicKey:(uint8_t *)plainBuffer cipherBuffer:(uint8_t *)cipherBuffer { 
    OSStatus status = noErr; 

    size_t plainBufferSize = strlen((char *)plainBuffer); size_t cipherBufferSize = CIPHER_BUFFER_SIZE; 

    NSLog(@"SecKeyGetBlockSize() public = %d", SecKeyGetBlockSize([self getPublicKeyRef])); // Error handling // Encrypt using the public. status = SecKeyEncrypt([self getPublicKeyRef], PADDING, plainBuffer, plainBufferSize, &cipherBuffer[0], &cipherBufferSize); NSLog(@"encryption result code: %d (size: %d)", status, cipherBufferSize); NSLog(@"encrypted text: %s", cipherBuffer); } 


    (void)decryptWithPrivateKey:(uint8_t *)cipherBuffer plainBuffer:(uint8_t *)plainBuffer { OSStatus status = noErr; 

    size_t cipherBufferSize = strlen((char *)cipherBuffer); 

    NSLog(@"decryptWithPrivateKey: length of buffer: %d", BUFFER_SIZE); NSLog(@"decryptWithPrivateKey: length of input: %d", cipherBufferSize); 

    // DECRYPTION size_t plainBufferSize = BUFFER_SIZE; 

    // Error handling status = SecKeyDecrypt([self getPrivateKeyRef], PADDING, &cipherBuffer[0], cipherBufferSize, &plainBuffer[0], &plainBufferSize); NSLog(@"decryption result code: %d (size: %d)", status, plainBufferSize); NSLog(@"FINAL decrypted text: %s", plainBuffer); 

}

(SecKeyRef)getPublicKeyRef { OSStatus sanityCheck = noErr; SecKeyRef publicKeyReference = NULL; 

    if (publicKeyRef == NULL) { NSMutableDictionary *queryPublicKey = [[NSMutableDictionary alloc] init]; 

    // Set the public key query dictionary. 
    [queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass]; 
    [queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag]; 
    [queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType]; 
    [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnRef]; 


    // Get the key. 
    sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyReference); 


    if (sanityCheck != noErr) 
    { 
     publicKeyReference = NULL; 
    } 


    [queryPublicKey release]; 

    } else { publicKeyReference = publicKeyRef; } 

    return publicKeyReference; } 


    (SecKeyRef)getPrivateKeyRef { OSStatus resultCode = noErr; SecKeyRef privateKeyReference = NULL; 

    if(privateKeyRef == NULL) { NSMutableDictionary * queryPrivateKey = [[NSMutableDictionary alloc] init]; 

    // Set the private key query dictionary. 
    [queryPrivateKey setObject:(id)kSecClassKey forKey:(id)kSecClass]; 
    [queryPrivateKey setObject:privateTag forKey:(id)kSecAttrApplicationTag]; 
    [queryPrivateKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType]; 
    [queryPrivateKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnRef]; 


    // Get the key. 
    resultCode = SecItemCopyMatching((CFDictionaryRef)queryPrivateKey, (CFTypeRef *)&privateKeyReference); 


    NSLog(@"getPrivateKey: result code: %d", resultCode); 


    if(resultCode != noErr) 
    { 
     privateKeyReference = NULL; 
    } 


    [queryPrivateKey release]; 

    } else { privateKeyReference = privateKeyRef; } 

    return privateKeyReference; } 

回答

2

我這麼晚纔回復抱歉...但你的例子完全爲我工作,但事實上,

1 )爲privateTag和publicTag我不得不聲明

NSData *privateTag = [NSData dataWithBytes:privateKeyIdentifier length:strlen((const char *)privateKeyIdentifier)]; 

NSData *publicTag = [NSData dataWithBytes:publicKeyIdentifier length:strlen((const char *)privateKeyIdentifier)]; 

2)並且在關鍵參考IF條件下也改變privateKey == NULL而不是privateKeyRef ==NULL ..