首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASN1_INTEGER到ASN1_STRING

ASN1_INTEGER到ASN1_STRING
EN

Stack Overflow用户
提问于 2012-03-10 21:46:06
回答 5查看 9.2K关注 0票数 7

我正在使用openssl来获取有关x509证书的数据。有没有一种方法可以将ASN1_INTEGER转换成ASN1_STRING,这样就可以很容易地转换成char数组?有没有办法把它转换成其他人类可读的格式?

编辑:我正在使用为iOS编译的openssl,因为我有一个iOS项目。下面是我用来从证书中提取序列号的代码:

代码语言:javascript
复制
ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509);
long value = ASN1_INTEGER_get(serial);
NSLog(@"Serial %ld", value);

certificateX509是一个有效的X509对象,我已经设法从其中获取了一些其他字段(颁发者名称、到期日期等)。

编辑2:

我最终得到了一个解决方案,这可能不是最直接的一个:

代码语言:javascript
复制
 ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509);
 BIGNUM *bnser = ASN1_INTEGER_to_BN(serial, NULL);
 int n = BN_num_bytes(bnser);
 unsigned char outbuf[n];
 int bin = BN_bn2bin(bnser, outbuf);
 char *hexbuf = (char*) outbuf;

然后,hexBuf包含需要将其值读取为十六进制整数的字符,以便检索逻辑值。我使用NSMutableString创建一个人类可读的字符串:

代码语言:javascript
复制
NSMutableString *str = [[NSMutableString alloc] init];
for (int i=0; i<n; i++) {
    NSString *temp = [NSString stringWithFormat:@"%.6x", hexbuf[i]];
    [str appendString:[NSString stringWithFormat:@"%@ ", temp]];
}

如果有更简单的方法,我真的很想知道。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-15 00:27:35

我最终得到了一个解决方案,这可能不是最直接的一个:

代码语言:javascript
复制
 ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509);
 BIGNUM *bnser = ASN1_INTEGER_to_BN(serial, NULL);
 int n = BN_num_bytes(bnser);
 unsigned char outbuf[n];
 int bin = BN_bn2bin(bnser, outbuf);
 char *hexBuf = (char*) outbuf;

然后,hexBuf包含需要将其值读取为十六进制整数的字符,以便检索逻辑值。我使用NSMutableString创建一个人类可读的字符串:

代码语言:javascript
复制
 NSMutableString *str = [[NSMutableString alloc] init];
    for (int i=0; i<n; i++) {
    NSString *temp = [NSString stringWithFormat:@"%.6x", hexbuf[i]];
    [str appendString:[NSString stringWithFormat:@"%@ ", temp]];
}
票数 2
EN

Stack Overflow用户

发布于 2013-06-13 20:58:28

使用内置的BN_bn2hex(BIGNUM *)函数可以更简单地完成ascii十六进制转换

代码语言:javascript
复制
ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509);
BIGNUM *bnser = ASN1_INTEGER_to_BN(serial, NULL);
char *asciiHex = BN_bn2hex(bnser);
票数 12
EN

Stack Overflow用户

发布于 2012-03-11 01:32:25

一种可能性是,您可以将ASN1_INTEGER的值提取为普通的C整数:

代码语言:javascript
复制
#include <openssl/asn1.h>
#include <stdio.h>

int main(int argc, char** argv) {
  long value;
  ASN1_INTEGER asn1int = {0};

  ASN1_INTEGER_set(&asn1int, 42);
  value = ASN1_INTEGER_get(&asn1int);
  printf("The value is %ld.\n", value);

  return 0;
}

像这样编译:

代码语言:javascript
复制
gcc -Wall -o sploots sploots.c -lcrypto

这将生成以下输出:

代码语言:javascript
复制
The value is 42.

要将值作为字符数组中的字符串,请使用snprintf

我怀疑也有可能使用BIO打印例程将值转储到某种类型的BIO (可能是内存BIO)。然而,这种方法似乎更简单。

我得到这个答案的方法是查看了ASN1_INTEGER的OpenSSL头文件。在为基于生物的解决方案寻找合适的API之后,我注意到了ASN1_INTEGER_get函数。

浏览API头文件通常是我学习如何使用OpenSSL的方式,因为太多的OpenSSL没有文档,或者文档不正确,或者文档不完整。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9646929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档