3

SecKeyCreateWithData を使用して公開鍵を作成します。キーは、ヘッダーを削除した後、Pem から作成されます。

を使用して署名を検証しようとしました

  1. SecKeyRawVerify が -9809 エラーを返す (iOS)
  2. SecKeyVerifySignature が -67808 "RSA 署名の検証に失敗しました。一致しません" を返します (iOS)
  3. SecTransformExecute は false を返します。(OSx)

SHA256 および Unicode エンコーディングを使用してメッセージに署名します (C# RSACryptoProvider)。

公開鍵を作成するためのコード:

NSDictionary* attributes =
    @{ (id)kSecAttrKeyType:               (id)kSecAttrKeyTypeRSA,
       (id)kSecAttrKeySizeInBits:         @2048,
       (id)kSecPublicKeyAttrs:
           @{ (id)kSecAttrIsPermanent:    @YES,
              (id)kSecAttrApplicationTag: tag1
            },
       (id)kSecAttrCanEncrypt:@YES,
       (id)kSecAttrCanVerify:@YES,
       (id)kSecAttrKeyClass: (id)kSecAttrKeyClassPublic
     };

    CFErrorRef error = NULL;
    SecKeyRef keyRef = SecKeyCreateWithData((__bridge CFDataRef)publicKeyData,
                                      (__bridge CFDictionaryRef)attributes,
                                      &error);

認証コード iOS:

size_t signedHashBytesSize = SecKeyGetBlockSize(keyRef);
const void* signedHashBytes = [signature bytes];
NSData *plainData = [dataToSign dataUsingEncoding:NSUTF16StringEncoding];
size_t hashBytesSize = CC_SHA256_DIGEST_LENGTH;
uint8_t* hashBytes = malloc(hashBytesSize);
if (!CC_SHA256([plainData bytes], (CC_LONG)[plainData length], hashBytes)) {
    return nil;
}

OSStatus status1 = SecKeyRawVerify(keyRef,
                                  kSecPaddingPKCS1,
                                  hashBytes,
                                  hashBytesSize,
                                  signedHashBytes,
                                  signedHashBytesSize);

検証コード OSx:

    verifier = SecVerifyTransformCreate(keyRef, (__bridge CFDataRef)self.digest, &errorCF);
    if (errorCF) { CFShow(errorCF);}
    SecTransformSetAttribute(verifier,
                             kSecTransformInputAttributeName,
                             (__bridge CFTypeRef)plainData,
                             &errorCF);
    if (errorCF) { CFShow(errorCF); exit(-1); }
    SecTransformSetAttribute(verifier,
                             kSecDigestTypeAttribute,
                             kSecDigestSHA2,
                             &errorCF);
    if (errorCF) { CFShow(errorCF); exit(-1); }
    SecTransformSetAttribute(verifier,
                             kSecDigestLengthAttribute,
                             (__bridge CFNumberRef)@256,
                             &errorCF);
    if (errorCF) { CFShow(errorCF); exit(-1); }
    CFBooleanRef result1 = NULL;
    result1 = SecTransformExecute(verifier, &errorCF);
    BOOL success = (result1 != NULL);

私は立ち往生しており、どんな助けもいただければ幸いです。

4

0 に答える 0