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];
今、私はそれを以下のコードを使用してNSStringに変換していますが、コンソールに印刷すると、他の文字が表示されます。
NSString *content =[ NSString stringWithCString:[keydata bytes] encoding:NSUTF8StringEncoding];
誰か助けてもらえますか?
基本的に、EVP_PKEYをsqliteデータベースに保存したい
私は正しい軌道に乗っていますか?ありがとう。
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(data:encoding :) Reference を参照してください
前のSwift 3.0:
String(data: yourData, encoding: NSUTF8StringEncoding)
For Swift 4.0:
String(data: yourData, encoding: .utf8)
DataWithBytesパラメータとしての「P」を信じます
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機能サイト を参照して回答を求めました。
スウィフト3:
String(data: data, encoding: .utf8)
任意のNSDataをNSStringに変換する簡単な方法は、base64でエンコードすることです。
NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];
その後、後で再利用するためにデータベースに保存できます。 NSDataにデコードするだけです。
迅速:
String(data: data!, encoding: NSUTF8StringEncoding)