Java密码学
来源:互联网 发布:沈阳it团队建设 编辑:程序博客网 时间:2024/06/05 05:58
非PKCS7的数字签名
传送门 : https://www.mkyong.com/java/java-digital-signatures-example/
签名的步骤
- list存储原文
- list储存签名内容
- 发送list , 通过ObjectOutputStream直接将list输出
重点代码
//The method that signs the data using the private key that is stored in keyFile path public byte[] sign(String data, String keyFile) throws InvalidKeyException, Exception{ Signature rsa = Signature.getInstance("SHA1withRSA"); rsa.initSign(getPrivate(keyFile)); rsa.update(data.getBytes());//和对称加密一样, 用于分块更快 return rsa.sign(); }
验证的过程
- ObjectInputStream读取
- 读取原文和签名
- 进行验证
重点代码
private boolean verifySignature(byte[] data, byte[] signature, String keyFile) throws Exception { Signature sig = Signature.getInstance("SHA1withRSA"); sig.initVerify(getPublic(keyFile)); sig.update(data); return sig.verify(signature); }
PKCS#1签名没有什么特别规定格式.
PKCS7的数字签名
签名需要的参数
- 证书(可以一个, 也可以多个, 目的, 让对方知道自己的身份)
- 私钥(签名使用)
- 原文
- 摘要以及加密算法
public static CMSSignedData generateCMSSignedData(PrivateKey privateKey, X509Certificate signCert, byte[] inputData, String algo)throws Exception { Security.addProvider(new BouncyCastleProvider());//这里我们使用BC的代码库 CMSTypedData msg = new CMSProcessableByteArray(inputData);// CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); gen.addSignerInfoGenerator( new JcaSimpleSignerInfoGeneratorBuilder() .setProvider("BC") .build(algo, privateKey, signCert));//算法可选"SHA1withRSA" gen.addCertificate(new JcaX509CertificateHolder(signCert)); //gen.addCertificates(new JcaCertStore(Arrays.asList(signCert))); 添加若干个证书时候用 return gen.generate(msg, true);//这里的true和false, 是原文是否要放在CMSSignedData里 }
验签只需要加密文件以及公钥
private void doverify(PublicKey publickey,byte[] data) throws Exception { Security.addProvider(new BouncyCastleProvider()); CMSSignedData cms = new CMSSignedData(data);//获取签名者所有信息 SignerInformationStore signers = cms.getSignerInfos(); Iterator it = signers.getSigners().iterator(); while (it.hasNext()) { SignerInformation signer = (SignerInformation) it.next(); if (signer.verify(new JcaSimpleSignerInfoVerifierBuilder() .setProvider("BC").build(publickey))) { System.out.println("verified"); System.out.println(); } } }
这里或许你会好奇, 为什么不需要原文, 因为原文已经被包含在里面了
CMSSignedData cms=...CMSTypedData signedContent = cms.getSignedContent();System.out.println(new String((byte[])signedContent.getContent()));//获得原文数据
有几个类需要注意
- CMSTypedData : CMS里变成类型的数据, 也就是不是raw , byte[]形式
- CMSProcessableByteArray实现CMSTypedData : CMS hold数据,用于被处理
前辈告诉我们, 要学会看ASN.1格式, 我们尝试通过这个ASN.1, 看看能否得到代码思路
- Signed Datasigned-data PKCS7-CONTENT-TYPE ::= {SignedData IDENTIFIED BY id-signed-data}SignedData ::= SEQUENCE { version Version, digestAlgorithms DigestAlgorithmIdentifiers, contentInfo ContentInfo, certificates [0] CertificateSet OPTIONAL, crls [1] CertificateRevocationLists OPTIONAL, signerInfos SignerInfos}SignerInfo ::= SEQUENCE { version Version, signerIdentifier SignerIdentifier, digestAlgorithm DigestAlgorithmIdentifier, authenticatedAttributes [0] Attributes OPTIONAL, digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier, encryptedDigest EncryptedDigest, unauthenticatedAttributes [1] Attributes OPTIONAL}
- 获得signedData(可预测)
- 获得signerInfo(多少可尝试到)
- 如何验证(这一点, 我们无法预测), 这一点, 看ASN.1无法完成, 需要提前了解签名的原理
相比之下, 签名却没有如此规律. 结论 : 当我们要提出数据时候, 看ASN.1还是有点用.
生成签名等, 难找规律, 不过也是有一些规律
- 获取数据, 转换成专门的类
- 丢进生成器 , 生成器有时候还装一些生成器的实现类
阅读全文
0 0
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- Java密码学
- 收藏.Java.密码学
- wireshark抓包图解 TCP三次握手/四次挥手详解
- MVC各个 部分有哪些技术实现
- 04wxWidgets多线程
- Android中的Window 如何管理?
- 浅谈Java的Fork/Join并发框架
- Java密码学
- Unity3D实时显示FPS(移动端测试神器)
- Java基础之双列集合Map
- Machine Learning In Action
- 深入学习Linux Device Tree
- 图解TCP协议中的三次握手和四次挥手
- 为源码写注释: ReentrantLock
- 二叉树的各种算法(一)python
- Angular4动态创建组件--根据组件名称动态创建出来组件