`

android端对 pkcs#7文件进行验签

 
阅读更多
由于项目需要,进行PKCS#7加密,由于在安卓端已经移除了sun的sun.security.*包。导致不能进行验签。所以选用BouncyCastle进行验签,由于跟可能跟安卓冲突。所以改用 BouncyCastle的替代版spongycastle,只不过是报名跟换,类一致。下面直接上代码。
package com.java.test;

import java.io.File;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.Security;
import java.security.Signature;
import java.security.SignatureException;
import java.security.cert.CertificateException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.RSAPublicKeySpec;
import java.util.Base64;
import java.util.Collection;
import java.util.Iterator;

import org.apache.commons.io.FileUtils;
import org.spongycastle.asn1.ASN1Encodable;
import org.spongycastle.asn1.ASN1Integer;
import org.spongycastle.asn1.ASN1Sequence;
import org.spongycastle.cert.X509CertificateHolder;
import org.spongycastle.cms.CMSException;
import org.spongycastle.cms.CMSSignedData;
import org.spongycastle.cms.SignerInformation;
import org.spongycastle.cms.SignerInformationStore;
import org.spongycastle.operator.OperatorCreationException;
import org.spongycastle.util.Store;

import com.java.test.ttt.BouncyCastleProvider;


public class test3 {

	@SuppressWarnings({ "restriction", "deprecation", "rawtypes", "unchecked", "unused" })
	public static void main(String[] args) throws CMSException, IOException, OperatorCreationException, CertificateException, SignatureException, NoSuchAlgorithmException, InvalidKeyException, KeyStoreException, InvalidKeySpecException  {

		//		File f = new File("d:/sss.text");

		File f = new File("d:/21.json.RSA");

		File f2 = new File("d:/21.json");

		//		File f = new File("d:/ANDROIDK.RSA");

		Security.addProvider(new BouncyCastleProvider());

		CMSSignedData s = new CMSSignedData(FileUtils.readFileToByteArray(f));

		Store                   certStore = s.getCertificates();
		SignerInformationStore  signers = s.getSignerInfos();
		Collection              c = signers.getSigners();
		Iterator                it = c.iterator();

		while (it.hasNext())
		{
			SignerInformation   signer = (SignerInformation)it.next();
			Collection          certCollection = certStore.getMatches(signer.getSID());
			Iterator              certIt = certCollection.iterator();
			X509CertificateHolder cert = (X509CertificateHolder)certIt.next();



			System.out.println(cert.getSubjectPublicKeyInfo().parsePublicKey().toString());


			ASN1Sequence seq = (ASN1Sequence)(cert.getSubjectPublicKeyInfo().getPublicKey().toASN1Primitive());
			ASN1Encodable[] ss = seq.toArray();
			ASN1Integer  a1 = (ASN1Integer) ss[0];
			ASN1Integer  a2 = (ASN1Integer) ss[1];

			byte[] bts = cert.getSubjectPublicKeyInfo().getPublicKey().getEncoded();
			KeyStore keyStore = KeyStore.getInstance("JKS");

			KeyFactory keyFactory = KeyFactory.getInstance("RSA");  

			PublicKey publicKey = keyFactory.generatePublic(new RSAPublicKeySpec(a1.getValue(), a2.getValue()));  

			
			System.out.println(Base64.getEncoder().encodeToString(signer.getSignature()));
			
			Signature sig = Signature.getInstance("SHA1withRSA");
			sig.initVerify(publicKey);
			sig.update(FileUtils.readFileToByteArray(f2));
//
//
			boolean flag = sig.verify(signer.getSignature());
			System.out.println(flag);
			
//			PKCS7 p7 = new PKCS7(FileUtils.readFileToByteArray(f));
//			SignerInfo si = p7.getSignerInfos()[0];
//			
//			System.out.println(Base64.getEncoder().encodeToString(si.getEncryptedDigest()));
		}




	}

}


能直接进行验签。整了好多时间。
分享到:
评论

相关推荐

    C# BouncyCastle实现带原文数据PKCS#7 签名、验签

    - 对原始数据进行同样的哈希处理,并使用公钥、签名和DigestInfo通过`ISigner.VerifySignature()`方法进行验签。 7. **处理证书链**:在实际应用中,接收方可能还需要验证发送方的证书链,确保证书是由信任的CA...

    C# pkcs # 7 签名 验签

    在C#中,我们可以利用System.Security.Cryptography命名空间下的类来实现PKCS #7签名和验签功能。 1. **理解PKCS #7签名** PKCS #7签名主要用于确保数据的完整性和来源的真实性。它通过哈希算法对原始数据进行处理...

    PKCS#7格式加解密验签

    提到PKCS,首先想到的是RSA的证书格式(类似,PKCS8,P12等),最近在和一家俄罗斯支付对接时,对方说加密成PKCS#7格式,当时就懵了,以为对方说错了,在这块卡了好几天,通过查资料,终于找到方法了。确实是PKCS#7...

    C# SHA256 PKCS#7 生成验名、验签源码 中行支付.rar

    "C# SHA256 PKCS#7 生成验名、验签源码 中行支付.rar"这个压缩包文件提供了使用C#编程语言实现SHA256哈希算法和PKCS#7标准来创建和验证签名的源代码。以下将详细解释这两个关键概念及其在金融支付中的应用。 1. SHA...

    C# BouncyCastle实现带原文数据PKCS#7 签名

    7. 验证签名:接收方使用公钥和PKCS#7封装的数据,通过类似的过程进行验证。首先解码签名,然后使用公钥初始化`ISigner`,更新原始数据并调用`VerifySignature`方法检查签名是否有效。 8. 错误处理:在签名和验证...

    按PKCS#10数据格式封装PKCS#10数据

    在提供的压缩包文件"ParseP10"中,可能包含了一个或多个示例或工具,用于演示或执行上述解析和封装PKCS#10数据的操作。这可能是一个脚本、程序或者教程,通过学习和使用这些资源,我们可以更好地理解和操作PKCS#10...

    pkcs#7标准格式

    文档介绍了pkcs#7的格式和结构,里面虽然是英文的,但是很详细的,能看到,另外用ASN1工具和这个结合能很快的理解pkcs#7的结构。

    使用数字证书进行PKCS#7数字签名

    越来越多的应用需要我们使用USB接口数字证书进行PKCS#7数字签名。本文分别介绍了使用微软CryptoAPI方式和OpenSSL Engine方式进行数字签名。特别地,提出了OpenSSL Engine简化方式,这种方式更为灵活方便易行。

    企业微信支付到个人银行卡(PKCS#1格式的公钥转为PKCS#8格式)

    1. 读取PKCS#1格式的公钥文件,这通常是一个.pem或.der格式的文件。 2. 使用OpenSSL库中的命令行工具进行转换。例如,可以使用`openssl rsa -in pkcs1_key.pem -outform DER -pubout -out pkcs8_key.der`命令,将...

    PKCS #12 中文版

    PKCS #12 中文版 PKCS #12 是一種個人身份标识信息傳遞語法的标准,允许用户导入、导出并使用一套统一的个人身份标识信息。该标准描述了私钥、证书、各种形式的秘密值及其扩展。PKCS #12 的出现使得计算机、应用...

    PKCS#11的部分使用例码

    下面我们将从给定的文件中提取相关的知识点,详细解释PKCS#11的使用示例。 1. 文件读取函数 从给定的文件中,我们可以看到一个文件读取函数 `_ReadFile`,它用于读取指定文件的内容。这个函数的实现使用了标准C库...

    pkcs-11v2-20d3.rar_PKCS#1_PKCS#11 USBKey_RSA PKCS_pkcs_usbkey

    在密码系统中,PKCS#11是公钥加密标准(PKCS, Public-Key Cryptography Standards)中的一份子 ,由RSA实验室(RSA Laboratories)发布[1],它为加密令牌定义了一组平台无关的API ,如硬件安全模块和智能卡。...

    PKCS7标准签名与验签

    `P7Verify_CSharp`可能是一个包含示例代码或库的压缩文件,它可能提供了更具体的操作步骤和示例,帮助开发者在C#环境中进行PKCS#7签名和验证。通过研究和理解这些代码,你可以更好地理解和应用PKCS#7签名机制,确保...

    ASN.1与PKCS#7.pptx

    【ASN.1与PKCS#7】是网络安全和加密领域中的关键概念,广泛应用于数字证书、数据加密和签名。ASN.1(Abstract Syntax Notation One)是一种标准的表示和编码技术,而PKCS#7(Public-Key Cryptography Standards #7)...

    pkcs 7- 加密消息语法标准 - 中文版

    ### PKCS #7:加密消息语法标准 #### 1. 概述 PKCS #7 (Public Key Cryptography Standards Number 7) 是一项由 RSA 实验室开发的标准,旨在为加密消息提供统一的语法框架。这项标准定义了用于数字签名、加密和其他...

    PKCS #11 v2.11: Cryptographic Token Interface Standard(包含C头文件)

    在实际应用中,PKCS #11常被用于Web浏览器的客户端证书、电子邮件的加密和签名、以及在企业环境中对数据进行安全存储和传输。通过调用PKCS #11库,开发者可以轻松地集成硬件加密功能,例如在HTTPS服务器证书的管理、...

    PKCS#11 v2.2(DOC)

    ### PKCS#11 v2.2:Cryptoki标准详解 #### 一、引言 PKCS#11,也称为Cryptoki标准,是公钥密码学标准集的一部分,由RSA实验室开发并发布。PKCS#11为密码模块定义了一个程序设计接口(API),这个API被命名为Cryptoki...

    pkcs#11标准中文文档

    以下是对PKCS#11标准主要知识点的详细说明: 1. **CKF_INFO结构体**:这是描述密码模块基本信息的数据结构,包括模块名称、制造商信息、版本等。 2. **CK_FUNCTION_LIST结构体**:它定义了密码模块提供的所有函数...

    pkcs#11中文文档

    此外,文档中可能会对各种状态、错误代码和属性进行定义,帮助开发者调试和处理异常情况。 总之,PKCS #11中文文档为开发人员提供了一个清晰的指南,让他们能够有效地利用硬件安全模块等密码设备进行安全编程。通过...

    pkcs#12官方文档

    PKCS#12文件,通常以.p12或.pfx为扩展名,是一个二进制文件,它包含了用户的数字证书和密钥对。这种格式允许用户方便地导出和导入这些安全敏感数据,确保数据在传输过程中的安全性。PKCS#12文件使用ASN.1(Abstract ...

Global site tag (gtag.js) - Google Analytics