0

RSA で暗号化され、Base 64 でエンコードされたテキストの復号化に問題があります。直接暗号化されたテキスト(unsigned char *)を復号化すると、すべて問題なく正しい結果が得られます。しかし、base64 エンコードを行うと、openssl はデータの復号化に失敗しますが、base64 でデコードされたデータは暗号化されたデータとまったく同じです。

たとえば、(1 つ目は暗号化の結果で、2 つ目は base 64 のデコード結果です。最初の char * を直接デコードすると、かなりうまくいきます。)

暗号化 - ßÁ¨£®Òz>Ô‹n.€Ö∫BÔ–∂ü∏ÕD⁄UÖáµ)ûKufi wÆ&_è”eëõ~gK∂¶$kŸƒ∫ª`ÔfΩ˙˛{∆_MªÔëbP Qâ¶fl±Ü;! ü•◊s>ħ∆◊⁄≤ò˙ˇCWôVÂzôzíö≤ÙU¶?⁄l[*H?o\ñ>ƒ<'4mœ“Lr Íhh

デコードされた文字列 - ßÁ¨£®Òz>Ô‹n.€Ö∫BÔ–∂ü∏ÕD⁄UÖáµ)ûKufi wÆ&_è”eëõ~gK∂¶$kŸƒ∫ª`ÔfΩ˙˛{∆_MªÔëbP Q¶fl±Ü; !ü•◊s>ħ∆◊⁄≤ò˙ˇCWôVÂzôzíö≤ÙU¶?⁄l[*H?o\ñ>ƒ<'4mœ“Lr Íhh

コード:

+(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 のエンコードとデコードは次のように行います。

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

4

1 に答える 1

-1

主な問題は、base64 エンコーディング + デコーディング クラスにありました。QSutilitiesに切り替えると、すべてが機能します。

于 2012-05-11T10:55:38.553 に答える