我是这个主题的新手,很抱歉,如果这是一个愚蠢的问题:\
我正在尝试使用给定的公钥解密消息。消息和公钥都是从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”来自)
答案 0 :(得分:2)
当然,公钥是其他人用来加密数据的东西,这样只有拥有私钥的人才能解密它。
公钥的定义是您可以将其提供给任何人。您不希望任何人能够解密其他人的加密消息吗?
无法从代码片段中判断存储私钥的位置,或者keyRefs的内容(甚至是类)是什么。
编辑:回应上述OP的评论。并澄清。
*"公钥本身是存储在服务器上的RSA密钥对的公共部分。加密消息是在服务器上创建的,首先对对象进行JSON编码,然后使用私有密钥加密OPENSSL_PKCS1_PADDING,然后进行base64编码,然后再次进行JSON编码作为最终消息的一部分。消息和公钥存储在客户端上。我想要的是使用公钥解密客户端上的消息。正如我所说,我不是很擅长这个主题,所以我可能试图以错误的方式做到这一点" *
这不是公钥加密的工作原理。服务器和客户端交换公钥。然后,每个人使用另一个公钥来加密发送给对方的数据。接收方总是使用自己的私钥来解密消息。
如果您希望服务器生成加密响应,请让客户端在请求中传递其公钥,使用该公钥加密响应,然后使用客户端私有解密客户端上的响应键。