C语言解析pem公钥文件

不说废话了,直接上代码了。。。

/*按行读取一个pem文件所有字符并拼接为一整个字符串返回,去除首行、尾行及换行符*/
char* LoadPemFile(char* pemFilePath,int* length)
{
    FILE* file;
    size_t size = 0;
    char* buff;

    file = fopen(pemFilePath,"rb");
    if(file==NULL)
    {
        return NULL;
    }

    fseek(file,0L,SEEK_END); /*定位至文件尾*/
    size = ftell(file); /*获取文件大小*/
    buff = (char*)malloc(size);
    fseek(file,0L,SEEK_SET); /*定位至文件首*/
    size = 0;

    char line[1024]; //假设单行最长不超过1024,pem文件单行不会超过此限制

    while (!feof(file) && !ferror(file))
    {
        memset(line,0,sizeof(line));
        fgets(line, sizeof(line), file);
        int len=strlen(line);
        line[len-1]=0;//为了去除行尾的\n
        if(line[0]!='-') //去除首行和尾行
        {
            memcpy(buff+size,line,strlen(line));
            size += strlen(line);
        }
    }

    fclose(file);
    *length = size;
    //printf("%s",buff);
    return buff;
}


/*解码Base64,参数bindata需预先分配足够内存。返回值为解码后的实际长度*/
int base64_decode( const char * base64, unsigned char * bindata )
{
    int i, j;
    unsigned char k;
    unsigned char temp[4];
    const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    for ( i = 0, j = 0; base64[i] != '\0' ; i += 4 )
    {
        memset( temp, 0xFF, sizeof(temp) );
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i] )
                temp[0]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+1] )
                temp[1]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+2] )
                temp[2]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+3] )
                temp[3]= k;
        }

        bindata[j++] = ((unsigned char)(((unsigned char)(temp[0] << 2))&0xFC)) |
                ((unsigned char)((unsigned char)(temp[1]>>4)&0x03));
        if ( base64[i+2] == '=' )
            break;

        bindata[j++] = ((unsigned char)(((unsigned char)(temp[1] << 4))&0xF0)) |
                ((unsigned char)((unsigned char)(temp[2]>>2)&0x0F));
        if ( base64[i+3] == '=' )
            break;

        bindata[j++] = ((unsigned char)(((unsigned char)(temp[2] << 6))&0xF0)) |
                ((unsigned char)(temp[3]&0x3F));
    }
    return j;
}

/*从一个公钥pem文件中解析出module、exp数据至rsa_pk_t结构体*/
int ParseRsa2048PublicPemFile(char* pemFilePath,rsa_pk_t *pk)
{
    int length=0;
    char* srcData = LoadPemFile(pemFilePath,&length);
    if(srcData==NULL)
    {
        return -2; //打开文件错误
    }
    //uint8_t destData[294];
    uint8_t destData[1024];
    memset(destData,0,sizeof(destData));
    length = base64_decode(srcData,destData);
    free(srcData);

    if(length>=293)
    {
        int startIndex = 0;
        if(destData[0x1f]==1)
        {
            startIndex = 33;
        }
        else
        {
            startIndex = 32;
        }
        pk->bits = 2048;
        memcpy(&pk->modulus         [RSA_MAX_MODULUS_LEN-256 ],  destData + startIndex,  256);
        memcpy(&pk->exponent        [RSA_MAX_MODULUS_LEN-3],  destData + startIndex + 256 + 2,  3);
        return 0;
    }
    else
    {
        return -1; //文件长度错误
    }
}

C语言解析pem私钥文件写在下一篇文章里了

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用Bouncy Castle库来解析SM2的PEM文件获取公钥。下面是一个简单的示例代码: ```java import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.openssl.PEMParser; import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; import java.io.FileReader; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; public class SM2PEMParserExample { public static void main(String[] args) { try (FileReader reader = new FileReader("public_key.pem")) { PEMParser parser = new PEMParser(reader); SubjectPublicKeyInfo subjectPublicKeyInfo = (SubjectPublicKeyInfo) parser.readObject(); JcaPEMKeyConverter pemConverter = new JcaPEMKeyConverter(); PublicKey publicKey = pemConverter.getPublicKey(subjectPublicKeyInfo); System.out.println(publicKey); } catch (Exception e) { e.printStackTrace(); } } } ``` 以上代码将解析名为"public_key.pem"的PEM文件,并将其转换为公钥对象。如果你需要解析私钥,可以将`SubjectPublicKeyInfo`换成`PEMEncryptedKeyPair`并使用`JcaPEMKeyConverter#getKeyPair`方法来获取私钥和公钥对。 需要注意的是,Bouncy Castle库需要单独引入,你可以在项目中添加以下maven依赖来引入Bouncy Castle库: ```xml <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.68</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.68</version> </dependency> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值