6

iPhoneのライブラリを使用してcommoncryptoRSA キーのペアを作成し、公開キーをサーバー (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キーを生成し、公開キーをサーバーに公開し、そのサーバーで電話からの署名を検証する他の方法を聞きたいです. .

ありがとう!

4

2 に答える 2

1

AppleCryptoExerciseコードでSecKeyWrapperのgetPublicKeyBitsメソッドを使用できます

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

これにより、DERでエンコードされたバイナリデータが取得されます。次に、次のメソッドを使用して、PythonのM2Cryptoにロードします(基本的には、base64で1つのメソッドを呼び出します)。

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

このgetPublicKeyBitsメソッドのARC対応バージョンを持っていますが、まだ投稿することができていません。

更新-質問を読み直すと、答えは実際にここにあります:

iPhone /ObjectiveCでRSA公開鍵のモジュラスと指数を確認する方法

これを使用して、モジュラスと指数をNSDataとして取得できます。これは、base64または選択した表現に簡単に変換できるはずです。

于 2012-05-16T18:15:48.463 に答える
0

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

openssl_pkey_get_public not open public key、 "no start line"エラー(2番目の回答)も参照してください。

于 2012-04-20T09:00:49.287 に答える