Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法确定如何发布iPhone上生成的公钥_Iphone_Python_Objective C_Security_Rsa - Fatal编程技术网

无法确定如何发布iPhone上生成的公钥

无法确定如何发布iPhone上生成的公钥,iphone,python,objective-c,security,rsa,Iphone,Python,Objective C,Security,Rsa,我正在使用iPhone上的commoncrypto库创建一对RSA密钥,并尝试将公钥发送到服务器(Python),以便使用它验证从手机发送的签名 我使用的是CommonCrypto示例中的精确代码,使用的方法是getPublicKeyBits(),如下所示: `-(NSData)getPublicKeyBits{ OSStatus sanityCheck=noErr; NSData publicKeyBits=nil; NSData*publicTag=[[NSData alloc]initWi

我正在使用iPhone上的
commoncrypto
库创建一对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,我想移到SH256,但这是让它工作的第二个密钥),而
base64
版本看起来像我在这里找到的其他密钥以及其他解决RSA问题的人的密钥

我一直在尝试使用Python中的
M2Crypto
库,当我尝试验证时,我得到了错误
“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密钥,将公钥发布到服务器,然后在该服务器上验证手机的签名


谢谢

M2Crypto的底层实现是OpenSSL。在导出纯公钥时,OpenSSL不会导入它,但只有当它“嵌入”在可能的自签名证书中时才会导入。了解如何使用通用加密或安全框架创建自签名证书,嵌入公钥并使用私钥签名,提取其数据并将其发送到服务器:应该可以

另请参见(第二个答案)

您可以在Apple密码练习代码中使用SecKeyWrapper中的getPublicKeyBits方法

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

我有一个支持ARC的getPublicKeyBits方法版本,但我还没有发布它

更新-重读您的问题,答案实际上如下:


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

您是否也可以发布用于创建公钥数据的iOS代码?您所说的“提取其数据”是什么意思?与您用于私钥的内容相同:在内存中拥有证书后,将二进制数据复制到NSData中,并将字节流发送到服务器。