说PKI加密签名,首先要了解pki加解密大概流程,一般分为两种,第一种是通过密钥对对称加密,第二种是通过私钥加密。
第一种密钥对加密后会再对密钥对进行非对称加密,即用私钥加密,将加密后的密钥对以密文方式发送给接收方,接收方接到密文后,先用公钥解密密钥对,获取密钥对之后,再用密钥对解密,从而得到真正想要数据。
第二种直接用私钥加密,接收方接到密文后,直接用公钥解密,即可得到真正数据。
第一种方式加解密java代码示例
一,分别获取16位,和8位密钥对
参数symcIv传16或8即可
//生成密钥对
byte[] genrandomSymcKey = FileTools.genrandomSymc(16);
log.info("+++++++++++++++++++++++++++++:{}", ConverterUtil.toHexString(genrandomSymcKey));
byte[] genrandomSymcIv = FileTools.genrandomSymc(8);
log.info("+++++++++++++++++++++++++++++:{}",ConverterUtil.toHexString(genrandomSymcIv));
public static byte[] genrandomSymc(int symcIv) {
try {
ConfigTool.getInstance().init();
byte[] genrandomSymcIv = TCACryptoUtil.GenrandomBytes(symcIv);
return genrandomSymcIv;
} catch (Exception var2) {
var2.printStackTrace();
return null;
}
}
二用密钥对对文件等加密Java代码示例
//生成加密脚本文件,orginalSciptResult参数为文件字节数组,savePathScript为加密后文件保存路径
FileTools.symmEncFileByte(genrandomSymcKey,genrandomSymcIv,orginalSciptResult,savePathScript);
public static String symmEncFileByte(byte[] genrandomSymcKey, byte[] genrandomSymcIv, byte[] file, String enFilePath) {
String mess = "";
try {
ConfigTool.getInstance().init();
Date start = new Date();
byte[] encFile = TCACryptoUtil.symmEnc("SM4", genrandomSymcKey, genrandomSymcIv, file);
outputFile(enFilePath, encFile);
Date end = new Date();
long time = end.getTime() - start.getTime();
mess = "加密成功,解密后文件为:" + enFilePath + ";操作总耗时:" + time + "毫秒";
System.out.println(mess);
} catch (Exception var10) {
var10.printStackTrace();
}
return mess;
}
第二种加密方式代码示例
一获取公钥
Certificate cert = new Certificate(certifcateContent);//certifcateContent为对外广播的公钥
二用公钥对文件等加密
String encSecretKey = CertTools.encryptRaw(ConverterUtil.toHexString(genrandomSymcKey) + "^" + ConverterUtil.toHexString(genrandomSymcIv),vehicalCertificate.get(0).getCertificate()).replaceAll("\n","");