Cryptography 使用opensl以编程方式将rsa私钥从.DER格式转换为.PEM格式

Cryptography 使用opensl以编程方式将rsa私钥从.DER格式转换为.PEM格式,cryptography,openssl,key,rsa,Cryptography,Openssl,Key,Rsa,如何使用openssl api编程将rsa私钥从.DER格式转换为.PEM格式。我可以手动使用openssl exe进行转换。请以编程方式建议如何执行此操作。在C OpenSSL API中,有一些名为i2d.*的函数用于解析内部类型(对于C编程语言,结构名为X509,RSA…)要将DER解析为内部类型,可以使用c编程语言将x509证书文件从DER格式转换为PEM格式 #include <stdio.h> #include <openssl/x509.h> int mai

如何使用openssl api编程将rsa私钥从.DER格式转换为.PEM格式。我可以手动使用openssl exe进行转换。请以编程方式建议如何执行此操作。

在C OpenSSL API中,有一些名为
i2d.*
的函数用于解析内部类型(对于C编程语言,结构名为X509,RSA…)要将DER解析为内部类型,可以使用c编程语言将x509证书文件从DER格式转换为PEM格式

#include <stdio.h>
#include <openssl/x509.h>

int main(int argc,char* argv[]){
    if(argc != 3) {
        printf("Usage: der2pem derfile pemfile\n");
        return 1;
    }
    // try open the derfile
    FILE* derfile = fopen(argv[1],"r");
    if(derfile) {
        // try open or create the pemfile
        FILE* pemfile = fopen(argv[2],"w+");
        if(pemfile) {
            // parse DER to internal X509 structure
            // d2i is d for DER and i for internal which means c data
            X509* internal = d2i_X509_fp(derfile,NULL);
            if(internal) {
                // write from the internal X509 to pemfile
                PEM_write_X509(pemfile,internal);
            }
            else {
                printf("wasn't possible to parse to X509 from the 'derfile'\n");
            }
            fclose(pemfile);
        }
        else {
            printf("can't create or open the 'pemfile' file\n");
            return 1;
        }
        fclose(derfile);
    }
    else {
        printf("can't open the 'derfile' file\n");
        return 1;
    }
    return 0;
}
以下是Java中的示例:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.commons.codec.binary.Base64;
//import org.apache.commons.codec.binary.Base64OutputStream;

public class der2pem {
    public static void main(String args[]) {
        if(args.length < 4) {
            System.out.println("Usage: der2pem_simple derfile pemfile \"-----BEGIN CERTIFICATE-----\" \"-----END CERTIFICATE-----\"");
            return;
        }
        FileOutputStream pemfile;
        try {
            // open the pemfile
            pemfile = new FileOutputStream(args[1]);
        } catch (FileNotFoundException e) {
            try {
                // try to create if not found
                new File(args[1]).createNewFile();
            } catch (IOException e1) {
                System.out.println(e1.getMessage());
                return;
            }
            try {
                // if created open it
                pemfile = new FileOutputStream(args[1]);
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();
                return;
            }
        }
        FileInputStream derfile;
        try {
            // open the derfile
            derfile = new FileInputStream(args[0]);
        } catch (FileNotFoundException e) {
            // if not found print error and get out
            System.out.println(e.getMessage());
            try {
                pemfile.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return;
        }
        try {
//---- last part
        // write the header to pemfile
        pemfile.write(args[2].getBytes());
        pemfile.write('\n');
        // get the size of the derfile and create a buff that fits to this file
        int derf_size = (int) new File(args[0]).length();
        byte[] buffer = new byte[derf_size];
        // read from derfile and write to buffer
        derfile.read(buffer);
        // create the Base64 object for the encoding
        Base64 base64 = new Base64(64,"\n".getBytes());
        // encode and write to pemfile
        pemfile.write(base64.encode(buffer));
        // write the footer to pemfile
        pemfile.write(args[3].getBytes());
        // flush to cleanup
        pemfile.flush();
        pemfile.close();
        derfile.close();
//---- last part end
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
我是用以下方法编写的:

javac der2pem.java -classpath "$CLASSPATH:/usr/share/java/commons-codec.jar"
并与:

java -classpath "$CLASSPATH:/usr/share/java/commons-codec.jar" der2pem test.der tttttt "-----BEGIN CERTIFICATE-----" "-----END CERTIFICATE-----"

您必须在系统中执行类似的操作。

@owlstead我不希望出现否决票,因为我是通过解析完成的。。。但无论如何,我会花更多的时间来写一个没有parsing@owlstead另一个,如果你不知道,例如,如果是私钥,如何将正确的页眉和页脚写入文件?您必须很好地解析它,通常您会查看文件扩展名或mime类型,或者——我猜更常见的情况是——您只知道(例如,从配置文件)。如果要扫描文件夹寻找私钥,这是一个非常奇怪的用例。在unix系统上,您也可以使用
文件
命令。哦,现在是a+1,我想编辑就可以了。@pavan,因为你没有说你喜欢哪种编程语言,我是用c写的。。。在java中更容易。。。当我有时间的时候,我会用Java再写一个例子,非常感谢。我用的是C++。
javac der2pem.java -classpath "$CLASSPATH:/usr/share/java/commons-codec.jar"
java -classpath "$CLASSPATH:/usr/share/java/commons-codec.jar" der2pem test.der tttttt "-----BEGIN CERTIFICATE-----" "-----END CERTIFICATE-----"