web-dev-qa-db-fra.com

Convertir NSData en chaîne?

Je stocke une clé privée openssl EVP_PKEY sous le nom nsdata. Pour cela, je sérialise dans un flux d'octets en utilisant le code ci-dessous

unsigned char *buf, *p;
int len;
len = i2d_PrivateKey(pkey, NULL);
buf = OPENSSL_malloc(len); 
p = buf;
i2d_PrivateKey(pkey, &p);

où pkey est de type EVP_PKEY . Alors je stocke les octets du tampon 'p' en tant que NSData en utilisant la ligne indiquée ci-dessous

NSData *keydata = [NSData dataWithBytes:P length:len];

Maintenant, je le convertis en NSString en utilisant le code donné ci-dessous, mais lorsque je l’imprime sur la console, il donne d’autres caractères.

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

Quelqu'un pourrait aider? 

Fondamentalement, je veux stocker le EVP_PKEY dans une base de données sqlite

suis-je sur la bonne voie? Merci.

112
Zach

Objectif c

Vous pouvez utiliser (voir Référence de la classe NSString )

- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding

Exemple :

NSString *myString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];

Remarque: Veuillez noter que la valeur NSData doit être valide pour le codage spécifié (UTF-8 dans l'exemple ci-dessus), sinon nil sera renvoyé:

Renvoie la valeur nil si l'initialisation échoue pour une raison quelconque (par exemple, si les données ne représentent pas des données valides pour le codage).

Prior Swift 3.0

String(data: yourData, encoding: NSUTF8StringEncoding)

Swift 3.0

String(data: yourData, encoding: .utf8)

Voir String # init (data: encoding :) Référence

247
louiscoquio

Prior Swift 3.0:

String(data: yourData, encoding: NSUTF8StringEncoding)

Pour Swift 4.0:

String(data: yourData, encoding: .utf8)
23
pierre23

Je crois que votre "P" en tant que paramètre dataWithBytes

NSData *keydata = [NSData dataWithBytes:P length:len];

devrait être "buf"

NSData *keydata = [NSData dataWithBytes:buf length:len];

depuis i2d_PrivateKey place le pointeur sur le tampon de sortie p à la fin du tampon et attend une nouvelle entrée, et buf pointe toujours vers le début de votre tampon.

Le code suivant fonctionne pour moi où pkey est un pointeur sur un 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);

Vous pouvez utiliser un convertisseur en ligne pour convertir vos données binaires en base 64 ( http://tomeko.net/online_tools/hex_to_base64.php?lang=en ) et les comparer à la clé privée de votre fichier de cert après avoir utilisé la commande suivante et en vérifiant la sortie de mypkey.pem:

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

J'ai référencé votre question et ce site de fonction EVP pour ma réponse.

3
aspergillusOryzae

Swift 3:

String(data: data, encoding: .utf8)
2
Travis M.

Un moyen simple de convertir NSData arbitraire en NSString consiste à l'encoder en base64. 

NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];

Vous pouvez ensuite le stocker dans votre base de données pour une réutilisation ultérieure. Il suffit de le décoder de nouveau dans NSData.

0
Billy

Rapide:

String(data: data!, encoding: NSUTF8StringEncoding)
0
Alexander Volkov