使用BouncyCastle进行PKCS7签名

public class SignDemoPKCS7
{
private byte[] contentdata;
private String keystore = "D:/cert/icbxcmp",keystore51="D:/epay/wspki/wsc-01.jks";
private String ks_type = "JKS";
private String pswd = "1qaz2wsx",sqclientpass="lavida";
private String prikeyname="icbccmpapiprivate",sqclientpri="wsc01";
private byte[] SignData(String text)
{
Provider provider = new BouncyCastleProvider();
Security.addProvider(provider);
PKCS7SignedData pkcs7sd;
contentdata = text.getBytes();
byte signdata[] = (byte[])null;
char passphrase[] = pswd.toCharArray();

KeyStore ks;
try {
ks = KeyStore.getInstance(ks_type);
ks.load(new FileInputStream(keystore), passphrase);

PrivateKey prikey=(PrivateKey)ks.getKey(prikeyname, passphrase);

pkcs7sd = new PKCS7SignedData(prikey,ks.getCertificateChain("icbccmpapiprivate"),"SHA1","BC");
pkcs7sd.update(contentdata, 0, contentdata.length);

signdata = pkcs7sd.getEncoded();

return signdata;
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
}
return null;
}
public byte[] createPKCS7(String text)
{
byte[] signedData = (byte[])null;
char passphrase[] = pswd.toCharArray();
try
{
Provider provider = new BouncyCastleProvider();
Security.addProvider(provider);

KeyStore ks = KeyStore.getInstance(ks_type);
ks.load(new FileInputStream(keystore), passphrase);
Certificate cert = (Certificate) ks.getCertificate("icbccmpapipublic");
PrivateKey prikey=(PrivateKey)ks.getKey(prikeyname, passphrase);
ArrayList certList = new ArrayList();
Certificate[] certChain = ks.getCertificateChain("icbccmpapiprivate");
for ( int i = 0; i < certChain.length;i++)
{
certList.add(certChain[i]);
}
X509Certificate cerx509 = (X509Certificate)cert;
CMSProcessable msgcontent = new CMSProcessableByteArray(text.getBytes("GB2312"));

CertStore certs = CertStore.getInstance("Collection",new CollectionCertStoreParameters(certList), "BC");

CMSSignedDataGenerator gen = new CMSSignedDataGenerator();

gen.addSigner(prikey, cerx509,CMSSignedGenerator.DIGEST_SHA1);
gen.addCertificatesAndCRLs(certs);
//1,eContentType,版本号;3,detached model; 4,provider ;5, stream
CMSSignedData signdata = gen.generate(msgcontent,true,"BC");
//gen.generate("Y",msgcontent,true,"BC",false);
signedData = signdata.getContentInfo().getEncoded("DER") ;//数据分割DER
return signedData;
// byte[] op = (byte[])msgcontent.getContent();
// CMSSignedDataStreamGenerator genstream = new CMSSignedDataStreamGenerator();
// genstream.addSigner(prikey, cerx509, CMSSignedDataStreamGenerator.DIGEST_SHA1, "BC");
// genstream.addCertificatesAndCRLs(certs);
// int buff = 16384;
// byte[] buffer = new byte[buff];
// int unitsize = 0;
// long read = 0;
//
// byte [] hong = text.getBytes("GB2312");
//
// ByteArrayOutputStream bOut = new ByteArrayOutputStream();
//
// OutputStream dataout = genstream.open(bOut,true);
//
//
// dataout.write(hong);
// dataout.close();
// byte temp[] = bOut.toByteArray();
// bOut.close();

} catch (Exception e) {
e.printStackTrace();
return null;
}
}

public static char byte2char(byte b)
{
return (char) b;
}
public String plain()
{

//System.out.println(trandate+"--"+trantime+"--"+pid);
String textcontent="signdata";
//System.out.println(textcontent);
return textcontent;
}
public String getBase64()
{
//String x = plain();
String myname = "wanghan";
byte[] temp1 = createPKCS7(myname);
byte[] temp2 = Base64.encode(temp1);
int count =0;
String str = "";
for (int i = 0; i < temp2.length; i++)
{
str= str+byte2char(temp2[i]);
System.out.print(byte2char(temp2[i]));
count++;
if(count%64==0)
{
System.out.println();
}

}
System.out.println("");
System.out.println(str);

return str;
}

public String getdate()
{
return trandate;
}
public String gettime()
{
return trantime;
}
public String getpid()
{
return pid;
}
public SignDemoPKCS7()
{
date = new Date();
SimpleDateFormat simple = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat t = new SimpleDateFormat("HHmmss");
trandate = simple.format(date.getTime());
trantime = t.format(date.getTime())+"000";
Random i = new Random();
pid = String.valueOf(Math.abs(i.nextInt(1000)));
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
}
public Date date;
public String trandate;
public String trantime;
public String pid;
public static void main(String[] args)
{
//new SignDemoPKCS7().plain();

new SignDemoPKCS7().getBase64();
}

}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
将 PKCS#1 签名转换为 PKCS#7 签名可以按照以下步骤进行操作: 1. 首先,确保你已经正确引入了Bouncy Castle库。你可以在项目中添加BC库的JAR文件或者使用构建工具(如Maven)来添加依赖。 2. 导入所需的类: ```java import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; import org.bouncycastle.cms.CMSProcessableByteArray; import org.bouncycastle.cms.CMSSignedData; import org.bouncycastle.cms.CMSSignedDataGenerator; import org.bouncycastle.cms.CMSTypedData; import org.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder; import org.bouncycastle.jce.provider.BouncyCastleProvider; import java.security.PrivateKey; import java.security.Security; import java.security.cert.CertificateEncodingException; import java.security.cert.X509Certificate; ``` 3. 添加BC作为安全提供者: ```java Security.addProvider(new BouncyCastleProvider()); ``` 4. 准备待签名的数据和私钥、证书: ```java byte[] dataToSign = <待签名的数据>; PrivateKey privateKey = <私钥>; X509Certificate certificate = <证书>; ``` 5. 创建 CMSSignedDataGenerator 对象并配置签名器: ```java CMSSignedDataGenerator generator = new CMSSignedDataGenerator(); JcaSignerInfoGeneratorBuilder signerInfoGeneratorBuilder = new JcaSignerInfoGeneratorBuilder( new BcDigestCalculatorProvider()) .setDirectSignature(true); generator.addSignerInfoGenerator( signerInfoGeneratorBuilder.build( new JcaContentSignerBuilder("SHA256withRSA") .setProvider("BC") .build(privateKey), certificate)); ``` 6. 使用 CMSSignedDataGenerator 对象进行签名: ```java CMSTypedData cmsData = new CMSProcessableByteArray(dataToSign); CMSSignedData signedData = generator.generate(cmsData, true); byte[] pkcs7Signature = signedData.getEncoded(); ``` 通过以上步骤,你可以将 PKCS#1 格式的签名转换为 PKCS#7 格式的签名。在代码示例中,我们使用 Bouncy Castle 提供的 CMSSignedDataGenerator 类来进行签名转换。首先,我们配置签名器的构建器,然后使用私钥和证书进行签名。最后,我们将签名结果编码为字节数组形式的 PKCS#7 签名。 请注意,以上代码仅为示例,具体实现可能会根据你的需求而有所不同。同时,确保你有正确的私钥和证书,并了解 PKCS#1 和 PKCS#7 的区别。 希望这可以帮到你!如果还有其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值