2012-05-04 127 views
0

我有RSA加密和Base 64编码文本解密的问题。当我直接解密加密文本(无符号字符*),那么一切都很好,我得到正确的结果。但是,当我做base64编码,比openssl无法解密数据,尽管base64解码数据与加密数据完全相同:RSA解密与openSSL

例如(首先是加密结果和第二个base 64解码结果。相当好)

加密 - 。SSA£®Òz>Ô Ä§Δ◊/≤ò˙CWôVÂzôzíö≤ÙU¶/l [* H 2 O \ñ>ƒ<“4mœ“LR IHH

已解码的字符串 - ߨ¨zz>Ô Ä§Δ◊/ ≤ò˙CWôVÂzôzíö≤ÙU¶/l [* H 2 O \ñ>ƒ<“4mœ“LR IHH

代码:?

+(NSString *) rsaEncryptedStringFromText: (NSString *) text 
{ 
const char *message = [text UTF8String]; 

NSLog(@"message - %s", message); 

int bufSize; 

NSString *keyFilePath = [[NSBundle mainBundle] pathForResource:@"publicKey" ofType:@"pem"]; 

FILE *keyfile = fopen([keyFilePath UTF8String], "r"); 

RSA *rsa = PEM_read_RSA_PUBKEY(keyfile, NULL, NULL, NULL); 

if (rsa == NULL) 
{ 
    return nil; 
} 

int key_size = RSA_size(rsa); 

unsigned char *encrypted = (unsigned char *) malloc(key_size); 

bufSize = RSA_public_encrypt(strlen(message), (unsigned char *) message, encrypted, rsa, RSA_PKCS1_PADDING); 

if (bufSize == -1) 
{ 
    RSA_free(rsa); 
    return nil; 
} 

NSLog(@"encrypted - %s", encrypted); 

NSData *encryptedData = [NSData dataWithBytes:encrypted length:strlen((const char *)encrypted)]; 

NSString *base64 = [encryptedData base64Encoding]; 

RSA_free(rsa); 

return base64; 

}

+(NSString *) rsaDecryptToStringFromText: (NSString *) text 
{ 
//NSLog(@"text - %@", text); 

NSData *decodedData = [NSData dataWithBase64EncodedString: text]; 

unsigned char* message = (unsigned char*) [decodedData bytes]; 

NSLog(@"decoded string - %s", message); 

RSA *privKey = NULL; 
FILE *priv_key_file; 
unsigned char *ptext; 

NSString *keyFilePath = [[NSBundle mainBundle] pathForResource:@"privateKeyPair" ofType:@"pem"]; 

priv_key_file = fopen([keyFilePath UTF8String], "rb"); 

ERR_print_errors_fp(priv_key_file); 

privKey = PEM_read_RSAPrivateKey(priv_key_file, NULL, NULL, NULL); 

int key_size = RSA_size(privKey); 
ptext = malloc(key_size); 

int outlen = RSA_private_decrypt(key_size, (const unsigned char*)message, ptext, privKey, RSA_PKCS1_PADDING); 

if(outlen < 0) return nil; 

RSA_free(privKey); 

return [NSString stringWithUTF8String: (const char *)ptext]; 

}

Base 64 encoding-d ecoding与此完成:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/21689-base-64-string-help.html#post98080

+0

这些字符串不一样(¶后有一个换行符)。 – trojanfoe

+0

哪里?看不到... –

+0

我认为你的代码非常糟糕。你为什么要为加密数据分配'key_size'? 'strlen(加密)'返回正确的长度(我怀疑)。你永远不会关闭'FILE *'并且永远不会释放你分配的内存。我并不感到惊讶,它不起作用。 – trojanfoe

回答

-1

主要问题是在base64编码解码+类。切换到QSutilities,一切正常。