Я сохраняю закрытый ключ EVS_PKEY opensl как nsdata. Для этого я сериализую в поток байтов, используя код ниже
unsigned char *buf, *p;
int len;
len = i2d_PrivateKey(pkey, NULL);
buf = OPENSSL_malloc(len);
p = buf;
i2d_PrivateKey(pkey, &p);
где pkey имеет тип EVP_PKEY. Затем я сохраняю байты из буфера "p" в качестве NSData, используя приведенную ниже строку
NSData *keydata = [NSData dataWithBytes:P length:len];
Теперь я конвертирую его в NSString, используя приведенный ниже код, но когда я печатаю его в консоли, он дает некоторые другие символы.
NSString *content =[ NSString stringWithCString:[keydata bytes] encoding:NSUTF8StringEncoding];
Может ли кто-нибудь помочь?
В принципе, я хочу сохранить EVP_PKEY в базу данных sqlite
Я на правильном пути? Спасибо.
Objective-C
Вы можете использовать (см. Ссылка на класс NSString)
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding
Пример:
NSString *myString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];
Примечание. Обратите внимание, что значение NSData
должно быть действительным для указанной кодировки (UTF-8 в приведенном выше примере), иначе nil
будет возвращен:
Prior Swift 3.0
String(data: yourData, encoding: NSUTF8StringEncoding)
Swift 3.0
String(data: yourData, encoding: .utf8)
Prior Swift 3.0:
String(data: yourData, encoding: NSUTF8StringEncoding)
Для Swift 3.0:
String(data: yourData, encoding: .utf8)
Я считаю, что ваш "P" в качестве параметра dataWithBytes
NSData *keydata = [NSData dataWithBytes:P length:len];
должен быть "buf"
NSData *keydata = [NSData dataWithBytes:buf length:len];
так как i2d_PrivateKey помещает указатель на выходной буфер p в конце буфера и ожидает ввода дополнительных данных, а buf все еще указывает на начало вашего буфера.
Следующий код работает для меня, где pkey является указателем на EVP_PKEY:
unsigned char *buf, *pp;
int len = i2d_PrivateKey(pkey, NULL);
buf = OPENSSL_malloc(len);
pp = buf;
i2d_PrivateKey(pkey, &pp);
NSData* pkeyData = [NSData dataWithBytes:(const void *)buf length:len];
DLog(@"Private key in hex (%d): %@", len, pkeyData);
Вы можете использовать онлайн-конвертер для преобразования ваших двоичных данных в базу 64 (http://tomeko.net/online_tools/hex_to_base64.php?lang=en) и сравнить его с закрытым ключом в вашем cert после использования следующей команды и проверки вывода mypkey.pem:
openssl pkcs12 -in myCert.p12 -nocerts -nodes -out mypkey.pem
Я ответил на ваш вопрос и этот сайт функции EVP для моего ответа.
Swift 3:
String(data: data, encoding: .utf8)
Swift:
String(data: data!, encoding: NSUTF8StringEncoding)