2013-08-26 3 views
0

Я пытаюсь зашифровать данные с помощью открытого ключа RSA с помощью openssl.Шифровать данные с открытым ключом RSA, не дающим ожидаемых результатов

У меня есть реализация Java, что мне нужно сделать в Objective-C.

Вот что я до сих пор:

- (RSA *)rsaFromExponent:(NSString *)exponent modulus:(NSString *)modulus 
{ 
    RSA *rsa_pub = RSA_new(); 

    const char *N = [modulus UTF8String]; 
    const char *E = [exponent UTF8String]; 

    if (!BN_hex2bn(&rsa_pub->n, N)) 
    { 
     // TODO 
    } 
    printf("N: %s\n", N); 
    printf("n: %s\n", BN_bn2dec(rsa_pub->n)); 

    if (!BN_hex2bn(&rsa_pub->e, E)) 
    { 
     // TODO 
    } 
    printf("E: %s\n", E); 
    printf("e: %s\n", BN_bn2dec(rsa_pub->e)); 

    return rsa_pub; 
} 

- (NSString *)cleanString:(NSString *)input 
{ 
    NSString *output = input; 
    output = [output stringByReplacingOccurrencesOfString:@"<" withString:@""]; 
    output = [output stringByReplacingOccurrencesOfString:@">" withString:@""]; 
    output = [output stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    return output; 
} 

// main code 
NSString *exponentB64 = @"AQAB"; 
NSString *modulusB64 = @"AKDbnFpblq7LHfWDfGTR48B34MKaHQosMwVu8cCc6fH2pZ8Ypx/OgzG6VJlKHXeELtlo5tddBSJpwnkEQdvkkmwuOpCkacTTLon6EHqX4WwFW+waqHxmj419SxiDDlo9tsbg7vfFIMpKyGzq1zvTAN3TroW+MxogZfZD3/N6dNTzvBoXe/Ca1e/zVwYXKbiegLMjNwsruz/WvuMiNKTK4U3GEmb0gIODd1shAH10ube8Nrz/e1u9kr25VQ+7kZAFjnkPTp2AvNGYHQt35m1TRMQhTylVwTZqFkHC/jMt7WxuS8q7ftjM828wa1fEWTgWYrdkzmqZSK5CHBYSys/N1Ws="; 

// 1. decode base64 (http://projectswithlove.com/projects/NSData_Base64.zip) 
NSData *exponent = [NSData dataFromBase64String:exponentB64]; 
NSData *modulus = [NSData dataFromBase64String:modulusB64]; 

NSString *exponentHex = [self cleanString:[exponent description]]; 
NSString *modulusHex = [self cleanString:[modulus description]]; 

// 2. create RSA public key 
RSA *rsa_pub = [self rsaFromExponent:exponentHex modulus:modulusHex]; 

NSString *user = @"TEST"; 

// 3. encode base 64 
NSData *userData = [user dataUsingEncoding:NSASCIIStringEncoding]; 
NSString *userB64String = [userData base64EncodedString]; 

// 4. encrypt 
const unsigned char *from = (const unsigned char *)[userB64String cStringUsingEncoding:NSASCIIStringEncoding]; 
int flen = strlen((const char *)from); 
unsigned char *to = (unsigned char *) malloc(RSA_size(rsa_pub)); 
int padding = RSA_PKCS1_PADDING; 
int result = RSA_public_encrypt(flen, from, to, rsa_pub, padding); 
if (-1 == result) 
{ 
    NSLog(@"WAT?"); 
} 
else 
{ 
    NSLog(@"from: %s", from); // echo VEVTVA== 
    NSLog(@"to: %s", to); // echo something strange with characters like: ~™Ÿû—... 
} 

// 5. encode base 64 
NSString *cipherString = [NSString stringWithCString:(const char *)to 
              encoding:NSASCIIStringEncoding]; 
NSData *cipherData = [cipherString dataUsingEncoding:NSASCIIStringEncoding]; 
NSString *cipherDataB64 = [cipherData base64EncodedString]; 
NSLog(@"user encrypted b64: %@", cipherDataB64); // echo null :-(

В Java, у меня нет никаких проблем с base64 кодирования зашифрованных данных. Я уверен, что я делаю что-то не так, но я не знаю, где, потому что это не то, что я делаю каждый день.
Или если вы знаете другой способ сделать это с помощью фреймворков iOS, таких как Security.framework.
Спасибо заранее.

+0

Каков порядок байтов модуля и экспоненты? Это большой эндиан или маленький конец? OpenSSL требует строку с большим номером конца. – doptimusprime

+0

Привет, я совершенно не знаком с этой темой. И я знаю, что это старая нить, поэтому вы можете не помнить. Где вы получили класс RSA? это ваш собственный класс приличий? Библиотека, такая как Чилкат? Или какая-то другая библиотека с открытым исходным кодом? Любая помощь будет принята с благодарностью. :) Привет. David – iamdavidlam

+0

'#include '. Из того, что я помню, вам нужно вручную скомпилировать OpenSSL для iOS или использовать библиотеку, которая уже делает это для вас. Если вы используете CocoaPods (вы все равно должны), вы можете выбрать один из них: http://cocoapods.org/?q=openssl. – florian

ответ

0

Кто-то еще помог мне разобраться. Я не знаю, почему, но я предполагал, что выходной буфер из функции RSA_public_encrypt будет строкой ascii. Хотя это просто байты, о чем говорит документация. Тип char * часто приводит меня к мысли, что он собирается хранить строку (это так неправильно, я думаю, что в последний раз я делаю такую ​​ошибку).
Так, начиная с шага 5:

// 5. encode base 64 
NSData *cipherData = [NSData dataWithBytes:(const void *)to length:result]; 
NSString *cipherDataB64 = [cipherData base64EncodedString]; 
NSLog(@"user encrypted b64: %@", cipherDataB64); // now echo the expected value 
Смежные вопросы