IOS:使用从webservice收到的公钥解密消息

时间:2012-06-19 16:07:17

标签: iphone encryption public-key-encryption

我是这个主题的新手,很抱歉,如果这是一个愚蠢的问题:\

我正在尝试使用给定的公钥解密消息。消息和公钥都是从Web服务提供的。

请参阅以下代码,了解我目前如何进行解密:

 for (NSValue *refVal in keyRefs) {
    SecKeyRef p_key = NULL;
    [refVal getValue:&p_key];
    if (p_key == NULL) continue;

    size_t dataLength = encryptedData.length;
    size_t outPutLength = MAX(dataLength, SecKeyGetBlockSize(p_key));

    void *outPutBuf = malloc(outPutLength);
    if (outPutBuf) {

        //  Error handling
        OSStatus status = SecKeyDecrypt(p_key,
                                        kSecPaddingNone,
                                        encryptedData.bytes,
                                        encryptedData.length,
                                        outPutBuf,
                                        &outPutLength
                                        );


        NSLog(@"decryption result code: %ld (size: %lu)", status, outPutLength);
        NSLog(@"FINAL decrypted text: %s", outPutBuf);

        if (status == errSecSuccess) {
            break;
        }
    } else {

        //Error handling
    }
}

我没有错误,但解密的字符串显示如下(正确的输出应该是JSON数组):

decryption result code: 0 size:511)  
FINAL decrypted text: ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ

是因为我使用“SecKeyDecrypt”使用“公钥”而不是“私钥”吗?在那种情况下,我应该用什么来解密?

感谢您对此提供任何帮助!

编辑:我正在使用以下代码:http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/来使用我从服务器获取的公钥(这是代码片段中的“keyRefs”来自)

1 个答案:

答案 0 :(得分:2)

当然,公钥是其他人用来加密数据的东西,这样只有拥有私钥的人才能解密它。

公钥的定义是您可以将其提供给任何人。您不希望任何人能够解密其他人的加密消息吗?

无法从代码片段中判断存储私钥的位置,或者keyRefs的内容(甚至是类)是什么。

编辑:回应上述OP的评论。并澄清。

*"公钥本身是存储在服务器上的RSA密钥对的公共部分。加密消息是在服务器上创建的,首先对对象进行JSON编码,然后使用私有密钥加密OPENSSL_PKCS1_PADDING,然后进行base64编码,然后再次进行JSON编码作为最终消息的一部分。消息和公钥存储在客户端上。我想要的是使用公钥解密客户端上的消息。正如我所说,我不是很擅长这个主题,所以我可能试图以错误的方式做到这一点" *

这不是公钥加密的工作原理。服务器和客户端交换公钥。然后,每个人使用另一个公钥来加密发送给对方的数据。接收方总是使用自己的私钥来解密消息。

如果您希望服务器生成加密响应,请让客户端在请求中传递其公钥,使用该公钥加密响应,然后使用客户端私有解密客户端上的响应键。