2012-04-16 14 views
6

iPhoneでcommoncryptoライブラリを使用してRSA鍵のペアを作成しています。公開鍵をサーバー(Python)に送信して使用できますそれは電話から送られた署名を確認するためです。私はこのように見える方法getPublicKeyBits()を用いCommonCrypto例から正確なコードを使用していiPhoneで生成された公開鍵を公開する方法がわからない

' - (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の問題を解決する他の人にも見えます。

私はM2CryptoライブラリをPythonで使用しようとしていましたが、私がエラー"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鍵を生成し、公開鍵をサーバに公開し、そのサーバ上の電話から署名を検証する他の方法を聞きたいです。

ありがとうございます!

+0

公開鍵データの作成に使用するiOSコードも投稿できますか? – MrTJ

+0

コードを更新した投稿 – brennen

答えて

1

あなたはこれがあなたにバイナリデータをエンコードDERを取得します

https://developer.apple.com/library/ios/#samplecode/CryptoExercise/Listings/Classes_SecKeyWrapper_h.html

アップルCryptoExerciseコードでSecKeyWrapperからgetPublicKeyBitsメソッドを使用することができます。次に、PythonでM2Cryptoにロードするには、次の方法を使用します。(基本的にはbase64だけで、1つのメソッドを呼び出します。)

https://stackoverflow.com/a/5765576/584616

私はこのgetPublicKeyBits方法のARC対応バージョンがありますが、私はまだそれを掲示する周りもらっていません。

更新は - 再読み込みあなたの質問に、答えは実際にはここにある:

How to find out the modulus and exponent of RSA Public Key on iPhone/Objective C

あなたは簡単にできるはずですNSDataの、などモジュラスと指数を取得するためにこれを使用することができます

base64または選択した表現に変換します。

0

M2Cryptoの基本的な実装はOpenSSLです。 OpenSSLはエクスポートした純粋な公開鍵をインポートするのではなく、自己署名証明書に「埋め込まれている」場合にのみインポートします。 Common CryptoまたはSecurityフレームワークを使用して自己署名証明書を作成し、公開鍵を埋め込み、秘密鍵で署名し、データを抽出してサーバーに送信する方法を確認します。

も参照openssl_pkey_get_public not open public key, "no start line" error(第2の回答)

+0

「データを抽出する」とはどういう意味ですか? – brennen

+0

秘密鍵と同じこと:証明書をメモリに入れたら、バイナリデータをNSDataにコピーし、バイトストリームをサーバに送信します。 – MrTJ

関連する問題