6

我正在使用commoncryptoiPhone 上的库来创建一对 RSA 密钥,并且我正在尝试将公钥发送到服务器(Python),以便我可以使用它来验证从手机发送的签名。

我正在使用 CommonCrypto 示例中的确切代码,使用如下所示的方法getPublicKeyBits()

`- (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 密钥,将公钥发布到服务器,然后在该服务器上验证来自手机的签名.

谢谢!

4

2 回答 2

1

您可以在 Apple CryptoExercise 代码中使用来自 SecKeyWrapper的getPublicKeyBits方法

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

这将为您提供 DER 编码的二进制数据。然后使用以下方法将其加载到 Python 中的 M2Crypto 中:(基本上,只需 base64 并调用一种方法。)

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

我有这个getPublicKeyBits方法的 ARC 启用版本,但我还没有开始发布它。

更新- 在重新阅读您的问题时,答案实际上就在这里:

如何在 iPhone/Objective C 上找出 RSA 公钥的模数和指数

您可以使用它来获取模数和指数作为 NSData,您应该能够轻松地将其转换为 base64 或您选择的表示。

于 2012-05-16T18:15:48.463 回答
0

M2Crypto 的底层实现是 OpenSSL。OpenSSL 不会在您导出纯公钥时导入它,但前提是它“嵌入”在可能的自签名证书中。查看如何使用 Common Crypto 或 Security 框架创建自签名证书,嵌入您的公钥并使用您的私钥对其进行签名,提取其数据并将其发送到您的服务器:它应该可以工作。

另请参见openssl_pkey_get_public 未打开公钥,“无起始行”错误(第二个答案)

于 2012-04-20T09:00:49.287 回答