首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pkcs7用证书和私钥在.Net中签名?

Pkcs7用证书和私钥在.Net中签名?
EN

Stack Overflow用户
提问于 2022-03-23 22:11:31
回答 1查看 436关注 0票数 0

我在pkcs7中有一个有效的Node.js密码算法。

代码语言:javascript
复制
var forge = require('node-forge');
var fs = require('fs');
var privateKeyAssociatedWithCert = fs.readFileSync("certs\\confpack.key", 'binary');

const payload = fs.readFileSync("certs\\confpack.cert", 'binary');
const certOrCertPem = forge.pki.certificateFromPem(payload);

// create PKCS#7 signed data with authenticatedAttributes
// attributes include: PKCS#9 content-type, message-digest, and signing-time
var p7 = forge.pkcs7.createSignedData();
p7.content = forge.util.createBuffer('ABCD123');
p7.addCertificate(certOrCertPem);
p7.addSigner({
  key: privateKeyAssociatedWithCert,
  certificate: certOrCertPem,
  digestAlgorithm: forge.pki.oids.sha256,
  authenticatedAttributes: [
 ]
});

// PKCS#7 Sign in detached mode.
// Includes the signature and certificate without the signed data.
p7.sign({ detached: true });
console.log(forge.asn1.toDer(p7.toAsn1()).toHex());

我使用.Net和Org.BouncyCastle Nuget实现的结果不同。

代码语言:javascript
复制
X509CertificateParser certParser = new X509CertificateParser();
Org.BouncyCastle.X509.X509Certificate rootCert = certParser.ReadCertificate(File.ReadAllBytes("cert\\confpack.cert"));

AsymmetricKeyParameter signatureKey;
using (var reader = File.OpenText("cert\\confpack.key"))
    signatureKey = (AsymmetricKeyParameter)new PemReader(reader).ReadObject();

byte[] signedMessage = null;
CmsProcessable cmsData = new CmsProcessableByteArray(Encoding.ASCII.GetBytes("ABCD123"));

var allCerts = new List<Org.BouncyCastle.X509.X509Certificate>();
allCerts.Add(rootCert);
var storeParams = new X509CollectionStoreParameters(allCerts);
var certStore = X509StoreFactory.Create("Certificate/Collection", storeParams);

CmsSignedDataGenerator cmsGenerator = new CmsSignedDataGenerator();
cmsGenerator.AddSigner(signatureKey, rootCert, NistObjectIdentifiers.IdSha256.Id);
cmsGenerator.AddCertificates(certStore);

CmsSignedData cms = cmsGenerator.Generate(cmsData, true);
signedMessage = cms.GetEncoded();

Debug.WriteLine(Hex.ToHexString(signedMessage));

结果:“3082055406092a864886f70”

.Net结果:“308006092a864886f70”

我在.net代码中遗漏了什么?我真的需要得到同样的结果。

EN

回答 1

Stack Overflow用户

发布于 2022-04-02 14:15:00

Node版本生成一个独立的签名,.net生成一个封装的签名。对于分离签名,请使用:

cmsGenerator.Generate(cmsData,false)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71594678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档