java 数字信封_【Java密码学】使用Bouncy Castle生成数字签名、数字信封

java 数字信封_【Java密码学】使用Bouncy Castle生成数字签名、数字信封importjava.io.FileInputStream;importjava.io.InputStream;importjava.security.KeyStore;importjava.security.PrivateKey;importjava.security.Provider;importjava.security.Security;importjava.security.cert.C…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

importjava.io.FileInputStream;importjava.io.InputStream;importjava.security.KeyStore;importjava.security.PrivateKey;importjava.security.Provider;importjava.security.Security;importjava.security.cert.Certificate;importjava.security.cert.CertificateFactory;importjava.security.cert.X509Certificate;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;importjava.util.List;importorg.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;importorg.bouncycastle.cert.X509CertificateHolder;importorg.bouncycastle.cert.jcajce.JcaCertStore;importorg.bouncycastle.cms.CMSEnvelopedData;importorg.bouncycastle.cms.CMSEnvelopedDataGenerator;importorg.bouncycastle.cms.CMSProcessableByteArray;importorg.bouncycastle.cms.CMSSignedData;importorg.bouncycastle.cms.CMSSignedDataGenerator;importorg.bouncycastle.cms.CMSTypedData;importorg.bouncycastle.cms.RecipientInformation;importorg.bouncycastle.cms.RecipientInformationStore;importorg.bouncycastle.cms.SignerInformation;importorg.bouncycastle.cms.SignerInformationStore;importorg.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder;importorg.bouncycastle.cms.jcajce.JcaSimpleSignerInfoVerifierBuilder;importorg.bouncycastle.cms.jcajce.JceCMSContentEncryptorBuilder;importorg.bouncycastle.cms.jcajce.JceKeyTransEnvelopedRecipient;importorg.bouncycastle.cms.jcajce.JceKeyTransRecipientInfoGenerator;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importorg.bouncycastle.operator.ContentSigner;importorg.bouncycastle.operator.jcajce.JcaContentSignerBuilder;importorg.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder;importorg.bouncycastle.util.Store;importorg.bouncycastle.util.encoders.Base64;public classMessageUtil {private String ksType = “PKCS12”;/*** 生成数字签名

*@paramsrcMsg 源信息

*@paramcharSet 字符编码

*@paramcertPath 证书路径

*@paramcertPwd 证书密码

*@return

*/

public byte[] signMessage(String srcMsg, String charSet, String certPath, String certPwd) {

String priKeyName= null;char passphrase[] =certPwd.toCharArray();try{

Provider provider= newBouncyCastleProvider();//添加BouncyCastle作为安全提供

Security.addProvider(provider);//加载证书

KeyStore ks =KeyStore.getInstance(ksType);

ks.load(newFileInputStream(certPath), passphrase);if(ks.aliases().hasMoreElements()) {

priKeyName=ks.aliases().nextElement();

}

Certificate cert=(Certificate) ks.getCertificate(priKeyName);//获取私钥

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

X509Certificate cerx509=(X509Certificate) cert;

List certList = new ArrayList();

certList.add(cerx509);

CMSTypedData msg= (CMSTypedData) newCMSProcessableByteArray(

srcMsg.getBytes(charSet));

Store certs= newJcaCertStore(certList);

CMSSignedDataGenerator gen= newCMSSignedDataGenerator();

ContentSigner sha1Signer= newJcaContentSignerBuilder(“SHA1withRSA”).setProvider(“BC”).build(prikey);

gen.addSignerInfoGenerator(newJcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider(“BC”)

.build()).build(sha1Signer, cerx509));

gen.addCertificates(certs);

CMSSignedData sigData= gen.generate(msg, true);returnBase64.encode(sigData.getEncoded());

}catch(Exception e) {

e.printStackTrace();return null;

}

}/*** 验证数字签名

*@paramsignedData

*@return

*/

public boolean signedDataVerify(byte[] signedData) {boolean verifyRet = true;try{//新建PKCS#7签名数据处理对象

CMSSignedData sign = newCMSSignedData(signedData);//添加BouncyCastle作为安全提供

Security.addProvider(neworg.bouncycastle.jce.provider.BouncyCastleProvider());//获得证书信息

Store certs =sign.getCertificates();//获得签名者信息

SignerInformationStore signers =sign.getSignerInfos();

Collection c=signers.getSigners();

Iterator it=c.iterator();//当有多个签名者信息时需要全部验证

while(it.hasNext()) {

SignerInformation signer=(SignerInformation) it.next();//证书链

Collection certCollection =certs.getMatches(signer.getSID());

Iterator certIt=certCollection.iterator();

X509CertificateHolder cert=(X509CertificateHolder) certIt

.next();//验证数字签名

if (signer.verify(newJcaSimpleSignerInfoVerifierBuilder()

.setProvider(“BC”).build(cert))) {

verifyRet= true;

}else{

verifyRet= false;

}

}

}catch(Exception e) {

verifyRet= false;

e.printStackTrace();

System.out.println(“验证数字签名失败”);

}returnverifyRet;

}/*** 加密数据

*@paramsrcMsg 源信息

*@paramcertPath 证书路径

*@paramcharSet 字符编码

*@return*@throwsException*/

