iPhoneのライブラリを使用してcommoncrypto
RSA キーのペアを作成し、公開キーをサーバー (Python) に送信して、電話から送信された署名を検証できるようにしようとしています。
getPublicKeyBits()
次のようなメソッドを使用して、CommonCrypto の例の正確なコードを使用しています。
`- (NSData )getPublicKeyBits { OSStatus sanityCheck = noErr; NSData publicKeyBits = nil; 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
バージョンは、ここで見つけた他のキーとRSAの問題を解決している他の人に似ています。
Python でライブラリを使用しようとしましたがM2Crypto
、検証しようとするとエラーが発生します"RSA Error: No Start Line"
。公開鍵を受け取るために使用しているコードは次のとおりです。
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キーを生成し、公開キーをサーバーに公開し、そのサーバーで電話からの署名を検証する他の方法を聞きたいです. .
ありがとう!