Не могу понять, как опубликовать открытый ключ, сгенерированный на iPhone

Я использую библиотеку commoncryptoна iPhone для создания пары ключей RSA и пытаюсь отправить открытый ключ на сервер (Python), чтобы использовать его для проверки подписи. отправлено с телефона.

Я использую точный код из примера CommonCrypto, используя метод getPublicKeyBits(), который выглядит следующим образом:

`- (NSData )getPublicKeyBits { OSStatus sanityCheck = noErr; NSDatapublicKeyBits = ноль; NSData* publicTag = [[NSData alloc] initWithBytes: длина publicKeyIdentifier: sizeof (publicKeyIdentifier)]; CFDataRef cfresult = NULL;

NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];

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

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


if (sanityCheck != noErr)
{
    publicKeyBits = nil;
}
else 
{
    publicKeyBits = (__bridge_transfer NSData *)cfresult;
}

return publicKeyBits;

}`

Проблема в том, что я не знаю, как именно хранится ключ или как его передать.Я использую getPublicKeyBits(), чтобы получить его в структуре NSData, и я импортировал библиотеку для кодирования в base64. Я получаю ключ (SHA1, я хотел бы перейти на SHA256, но это вторично по отношению к тому, чтобы заставить это работать), и версия base64выглядит как другие ключи, которые я нашел здесь и у других людей, решающих Проблемы с РСА.

Я пытался использовать библиотеку M2Cryptoв Python, и когда я пытаюсь проверить, я получаю сообщение об ошибке «Ошибка RSA: нет стартовой строки». Вот код, который я использую для получения открытого ключа:

pubKey = request.form['publickey']

uid = uuid4().hex
while not unique(uid, User):
    uid = uuid.uuid4().hex
user = User(uid, email, secret, pubKey)

И код, который я использую для проверки подписи:

def validate(sessionKey, sig, pem):
    bio = BIO.MemoryBuffer(pem.encode('ascii'))
    rsa = RSA.load_pub_key_bio(bio)
    pubkey = EVP.PKey()
    pubkey.assign_rsa(rsa)

    pubkey.reset_context(md='sha1')
    pubkey.verify_init()
    pubkey.verify_update(sessionKey)

    return pubkey.verify_final(sig)

Я действительно озадачен тем, что я делаю неправильно, но мне кажется, что я м приближаюсь. Если весь мой метод не такой, как вы, я хотел бы услышать о любом другом способе создания ключей RSA на телефоне, публикации открытого ключа на сервере, а затем проверки подписи с телефона на этом сервере. .

Спасибо!

6
задан brennen 21 April 2012 в 00:43
поделиться