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.
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é:
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)
Pour Swift 4.0:
String(data: yourData, encoding: .utf8)
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.
Swift 3:
String(data: data, encoding: .utf8)
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.
Rapide:
String(data: data!, encoding: NSUTF8StringEncoding)