2011-06-21 7 views
103

私はnsdataとして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型です。 そして私は今、私は下記のコードを使用してNSStringのに変換が、私は、コンソールにそれを印刷するときに、その一部を与えてい

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

下記ラインを使用して、バッファからのNSDataとして「P」をバイトを記憶していその他の文字。

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

誰かに助けてもらえますか?

基本的に私はSQLiteのデータベース

にEVP_PKEY を保存するには、私は正しい軌道に乗っていますか?おかげさまで

+0

「他のキャラクター」ってどういう意味ですか?それはそこにあるべきではない最後に余分な文字を印刷していますか、まったく異なった文字を印刷していますか? –

+0

全く異なっています – Zach

+0

実際にデータが実際にUTF-8でエンコードされていますか?私はi2d_PrivateKeyに慣れていませんが、あなたの結果は正しい文字列エンコーディングを使用していないことを示唆しています。 –

答えて

231

のObjective-Cを使用でき

NSString Class Referenceを参照)

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

例:

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

備考NSData値はに対して有効である必要があります注意してください指定されたエンコーディング(上記の例ではUTF-8)、otherw ISE nilが返されます。

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

前スウィフト3.0

String(data: yourData, encoding: NSUTF8StringEncoding) 

スウィフト3.0

String(data: yourData, encoding: .utf8) 

私はi2d_PrivateKeyはの終わりに、出力バッファpにポインタを置くので、dataWithBytesのPARAMとして、あなたの "P"

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

は "BUF"

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

あるべきと考えていString#init(data:encoding:) Reference

+0

あなたの返信ありがとうございます。私はすでに成功していないそれを試みました。 – Zach

+0

独自のヌルターミネーターを追加しようとしましたか? – bshirley

+0

@bshirley:はい、私たちはそれを試みました..まだ動作していません。あなたは私のsqliteデータベースに私のevp_keyを格納する方法を提案してください。 – Zach

3

を参照してください。バッファーはさらなる入力を待っており、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)にあなたのバイナリデータを変換するオンラインコンバータを使用して、秘密鍵と比較することができます次のコマンドを使用してmypkey.pemの出力をチェックした後、あなたの証明書ファイルに:

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

私は私の答えのためにあなたの質問やthis EVP function siteを参照しました。

23

前スイフト3.0:

String(data: yourData, encoding: NSUTF8StringEncoding) 

スイフト3.0:

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

スウィフト:

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

これはちょうど私のためによいpierre23答えのちょうど修正されたコピー - 私は通常コードをコピーするためにこのページを使用し、あなたのデータをデータに変更しなければならなかった!時間がかかる。今私とあなたは変更せずにコピー&ペーストします。 –

+0

これはスウィフト関連の質問ではありません。さらに、問題のコードサンプルはObjective-Cコードです。最後に、コードから強制的にアンラップすると予期しないクラッシュが発生する可能性があります。 – Cristik

+0

@Cristik質問はObj-Cとタグ付けされていません。 – Eiko

2

スウィフト3:

String(data: data, encoding: .utf8) 
関連する問題