2011-06-21 7 views
103

Przechowuję prywatny klucz OpenSl EVP_PKEY jako nsdata. W tym celu dokonuję serializacji w strumieniu bajtów, używając kodu poniżej:Konwertuj NSData na ciąg?

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

gdzie pkey jest typu EVP_PKEY. to jestem przechowywania bajty z bufora „p” jako NSData pomocą wiersza podane poniżej

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

Teraz jestem przekształcenie go do NSString przy użyciu kodu podanego poniżej, ale kiedy je drukować na konsoli jej daje pewne inne postaci.

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

Czy ktoś mógłby pomóc?

Zasadniczo chcę zapisać EVP_PKEY do bazy danych sqlite

jestem na dobrej drodze? Dzięki.

+0

Co masz na myśli mówiąc "inne postacie"? Czy jest to drukowanie dodatkowych znaków na końcu, których nie powinno tam być, czy może drukowanie zupełnie innych znaków, niż się spodziewałeś? –

+0

To całkowicie różni się od tego, co ma być – Zach

+0

Czy jesteś pewien, że dane są w rzeczywistości kodowane w UTF-8? Nie jestem zaznajomiony z i2d_PrivateKey, ale twoje wyniki sugerują, że nie używasz właściwego kodowania. –

Odpowiedz

231

Objective-C

Można użyć (patrz NSString Class Reference)

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

Przykład:

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

uwaga: Proszę zauważyć, wartość NSData musi być ważny dla kodowanie określone (UTF-8 w powyższym przykładzie), otherw ise nil zostaną zwrócone:

Returns nil if the initialization fails for some reason (for example if data does not represent valid data for encoding).

Przed Swift 3,0

String(data: yourData, encoding: NSUTF8StringEncoding) 

Swift 3,0

String(data: yourData, encoding: .utf8) 

Zobacz String#init(data:encoding:) Reference

+0

Dziękuję za odpowiedź. Próbowałem już tego bez żadnego sukcesu. – Zach

+0

Czy próbowałeś dodać swój własny terminator kończący? – bshirley

+0

@bshirley: Tak, próbowaliśmy, że ... nie działa. Możesz zaproponować mi sposób przechowywania mojego evp_key w mojej bazie danych sqlite – Zach

3

wierzę swoje "P" jako param dataWithBytes

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

powinno być "buf"

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

od i2d_PrivateKey umieszcza wskaźnik do bufora wyjściowego p na koniec bufor i czeka na dalsze wejście, a buf wciąż wskazuje początek bufora.

Poniższy kod działa dla mnie gdzie Pkey jest wskaźnikiem do 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); 

można użyć konwertera online do konwertowania danych binarnych w bazie 64 (http://tomeko.net/online_tools/hex_to_base64.php?lang=en) i porównać go do klucza prywatnego w pliku cert po użyciu następującego polecenia i sprawdzając wyjście mypkey.pem:

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

i odwołuje swoje pytanie i this EVP function site na moją odpowiedź.

23

Przed Swift 3.0:

String(data: yourData, encoding: NSUTF8StringEncoding) 

Dla Swift 3.0:

String(data: yourData, encoding: .utf8) 
0

SWIFT:

String(data: data!, encoding: NSUTF8StringEncoding) 
+0

To tylko zmodyfikowana kopia odpowiedzi pierre23, która jest dla mnie lepsza - zwykle używałem tej strony do kopiowania kodu i musiałem zmodyfikować dane do danych! to wymaga czasu. Teraz ja i ty kopiujemy i wklejamy bez modyfikacji. –

+0

To nie jest pytanie związane z metodą Swift. Co więcej, próbka kodu w pytaniu to kod Objective-C. I nie w końcu wymuszone rozwinięcie kodu może doprowadzić do nieoczekiwanych awarii. – Cristik

+0

@Cristik Pytanie nie jest oznaczone jako Obj-C. – Eiko

2

Swift 3:

String(data: data, encoding: .utf8)