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());

}

}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mac pycharm安装设置_python爬虫 | mac系统PyCharm的安装「建议收藏」

    mac pycharm安装设置_python爬虫 | mac系统PyCharm的安装「建议收藏」视频在之前我们是不是提到了,后面我们要学一个集成的开发环境,就是IDE。全称IntegratedDevelopmentEnvironment,翻译过来集成开发环境。我们经常用PyCharm作为Python开发的IDE,我们以后所有的代码当中可能就要用这个工具去写了。下载我们直接在百度输入,https://www.jetbrains.com/pycharm,进入pycharm安装界面…

  • 考研复试-数据库面试题[通俗易懂]

    考研复试-数据库面试题[通俗易懂]准备复试时自己从别的博客上复制的一些面试题,因为当时都复制到一个文本文件中了,也不知道从谁的博客上复制的。触发器的作用?答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。什么是存储…

  • JAVA – 虚函数、抽象函数、抽象类、接口

    JAVA – 虚函数、抽象函数、抽象类、接口1. Java虚函数虚函数的存在是为了多态。C++中普通成员函数加上virtual关键字就成为虚函数Java中其实没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑定是Java的默认行为。如果Java中不希望某个函数具有虚函数特性,可以加上final关键字变成非虚函数PS: 其实C++和Java在虚函数的观点大同小异,异曲同工罢了。 2. Java抽象函数(纯虚函…

  • 数据库置疑什么原因_sql2008数据库置疑

    数据库置疑什么原因_sql2008数据库置疑在MSSQLSERVER中一直有这样的问题,SQLSERVER的状态”置疑”,我们先来分析一下SQLSERVER数据库”置疑”的原因:1.错误的删除日志;2.硬件(HD)损坏,造成日志和数据文件写错误;3.硬盘的空间不够,比如日志文件过大;解决办法:这是最简单的办法是有数据库的全备份,然后恢复即可.步骤:1.删除原始的数据库:USEMASTERGODROPDATABASEDB_SUEPE…

  • 互联网100强公布_互联网排行榜

    互联网100强公布_互联网排行榜无意中翻看到一篇我在三年多前写的文章《我看中国互联网web2.0百强名单》,读来颇有感概。2005-2006那两年,正是WEB2.0概念轰轰烈烈的时候,大大小小的新网站层出不穷,博客、视频、交友、评点、社区、聚合……不管自己的网站的UGC比例多少,都宣传自己是WEB2.0,好像不贴上WEB2.0的标签,就不够潮流,不够IN,就吸引不了用户和风投。WEB2….

  • 基于Vue的电商后台管理系统(2)

    基于Vue的电商后台管理系统(2)电商后台管理系统2前言上期已经实现该系统的登陆界面、路由、登录、退出及导航守卫功能,本期将继续完善该系统的以下功能:从后端获取后台列表数据并渲染到前端页面、用户列表的展示、修改、删除和添加。后台页面布局本系统后台将采用ElementUI中的Container布局容器。基本结构如下:代码框架:<el-container><el-header>Header</el-header><el-container><el-a

发表回复

您的电子邮箱地址不会被公开。

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