通过openssl/c/c++以字节形式读取RSA公钥
read RSA public key as bytes via openssl / c / c++
我正在尝试向服务器发送2048位(256字节)的RSA公钥。我需要将数据作为字节流读取。我似乎找不到办法。
BIO *memBio = BIO_new(BIO_s_mem());
ASN1_PCTX *asn1=ASN1_PCTX_new();//useless unless I know how to use it
BIO_set_flags(memBio, BIO_FLAGS_WRITE);
int ret=EVP_PKEY_print_private(memBio,rsaAppKeys,0, asn1 );
BUF_MEM *bptr;
BIO_get_mem_ptr(memBio, &bptr);
BIO_set_close(memBio, BIO_NOCLOSE); /* So BIO_free() leaves BUF_MEM alone */
BIO_free(memBio);
它在内存中以DER格式打印密钥,十六进制字节格式为字符串,每个字节之间有":"和一个标头。我可以解析它,但我认为一定有更好的方法。在文档中写道,通过使用ASN1_PCTX,我可以微调输出,但我找不到任何文档
有没有一种简单的方法可以将密钥作为原始字节?感谢
好的。。我等不及了,所以我设计了一个肮脏的黑客:
- 首先我生成PEM格式的密钥
- 然后对其进行解析以提取ASN.1结构
- 然后从ASN.1结构中提取2048比特的密钥
至少可以说,ASN.1解析是肮脏的。建议欢迎
我也用过http://lapo.it/asn1js/以探索ASN.1结构。和https://shanetully.com/2012/04/simple-public-key-encryption-with-rsa-and-openssl/尝试以base64格式将密钥打印到字符串。
//generic method to extract data from an EVP_PKEY
//it's very UGLY. I'm ashamed especially of the ASN.1 parsing (!!)
-(NSData *)getPublicKeyBytes:(EVP_PKEY *)rsaKey{
///try to write bytes
BIO *pub = BIO_new(BIO_s_mem());
//write pub key as this format:
//-----BEGIN RSA PUBLIC KEY-----
//MIIBCgKCAQEA3J7MfnosapxZH9ibxm9Gz88X+ryEEk616BtXGFx3SH1T7ssjdTvv
//pL8FRAvnmHegtNm0JsCFbEWdGzFr1F7BFYu1lj6h7JFPIhlalMMSlGsRP5dzzj8q
//....
//-----END RSA PUBLIC KEY-----
//
PEM_write_bio_RSAPublicKey(pub, rsaKey->pkey.rsa);
size_t pub_len = BIO_pending(pub);
char *pub_key = malloc(pub_len + 1);
BIO_read(pub, pub_key, pub_len);
//zero terminated string
pub_key[pub_len] = ' ';
//transform to nsstring
NSString *plainKey=[[NSString alloc]initWithCString:pub_key encoding:NSASCIIStringEncoding];
//search for header
NSRange range=[plainKey rangeOfString:@"-----BEGIN RSA PUBLIC KEY-----"];
if(range.location==NSNotFound){
DLog(@"Error, RSA pub key in wrong format: %@",plainKey);
return nil;
}
//strip header
plainKey=[plainKey substringFromIndex:range.location+range.length];
//search footer
range=[plainKey rangeOfString:@"-----END RSA PUBLIC KEY-----"];
if(range.location==NSNotFound){
DLog(@"Error, RSA pub key in wrong format: %@",plainKey);
return nil;
}
//strip footer
plainKey=[plainKey substringToIndex:range.location];
//now remove n
plainKey=[plainKey stringByReplacingOccurrencesOfString:@"n" withString:@""];
plainKey=[plainKey stringByReplacingOccurrencesOfString:@"r" withString:@""];
//DLog(@"Plain key stripped %@",plainKey);
//now read as byte
NSData *rsaBytes=[NSData dataWithBase64EncodedString:plainKey];
//DLog(@"Data is %d len %@",rsaBytes.length,rsaBytes);
//unfortunately data is in a ASN1 rame;;
//it's a sequence of 2 element, integer and exponent (65537).
//the key starts from byte 9, or 10.. (byte 9 is a zero).
NSData *pubKeyBytes=[rsaBytes subdataWithRange:NSMakeRange(9, 256)];
DLog(@"pubKeyBytes is %d len %@",pubKeyBytes.length,pubKeyBytes);
return pubKeyBytes;
}
使用d2i_RSA_PUBKEY()
从der编码的字节流创建RSA公钥
然后使用CCD_ 2函数将RSA公钥模数转换为大端字节流。
例如。
RSA * pubKey = d2i_RSA_PUBKEY(NULL, <der encoded byte stream pointer>, <num bytes>);
BN_bn2bin(pubKey->n, <where to put the result>);
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- C++生成 RSA 密钥对并读取
- 如何使用OpenSSL API从其PEM格式字符串中读取RSA公钥
- 通过openssl/c/c++以字节形式读取RSA公钥
- OpenSSL,从CString读取公共RSA密钥
- 如何读取RSA公钥和私钥到单个RSA结构