Я использую библиотеку 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 на телефоне, публикации открытого ключа на сервере, а затем проверки подписи с телефона на этом сервере. .
Спасибо!