2012-06-19 49 views
0

接收的公共密钥我是新来这个话题很抱歉,如果这是一个愚蠢的问题:\IOS:解密的消息与Web服务

我试图解密消息与给定的公钥。消息和公钥都是从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

公钥不用于解密。它用于加密和签名验证。私钥用于解密和签名。 – CodesInChaos

+1

您链接的博客完全不使用RSA进行加密。它使用硬编码到客户端的公钥来验证用于许可目的的签名。那么你究竟想实现什么? – CodesInChaos

+0

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

回答

2

当然,公共密钥是什么别人用来加密数据,以便只有拥有私钥的人才能解密数据。

公钥的定义是你可以给任何人。你不希望任何人能够解密其他人的加密信息吗?

从您的代码片段中不可能知道您的私钥在哪里存储,或者keyRefs的内容(甚至是类)是什么。

编辑:在回应上述OP的评论。并澄清。 “公钥本身是存储在服务器上的RSA密钥对的公共部分,加密的消息是通过对服务器进行首次JSON编码创建的,然后用私钥加密OPENSSL_PKCS1_PADDING,然后base64编码,然后再次JSON编码作为最终消息的一部分。消息和公钥存储在客户端上。我想要的是使用公钥解密客户端上的消息。我说,即时通讯不太擅长这个问题,所以我可能试图做错误的方式“*

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

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

+0

公钥存储在服务器上。在这种情况下,它是加密数据的服务器,客户端只需用公钥解密即可。 – Madoc

+0

我使用的代码来自:http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/使用我从服务器获得的公钥 – Madoc

+0

嗨,再次感谢你的回应。 我知道这不是通常的做法。但是通过允许客户拥有私钥和公钥,它将会挫败我想要完成的全部目的。 客户端必须无法重现编码的消息。如果客户能够复制编码的消息,他们可以“欺骗”系统。 – Madoc