我将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数据库
答案 0 :(得分:246)
<强>目标C 强>
您可以使用(参见NSString Class Reference)
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding
示例:
NSString *myString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];
备注:请注意NSData
值必须对指定的编码有效(上例中为UTF-8),否则将返回nil
:
之前的Swift 3.0
String(data: yourData, encoding: NSUTF8StringEncoding)
Swift 3.0
String(data: yourData, encoding: .utf8)
答案 1 :(得分:23)
之前的Swift 3.0:
String(data: yourData, encoding: NSUTF8StringEncoding)
对于Swift 4.0:
String(data: yourData, encoding: .utf8)
答案 2 :(得分:3)
我相信你的“P”作为dataWithBytes param
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);
使用以下命令并检查mypkey.pem的输出后,您可以使用在线转换器将二进制数据转换为base 64(http://tomeko.net/online_tools/hex_to_base64.php?lang=en)并将其与cert文件中的私钥进行比较: / p>
openssl pkcs12 -in myCert.p12 -nocerts -nodes -out mypkey.pem
我引用了您的问题,this EVP function site提到了我的答案。
答案 3 :(得分:2)
斯威夫特3:
String(data: data, encoding: .utf8)
答案 4 :(得分:0)
夫特:
String(data: data!, encoding: NSUTF8StringEncoding)
答案 5 :(得分:0)
将任意NSData转换为NSString的简单方法是对其进行base64编码。
NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];
然后,您可以将其存储到数据库中以便以后重复使用。只需将其解码回NSData。