大家帮我看一下这个问题:使用bouncycastle的包,对一个字符串进行签名生成P#7,之后进行Base64编码,生成以下数据:
MIAGCSqGSIb3DQEHAqCAMIACAQMxCzAJBgUrDgMCGgUAMIAGAyoFBqCAJIAECTEyMzQ1Njc4OQAA
AAAAAKCAMIICWTCCAcKgAwIBAgIIQbKDub2yJdIwDQYJKoZIhvcNAQEFBQAwJzELMAkGA1UEBhMC
U0UxCzAJBgNVBAoMAkNBMQswCQYDVQQDDAJjYTAeFw0wOTA2MTYxMTE4MjFaFw0xMTA2MTYxMTI4
MjFaMBYxFDASBgNVBAMMC1JB5b2V5YWl5ZGYMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCN
m0S6TVfKQOK7KGU7kKsm1QmzgYObY6Hbz7cWgEynMdQYqeEfzbgfLgS4m3JK0ENTp9dXiOjJpqX2
TD0gaPFgDbeeA4yBzFzpemb78WQUg0ZlcPsQMGDj10J7n3+prB+1QSeHxf7xsOsIJZ8CO9uXzbd0
Tv1/jje7IeP3XHYBrwIDAQABo4GeMIGbMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgWgMDsG
A1UdJQQ0MDIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwQGCCsGAQUFBwMFBggrBgEFBQcD
BzAdBgNVHQ4EFgQUuNm/U3ztrcDfeMry1ujsGkiXluMwHwYDVR0jBBgwFoAUb3kuuU/4Gm7MjfkJ
/Dsqm89rZzcwDQYJKoZIhvcNAQEFBQADgYEAJq2HRr8IK/OVcW50T4t6fVh12RiDXg8YSMDkhDUl
HyOOsCaepWKFPDWX9VC6pmNBNJvU98Kud+X2MOC/qqgtBNe1E0TLChk4912wfsIjws3X4LWLX74T
aVT++IPTPGZzJwDLjwYdE0Hw/OWs3o6cKL4qXUFCypgMqo5inmP+V9gAADGCATIwggEuAgEBMDMw
JzELMAkGA1UEBhMCU0UxCzAJBgNVBAoMAkNBMQswCQYDVQQDDAJjYQIIQbKDub2yJdIwCQYFKw4D
AhoFAKBXMBIGCSqGSIb3DQEJAzEFBgMqBQYwHAYJKoZIhvcNAQkFMQ8XDTA5MDgxOTA5MTE0NFow
IwYJKoZIhvcNAQkEMRYEFPfDvB2AjgRzKt9nmWXMw0ynrjRBMA0GCSqGSIb3DQEBAQUABIGAVlY8
a9t0mz/FHVPRB/fAuGyf7U6xVTuCEe+/to+LkHyABikjOod06AsvFThOFs+sRpsLr4ArQEs+UplK
xkw+yUPbqz4ZvuJbD9G2x6ldnFh//IgpG6/NT41T51HeBo0t/BVlb01vK0gr10sMowMDeOYv8uht
MBgQ/YG1cw6s6TAAAAAAAAA=
再使用sun.security.pkcs.PKCS7对PKCS7进行验证,能够取出P#7中的证书,但是验证签名信息不能通过。
以下是生成PKCS7格式的方法:
public byte[] createPKCS7(String originalTest) {
byte[] signedData = null;
getCert();
Collection chain = getCertChain();
ArrayList certList = new ArrayList();
Certificate cert = getCert509();
if (cert != null) {
certList.add(cert);
}
try {
CMSProcessable msg = new CMSProcessableByteArray(originalTest
.getBytes());
CertStore certs = CertStore.getInstance("Collection",
new CollectionCertStoreParameters(certList), "BC");
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
gen.addSigner(getPk(), (X509Certificate) getCert509(),
CMSSignedGenerator.DIGEST_SHA1);
gen.addCertificatesAndCRLs(certs);
CMSSignedData s = null;
Provider provider = new BouncyCastleProvider();
Security.addProvider(provider);
s = gen.generate(msg,true,provider);//,
signedData = s.getEncoded();
} catch (Exception e) {
e.printStackTrace();
}
return signedData;
}
以下是验证的方法:
private boolean isVerified(byte[] sig, byte[] content) {
PKCS7 pkcs7;
X509Certificate[] x509s;
X509Certificate x509;
SignerInfo[] ss;
SignerInfo s;
Signature sign;
try {
pkcs7 = new PKCS7(sig);
x509s = pkcs7.getCertificates();
x509 = x509s[0];
System.out.println(pkcs7.getContentInfo().getContent().getAsString());
ss = pkcs7.getSignerInfos();
s = ss[0];
sign = Signature.getInstance("SHA1/RSA", "BC");
sign.initVerify(x509);
sign.update(toUnicode(content));//toUnicode(content)
byte[] aa = s.getEncryptedDigest();
System.out.println(new String(aa));
boolean verified = sign.verify(s.getEncryptedDigest());
///////////////////////////////////////////////////////
pkcs7 = null;
sign = null;
s = null;
ss = null;
x509 = null;
x509s = null;
return verified;
} catch (SignatureException sigex) {
//System.out.println("VerifyP7sTool.isVerified22222222");
sigex.printStackTrace();
// System.out.println("sigexcept " + sigex.toString());
return false;
} catch (Exception secex) {
//System.out.println("VerifyP7sTool.isVerified3333333333");
secex.printStackTrace();
// System.out.println("other exception " + secex.toString());
return false;
}
}
不知道是不是生成的P#7的base64格式有问题,
以下是用CAPICOM生成的
"MIIDbAYJKoZIhvcNAQcCoIIDXTCCA1kCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3"
+ "DQEHAaCCAl0wggJZMIIBwqADAgECAghBsoO5vbIl0jANBgkqhkiG9w0BAQUFADAn"
+ "MQswCQYDVQQGEwJTRTELMAkGA1UECgwCQ0ExCzAJBgNVBAMMAmNhMB4XDTA5MDYx"
+ "NjExMTgyMVoXDTExMDYxNjExMjgyMVowFjEUMBIGA1UEAwwLUkHlvZXlhaXlkZgw"
+ "gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAI2bRLpNV8pA4rsoZTuQqybVCbOB"
+ "g5tjodvPtxaATKcx1Bip4R/NuB8uBLibckrQQ1On11eI6MmmpfZMPSBo8WANt54D"
+ "jIHMXOl6ZvvxZBSDRmVw+xAwYOPXQnuff6msH7VBJ4fF/vGw6wglnwI725fNt3RO"
+ "/X+ON7sh4/dcdgGvAgMBAAGjgZ4wgZswDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E"
+ "BAMCBaAwOwYDVR0lBDQwMgYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEFBQcDBAYI"
+ "KwYBBQUHAwUGCCsGAQUFBwMHMB0GA1UdDgQWBBS42b9TfO2twN94yvLW6OwaSJeW"
+ "4zAfBgNVHSMEGDAWgBRveS65T/gabsyN+Qn8Oyqbz2tnNzANBgkqhkiG9w0BAQUF"
+ "AAOBgQAmrYdGvwgr85VxbnRPi3p9WHXZGINeDxhIwOSENSUfI46wJp6lYoU8NZf1"
+ "ULqmY0E0m9T3wq535fYw4L+qqC0E17UTRMsKGTj3XbB+wiPCzdfgtYtfvhNpVP74"
+ "g9M8ZnMnAMuPBh0TQfD85azejpwovipdQULKmAyqjmKeY/5X2DGB2DCB1QIBATAz"
+ "MCcxCzAJBgNVBAYTAlNFMQswCQYDVQQKDAJDQTELMAkGA1UEAwwCY2ECCEGyg7m9"
+ "siXSMAkGBSsOAwIaBQAwDQYJKoZIhvcNAQEBBQAEgYBDgHuulzpzyUF1+YEBOsvV"
+ "M6LIsTgm2nv5ofzWk2tduZFWmMejfpafZpFlEpOn+SA/bu08CrJWPBDk+BwFfMzv"
+ "8IxQw6BlPL70IH08n45ZbzMaya56zc9mXfDPoHFiOHNZVJE7ikZ01XzpvkCKj6IA"
+ "XgyYSI+H5R2DhsVratOCxw== ";
谢谢~~
分享到:
相关推荐
在C#中使用BouncyCastle库实现PKCS#7签名和验签的过程,可以分为以下几个步骤: 1. **导入BouncyCastle库**:首先需要在C#项目中引用BouncyCastle库。这可以通过NuGet包管理器完成,安装`BCryptNet`和`BouncyCastle...
本文将详细讲解如何使用C#语言和BouncyCastle库来实现带原文数据的PKCS#7签名。 PKCS#7(Public-Key Cryptography Standards #7)是由RSA Security提出的一种标准,它定义了证书、证书撤销列表(CRL)的格式以及...
Bouncy Castle实现了PKCS#7(用于数据封装和签名)、PKCS#12(用于存储私钥和证书)、PKCS#5(用于密码化)和PKCS#11(用于硬件加密设备接口)等标准。 **OpenSSL兼容** Bouncy Castle还提供了一个名为BCrypt的...
它不仅包含了各种经典的加密算法,如AES、DES、RSA、DSA等,还支持PKCS#7、PKCS#12、PEM、X.509证书、OCSP等标准格式,使得开发者能够轻松地在应用程序中集成复杂的密码学操作。 1. **加密算法支持**:`org.bouncy...
使用BouncyCastle时,需要注意兼容性和版本问题,因为不同版本的BouncyCastle可能对某些算法的支持程度不同。在Android中,由于安全限制,可能需要在应用的清单文件中声明使用Vetoed API,特别是对于低于Android API...
Bouncy Castle 包含了一个全面的 ASN.1 编码/解码器,对于处理 X.509 证书和 PKCS#7 格式的文件尤其有用。 8. **PKCS(Public Key Cryptography Standards)支持**: Bouncy Castle 实现了 PKCS#1、PKCS#5、PKCS#7...
1. **生成密钥对**:在Java或C#中使用Bouncy Castle生成RSA密钥对。 2. **数据加密**:使用公钥对原始数据进行加密。 3. **数据传输**:将加密后的数据发送给接收方。 4. **数据解密**:接收方使用私钥对加密数据...
3. **PKCS#7 和 CMS 支持**:BouncyCastle 提供了对公钥加密标准PKCS#7和内容加密标准CMS的支持,这在处理数字签名、证书和加密邮件时非常有用。 4. **OpenSSL 兼容性**:BouncyCastle 还可以与OpenSSL API互操作,...
BouncyCastle库是Java和.NET平台上广泛使用的加密库之一,而"BouncyCastle.Crypto.dll"正是.NET环境中实现该库的核心组件。本文将深入探讨BouncyCastle.Crypto.dll的功能、特点以及其在.NET开发中的应用。 Bouncy...
它还实现了PKCS#10证书请求生成,以及PKCS#12个人证书存储格式。 3. **TLS/SSL支持**:对于需要在客户端和服务器之间建立安全连接的应用程序,BouncyCastle库提供了SSL/TLS协议的实现,这使得开发者可以自定义安全...
BouncyCastle是JAVA专属库,但出来了C#的库。这个非常实用。仅仅一个dll文件
Bouncy Castle 包含了密钥生成、导入和导出的工具,支持 PKCS#8 和 PKCS#12 格式。此外,它还支持密钥对的加密和解密,以保护密钥的安全存储。 6. **CMS(Cryptographic Message Syntax)** CMS 是一个标准,用于...
总的来说,这份“BouncyCastle1.59帮助文档”是开发者学习和使用BouncyCastle的重要参考资料,结合CHM制作工具,不仅可以方便地查阅和理解库的功能,还能定制自己的帮助文档,提升开发效率。无论你是加密领域的初学...
4. **Util**:Util工具类提供了各种辅助功能,如随机数生成、编码/解码(Base64、Hex)、证书链验证等。这些工具对于简化加密操作和处理复杂任务非常有用。 5. **TLS**:TLS是互联网上保障通信安全的协议,常用于...
5. 如果你需要与Java bouncycastle保持兼容,确保在编码和解码时使用相同的格式,例如Base64编码: ```python import base64 # 加密前将明文转换为Base64 plain_text_base64 = base64.b64encode(plain_text.encode...