qq_41837784 2022-08-27 17:07 采纳率: 0%
浏览 33
已结题

SM2的pkcs8格式公钥私钥问题

有没有朋友 清楚怎么从SM2的pkcs8格式公钥私钥中提取出公钥x、y和私钥参数的,以及怎样将公钥私钥参数组织成pkcs8格式公私钥的c语言方法的

  • 写回答

1条回答 默认 最新

  • 寒冬i 2022-09-02 13:54
    关注
    import org.apache.commons.codec.binary.Base64;
    
    import org.apache.commons.io.FileUtils;
    
    import java.io.ByteArrayInputStream;
    
    import java.io.ByteArrayOutputStream;
    
    import java.io.File;
    
    import java.security.KeyFactory;
    
    import java.security.KeyStore;
    
    import java.security.PrivateKey;
    
    import java.security.PublicKey;
    
    import java.security.cert.Certificate;
    
    import java.security.cert.X509Certificate;
    
    import java.security.spec.PKCS8EncodedKeySpec;
    
    import java.security.spec.X509EncodedKeySpec;
    
    import java.util.Enumeration;
    
    /**
    
    * Created by ssl on 2017/9/5.
    
    */
    
    public class PFXUtil {
    
    /**
    
    * 获取RSA算法的keyFactory
    
    *
    
    *@return
    
    */
    
    private static KeyFactory getKeyFactory() throws Exception {
    
    return getKeyFactory("RSA");
    
    }
    
    /**
    
    * 获取指定算法的keyFactory
    
    *
    
    *@param algorithm
    
    *@return
    
    */
    
    private static KeyFactory getKeyFactory(String algorithm) throws Exception {
    
    KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
    
    return keyFactory;
    
    }
    
    /**
    
    * 根据pfx证书获取keyStore
    
    *
    
    *@param pfxData
    
    *@param password
    
    *@return
    
    *@throws Exception
    
    */
    
    private static KeyStore getKeyStore(byte[] pfxData, String password) throws Exception {
    
    KeyStore keystore = KeyStore.getInstance("PKCS12");
    
    keystore.load(new ByteArrayInputStream(pfxData), password.toCharArray());
    
    return keystore;
    
    }
    
    /**
    
    * 根据pfx证书得到私钥
    
    *
    
    *@param pfxData
    
    *@param password
    
    *@throws Exception
    
    */
    
    public static PrivateKey getPrivateKeyByPfx(byte[] pfxData, String password) throws Exception {
    
    PrivateKey privateKey = null;
    
    KeyStore keystore = getKeyStore(pfxData, password);
    
    Enumeration enums = keystore.aliases();
    
    String keyAlias = "";
    
    while (enums.hasMoreElements()) {
    
    keyAlias = enums.nextElement();
    
    if (keystore.isKeyEntry(keyAlias)) {
    
    privateKey = (PrivateKey) keystore.getKey(keyAlias, password.toCharArray());
    
    }
    
    }
    
    return privateKey;
    
    }
    
    /**
    
    * 根据pfx证书得到私钥
    
    *
    
    *@param pfxPath
    
    *@param password
    
    *@return
    
    *@throws Exception
    
    */
    
    public static PrivateKey getPrivateKeyByPfx(String pfxPath, String password) throws Exception {
    
    File pfxFile = new File(pfxPath);
    
    return getPrivateKeyByPfx(FileUtils.readFileToByteArray(pfxFile), password);
    
    }
    
    /**
    
    * 根据私钥字节数组获取私钥对象
    
    *
    
    *@param privateKeyByte
    
    *@return
    
    *@throws Exception
    
    */
    
    public static PrivateKey getPrivateKey(byte[] privateKeyByte) throws Exception {
    
    PrivateKey privateKey = null;
    
    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyByte);
    
    KeyFactory keyFactory = getKeyFactory();
    
    privateKey = keyFactory.generatePrivate(keySpec);
    
    return privateKey;
    
    }
    
    /**
    
    * 根据私钥Base64字符串获取私钥对象
    
    *
    
    *@param privateKeyStr
    
    *@return
    
    *@throws Exception
    
    */
    
    public static PrivateKey getPrivateKey(String privateKeyStr) throws Exception {
    
    byte[] privateKeyByte = Base64.decodeBase64(privateKeyStr);
    
    return getPrivateKey(privateKeyByte);
    
    }
    
    /**
    
    * 根据公钥字节数组获取公钥
    
    *
    
    *@param publicKeyByte 公钥字节数组
    
    *@return
    
    *@throws Exception
    
    */
    
    public static PublicKey getPublicKey(byte[] publicKeyByte) throws Exception {
    
    PublicKey publicKey = null;
    
    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyByte);
    
    KeyFactory keyFactory = getKeyFactory();
    
    publicKey = keyFactory.generatePublic(keySpec);
    
    return publicKey;
    
    }
    
    /**
    
    * 根据公钥base64字符串获取公钥
    
    *
    
    *@param publicKeyStr Base64编码后的公钥字节数组
    
    *@return
    
    *@throws Exception
    
    */
    
    public static PublicKey getPublicKey(String publicKeyStr) throws Exception {
    
    byte[] publicKeyByte = Base64.decodeBase64(publicKeyStr);
    
    return getPublicKey(publicKeyByte);
    
    }
    
    /**
    
    * 根据pfx证书获取证书对象
    
    *
    
    *@param pfxData pfx的字节数组
    
    *@param password pfx证书密码
    
    *@return
    
    *@throws Exception
    
    */
    
    public static X509Certificate getX509Certificate(byte[] pfxData, String password) throws Exception {
    
    X509Certificate x509Certificate = null;
    
    KeyStore keystore = getKeyStore(pfxData, password);
    
    Enumeration enums = keystore.aliases();
    
    String keyAlias = "";
    
    while (enums.hasMoreElements()) {
    
    keyAlias = enums.nextElement();
    
    if (keystore.isKeyEntry(keyAlias)) {
    
    x509Certificate = (X509Certificate) keystore.getCertificate(keyAlias);
    
    }
    
    }
    
    return x509Certificate;
    
    }
    
    /**
    
    * 根据pfx证书获取证书对象
    
    *
    
    *@param pfxPath pfx证书路径
    
    *@param password pfx证书密码
    
    *@return
    
    *@throws Exception
    
    */
    
    public static X509Certificate getX509Certificate(String pfxPath, String password) throws Exception {
    
    File pfxFile = new File(pfxPath);
    
    return getX509Certificate(FileUtils.readFileToByteArray(pfxFile), password);
    
    }
    
    //生成pkcs12
    
    /**
    
    * 根据私钥、公钥证书、密码生成pkcs12
    
    *
    
    *@param privateKey 私钥
    
    *@param x509Certificate 公钥证书
    
    *@param password 需要设置的密钥
    
    *@return
    
    *@throws Exception
    
    */
    
    public static byte[] generatorPkcx12(PrivateKey privateKey, X509Certificate x509Certificate, String password)
    
    throws Exception {
    
    Certificate[] chain = {x509Certificate};
    
    KeyStore keystore = KeyStore.getInstance("PKCS12");
    
    keystore.load(null, password.toCharArray());
    
    keystore.setKeyEntry(x509Certificate.getSerialNumber().toString(), privateKey, password.toCharArray(), chain);
    
    ByteArrayOutputStream bytesos = new ByteArrayOutputStream();
    
    keystore.store(bytesos, password.toCharArray());
    
    byte[] bytes = bytesos.toByteArray();
    
    return bytes;
    
    }
    
    //合成pfx
    
    /**
    
    * 根据私钥、公钥证书、密钥,保存为pfx文件
    
    *
    
    *@param privateKey 私钥
    
    *@param x509Certificate 公钥证书
    
    *@param password 打开pfx的密钥
    
    *@param saveFile 保存的文件
    
    *@return
    
    *@throws Exception
    
    */
    
    public static String generatorPFX(PrivateKey privateKey, X509Certificate x509Certificate, String password, File
    
    saveFile) throws Exception {
    
    //判断文件是否存在
    
    if (!saveFile.exists()) {
    
    //判断文件的目录是否存在
    
    if (!saveFile.getParentFile().exists()) {
    
    saveFile.getParentFile().mkdirs();
    
    }
    
    saveFile.createNewFile();
    
    }
    
    byte[] pkcs12Byte = generatorPkcx12(privateKey, x509Certificate, password);
    
    FileUtils.writeByteArrayToFile(saveFile, pkcs12Byte);
    
    return saveFile.getPath();
    
    }
    
    public static void main(String[] args) throws Exception {
    
    String pfxPath = "C:\\Users\\49383\\Desktop\\文件\\国新测试证书-1.pfx";
    
    String password = "1";
    
    //私钥:pfx文件中获取私钥对象
    
    PrivateKey privateKey = getPrivateKeyByPfx(pfxPath, password);
    
    byte[] privateKeyByte = privateKey.getEncoded();
    
    String privateKeyStr = Base64.encodeBase64String(privateKeyByte);
    
    System.out.println("私钥Base64字符串:" + privateKeyStr);
    
    //=====私钥Base64字符串转私钥对象
    
    PrivateKey privateKey2 = getPrivateKey(privateKeyStr);
    
    System.out.println("私钥Base64字符串2:" + Base64.encodeBase64String(privateKey2.getEncoded()));
    
    //证书:从pfx文件中获取证书对象
    
    X509Certificate certificate = getX509Certificate(pfxPath, password);
    
    System.out.println("证书主题:" + certificate.getSubjectDN().getName());
    
    String publicKeyStr = Base64.encodeBase64String(certificate.getPublicKey().getEncoded());
    
    System.out.println("公钥Base64字符串:" + publicKeyStr);
    
    //=====根据公钥Base64字符串获取公钥对象
    
    System.out.println("公钥Base64字符串2:" + Base64.encodeBase64String(getPublicKey(publicKeyStr).getEncoded()));
    
    //PFX:合成pfx(需要私钥、公钥证书)
    
    String savePath = generatorPFX(privateKey, certificate, "1", new File
    
    ("C:\\Users\\49383\\Desktop\\文件\\009\\009.pfx"));
    
    System.out.println(savePath);
    
    }
    
    }
    
    评论

报告相同问题?

问题事件

  • 系统已结题 9月4日
  • 创建了问题 8月27日