public String envelopeMessage(String srcMsg, String certPath, String charSet) throwsException {

CertificateFactory certificatefactory;

X509Certificate cert;//使用公钥对对称密钥进行加密//若此处不加参数 “BC” 会报异常:CertificateException –

certificatefactory = CertificateFactory.getInstance(“X.509”, “BC”);//读取.crt文件;你可以读取绝对路径文件下的crt,返回一个InputStream(或其子类)即可。

InputStream bais = newFileInputStream(certPath);

cert=(X509Certificate) certificatefactory.generateCertificate(bais);//添加数字信封

CMSTypedData msg = newCMSProcessableByteArray(srcMsg.getBytes(charSet));

CMSEnvelopedDataGenerator edGen= newCMSEnvelopedDataGenerator();

edGen.addRecipientInfoGenerator(newJceKeyTransRecipientInfoGenerator(

cert).setProvider(“BC”));

CMSEnvelopedData ed=edGen.generate(msg,newJceCMSContentEncryptorBuilder(PKCSObjectIdentifiers.rc4)

.setProvider(“BC”).build());

String rslt= newString(Base64.encode(ed.getEncoded()));

System.out.println(rslt);returnrslt;

}/*** 解密数据

*@paramencode 加密后的密文

*@paramcertPath 证书路径

*@paramcertPwd 证书密码

*@paramcharSet 字符编码

*@return*@throwsException*/

public String openEnvelope(String encode, String certPath, String certPwd, String charSet) throwsException {//获取密文

CMSEnvelopedData ed = newCMSEnvelopedData(Base64.decode(encode.getBytes()));

RecipientInformationStore recipients=ed.getRecipientInfos();

Collection c=recipients.getRecipients();

Iterator it=c.iterator();//加载证书

KeyStore ks =KeyStore.getInstance(ksType);

ks.load(newFileInputStream(certPath), certPwd.toCharArray());

String priKeyName= null;if(ks.aliases().hasMoreElements()) {

priKeyName=ks.aliases().nextElement();

}//获取私钥

PrivateKey prikey =(PrivateKey) ks.getKey(priKeyName, certPwd.toCharArray());byte[] recData = null;//解密

if(it.hasNext()) {

RecipientInformation recipient=(RecipientInformation) it.next();

recData= recipient.getContent(newJceKeyTransEnvelopedRecipient(

prikey).setProvider(“BC”));

}return newString(recData, charSet);

}publicMessageUtil() {

Security.addProvider(neworg.bouncycastle.jce.provider.BouncyCastleProvider());

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234795.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Keil(MDK-ARM)系列教程(一)_新建软件工程详细过程

    Keil(MDK-ARM)系列教程(一)_新建软件工程详细过程推荐分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang推荐在我的公众号「strongerHuang」或网站(www.strongerhuang.com)阅读以下教程:Keil系列教程01_Keil介绍、下载、安装与注册Keil系列教程02_新建基础…

    2022年5月24日
    42
  • aarch64 poky linux,aarch64pokylinuxgcc:错误::没有这样的文件或目录

    aarch64 poky linux,aarch64pokylinuxgcc:错误::没有这样的文件或目录我正在尝试将mlpack包含到我的yocto构建中。如果不启用python绑定,我的配方烘焙成功。但是在构建python绑定时,我得到了以下错误:aarch64-poky-linux-gcc-march=armv8-a-mtune=cortex-a57.cortex-a53–sysroot=/builds/build-h3/tmp/sysroots/h3ulcb-DNDEBUG-g-O…

    2022年8月31日
    3
  • @JsonFormat、@JSONField、@DateTimeFormat的使用以及其区别[通俗易懂]

    三者出处1、JsonFormat来源于jackson,Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。2、JSONField来源于fastjson,是阿里巴巴…

    2022年4月17日
    54
  • VMware下载安装教程_安装vmware虚拟机

    VMware下载安装教程_安装vmware虚拟机全网最详细的VMware虚拟机下载安装教程第一步下载虚拟机1.进入VMware官网,点击左侧导航栏中的下载,选择下拉列表中的产品下载,再点击图中标记的WorkstationPro,如下图所示。2.选择自己需要的版本和操作系统,在这里以Windows系统为例,点击转至下载,如下图所示。-3.点击转至下载后也在此处可以选择版本。选择好版本后点击立即下载。如下图所示。4.注意,需要登录之后才能下载。若无账号可点击注册后登录。如下图所示。二、安装虚拟机1.进入下载路径,双击.

    2025年11月5日
    4
  • 下载视频网站中ts格式的视频[通俗易懂]

    下载视频网站中ts格式的视频[通俗易懂]下载视频网站中ts格式的视频1、第一步打开开发者工具Chrome中可以用【F12】或者【Crtl+Shift+I】或者【自定义】(也就是三个点的选项按钮)下面的【更多工具】——【开发者工具】(Chroem版本86)找到【network】并刷新网页2、如果有m3u8结尾的文件,把它的源地址复制下来Chrome开发者工具第三行开头,有一个【filter】(过滤器)在里面输入【m3u8】就可以搜索,寻找.m3u8结尾的文件右键【xxx.m3u8】文件,找到copycopylink

    2022年7月18日
    38
  • 删除数组中的指定元素_js判断数组是否包含某个元素

    删除数组中的指定元素_js判断数组是否包含某个元素js数组指定位置删除和添加元素

    2022年8月10日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号