Конвертировать NSData в строку? - PullRequest
113 голосов
/ 21 июня 2011

Я храню закрытый ключ openssl EVP_PKEY как 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];

Теперь я преобразую его в строку NSSt, используя приведенный ниже код, но когда я печатаю его в консоль, это даетнекоторые другие персонажи.

NSString *content =[ NSString stringWithCString:[keydata bytes] encoding:NSUTF8StringEncoding];

Может кто-нибудь помочь?

По сути, я хочу сохранить EVP_PKEY в базе данных sqlite

Я на правильном пути?Спасибо.

Ответы [ 6 ]

247 голосов
/ 21 июня 2011

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)

См. String # init (данные: кодировка :) Ссылка

23 голосов
/ 19 февраля 2016

Prior Swift 3.0:

String(data: yourData, encoding: NSUTF8StringEncoding)

Для Swift 4.0:

String(data: yourData, encoding: .utf8)
3 голосов
/ 12 июля 2012

Я считаю, что ваш "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);

Вы можете использовать онлайн-конвертер для преобразования ваших двоичных данных в base 64 (http://tomeko.net/online_tools/hex_to_base64.php?lang=en) и сравнить его с закрытым ключом в вашем файле сертификата после использования следующей команды и проверки вывода mypkey.pem:

openssl pkcs12 -in myCert.p12 -nocerts -nodes -out mypkey.pem

Я сослался на ваш вопрос и этот сайт функции EVP для моего ответа.

2 голосов
/ 17 октября 2016

Swift 3:

String(data: data, encoding: .utf8)
0 голосов
/ 13 июня 2018

Простой способ преобразовать произвольные NSData в NSString - это закодировать их base64.

NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];

Затем вы можете сохранить его в своей базе данных для последующего использования.Просто декодируйте его обратно в NSData.

0 голосов
/ 18 августа 2016

Свифт:

String(data: data!, encoding: NSUTF8StringEncoding)
...