Экспорт открытого ключа в распакованное (x,y) представление начинается с 0x04 и имеет длину 65 байтов

Ниже приведен пример кода для генерации закрытого ключа (ссылка на gist): https://gist.github.com/kynwu/3a65e238fcd189d516bb2de59527a320

после генерации закрытого ключа я вывел открытый ключ, вызвав SecKeyCopyPublicKey((SecKeyRef)privateKey)

Я получил ниже значение, показывающее (x,y) открытого ключа.

<SecKeyRef curve type: kSecECCurveSecp256r1, algorithm id: 3, key type: ECPublicKey, version: 4, block size: 256 bits, y: 1778DB79819A67BC9211E003557CB55EA0C7A19154B1C0828B30F30AD208ABCD, x: 7A1C65A955F46B9937A12E19139DE25C3F19368A3C2DD7360791E42382C98716, addr: 0x1003019f0>

Теперь я хочу передать это (х, у) 0x04|x-32bytes|y-32bytesдвоичные данные размером 65 байт, поэтому я могу вывести этот двоичный файл, представляющий открытый ключ для сервера. Как этого добиться?

0 ответов

Используйте метод CFDictionaryGetValue в CoreFoundation.

const void * CFDictionaryGetValue (CFDictionaryRef theDict, const void * key);

Ниже функция выдаст 65 байт открытого несжатого ключа.

+ (NSData *) publicKeyBits

{

return (NSData *) CFDictionaryGetValue((CFDictionaryRef)[self lookupPublicKeyRef], kSecValueData);

}

  + (SecKeyRef) lookupPublicKeyRef
{
  CFMutableDictionaryRef getPublicKeyQuery = newCFDict;
  CFDictionarySetValue(getPublicKeyQuery, kSecClass,                kSecClassKey);
  CFDictionarySetValue(getPublicKeyQuery, kSecAttrKeyType,          kSecAttrKeyTypeEC);
  CFDictionarySetValue(getPublicKeyQuery, kSecAttrApplicationTag,   kPublicKeyName);
  CFDictionarySetValue(getPublicKeyQuery, kSecAttrKeyClass,         kSecAttrKeyClassPublic);
  CFDictionarySetValue(getPublicKeyQuery, kSecReturnData,           kCFBooleanTrue);
  CFDictionarySetValue(getPublicKeyQuery, kSecReturnPersistentRef,  kCFBooleanTrue);

  OSStatus status = SecItemCopyMatching(getPublicKeyQuery, (CFTypeRef *)&publicKeyRef);
  if (status == errSecSuccess)
    return (SecKeyRef)publicKeyRef;
  else if (status == errSecItemNotFound)
    return nil;
  else
    [NSException raise:@"Unexpected OSStatus" format:@"Status: %i", status];
  return false;
}
  • kPublicKeyName может быть любой константной строкой, которая будет связана как тег с открытым ключом.

например - #define kPublicKeyName @"com.trailer.ECKey.public"

Другие вопросы по тегам