2017-07-19 23 views
0

私は基本的にこの秘密鍵を生成し、公開鍵をコピーしてからメッセージを暗号化するためにguideに従います。しかし、それは私にエラーを与えます(OSStatusエラー-67712 - CSSM例外:-2147415791 CSSMERR_CSP_INVALID_KEY_REFERENCE)。OSX生成された鍵は暗号化できません(SecKeyCreateRandomKeyとSecKeyCreateEncryptedData)

最初は、属性を正​​しく設定していないと思っていました。しかし、SecKeyGeneratePair()関数で公開鍵(同じ属性を持つ)を作成すると、すべてが完全に機能します。それは変だ?

void TestEncryptDecrpt() { 
    OSStatus status; 
    NSData* tag = [@"com.example.keys.mykey" dataUsingEncoding:NSUTF8StringEncoding]; 
    NSDictionary* attributes = 
    @{ (id)kSecAttrKeyType:    (id)kSecAttrKeyTypeRSA, 
     (id)kSecAttrKeySizeInBits:   @1024, 
     (id)kSecPrivateKeyAttrs: 
      @{ (id)kSecAttrIsPermanent: @YES, 
       (id)kSecAttrApplicationTag: tag, 
       }, 
     }; 

    CFErrorRef error = NULL; 
    SecKeyRef privateKey = SecKeyCreateRandomKey((__bridge CFDictionaryRef)attributes, &error);   
    SecKeyRef publicKey = SecKeyCopyPublicKey(privateKey); 


    // *** it will work if I generate the key by SecKeyGeneratePair *** 
    // status = SecKeyGeneratePair((__bridge CFDictionaryRef)attributes, &publicKey, &privateKey); 


    // start encrypt and decrypt a message 
    static char const kMessage[] = "This is a secret!\n";   
    SecKeyAlgorithm algorithm = kSecKeyAlgorithmRSAEncryptionRaw;   
    BOOL canEncrypt = SecKeyIsAlgorithmSupported(publicKey, kSecKeyOperationTypeEncrypt, algorithm); 
    NSData* plainData = [NSData dataWithBytes:kMessage length:sizeof(kMessage)]; 
    canEncrypt &= ([plainData length] < (SecKeyGetBlockSize(publicKey)-130)); 

    NSData* cipherText = nil; 
    if (canEncrypt) { 
     CFErrorRef error = NULL; 
     cipherText = (NSData*)CFBridgingRelease(SecKeyCreateEncryptedData(publicKey, algorithm, (__bridge CFDataRef)plainData, &error)); 
     if (!cipherText) { 
      NSError *err = CFBridgingRelease(error); // ARC takes ownership 
      // Handle the error. . . 
      NSLog(@"error = %@, %@", [err userInfo], [err localizedDescription]); 
     } 
    } 
} 
+0

あなたのリンクは死んでいます。 Appleのドキュメントは、恒久的なものではありません: –

答えて

1

問題を解決しました。公開鍵設定では、「kSecAttrIsPermanent」プロパティも必要です。

この例ではこれが説明されていない理由はわかりません。

関連する問題