Я пытаюсь зашифровать данные с помощью открытого ключа 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.
Спасибо заранее.
Каков порядок байтов модуля и экспоненты? Это большой эндиан или маленький конец? OpenSSL требует строку с большим номером конца. – doptimusprime
Привет, я совершенно не знаком с этой темой. И я знаю, что это старая нить, поэтому вы можете не помнить. Где вы получили класс RSA? это ваш собственный класс приличий? Библиотека, такая как Чилкат? Или какая-то другая библиотека с открытым исходным кодом? Любая помощь будет принята с благодарностью. :) Привет. David – iamdavidlam
'#include'. Из того, что я помню, вам нужно вручную скомпилировать OpenSSL для iOS или использовать библиотеку, которая уже делает это для вас. Если вы используете CocoaPods (вы все равно должны), вы можете выбрать один из них: http://cocoapods.org/?q=openssl. –
florian