0

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

我正在尝试使用给定的公钥解密消息。消息和公钥都是从 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" 来自)

4

1 回答 1

2

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

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

无法从您的代码片段中分辨出您的私钥存储在哪里,或者 keyRefs 的内容(甚至类)是什么。

编辑:针对上述 OP 的评论。并澄清。

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

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

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

于 2012-06-19T16:25:44.717 回答