2

デジタル署名を実行する関数を更新しようとしています。現在の関数である SHA1 SHA256 から切り替えたいです。

private byte[] zSignData(Byte[] msg, X509Certificate2 signerCert)
{
    ContentInfo contentInfo = new ContentInfo(msg);
    SignedCms signedCms = new SignedCms(contentInfo, false);
    CmsSigner cmsSigner = new CmsSigner(signerCert);

    cmsSigner.DigestAlgorithm = new Oid("1.3.14.3.2.26"); //SHA1

    signedCms.ComputeSignature(cmsSigner, false);

    return signedCms.Encode();
}

この機能はうまくいきます

SHA256に更新するために、変更しました

cmsSigner.DigestAlgorithm = new Oid("1.3.14.3.2.26"); //SHA1

cmsSigner.DigestAlgorithm = new Oid("2.16.840.1.101.3.4.2.1");//SHA256

しかし

signedCms.ComputeSignature(cmsSigner, false);

次の例外が発生します

System.Security.Cryptography.CryptographicException Message=内部エラーが発生しました。

誰か提案がありますか?

私は VS2010 Professional 64 と win7 professional 64 を使用しています。

4

2 に答える 2

4

CAPIBase にタイプミスのバグがあると思います:

internal const string szOID_OIWSEC_SHA256 = "2.16.840.1.101.3.4.1";
internal const string szOID_OIWSEC_SHA384 = "2.16.840.1.101.3.4.2";
internal const string szOID_OIWSEC_SHA512 = "2.16.840.1.101.3.4.3";

次のようにする必要があります。

internal const string szOID_OIWSEC_SHA256 = "2.16.840.1.101.3.4.2.1";
internal const string szOID_OIWSEC_SHA384 = "2.16.840.1.101.3.4.2.2";
internal const string szOID_OIWSEC_SHA512 = "2.16.840.1.101.3.4.2.3";

これに関するより多くの議論はここにあります:

blogs.msdn.com/b/alejacma/archive/2012/08/02/10018922.aspx

トッド、OID 2.16.840.1.101.3.4.2.1 が SHA256 ではないという根拠は何ですか? 正しいOIDは何ですか?

于 2012-09-06T10:35:52.500 に答える
0

間違った OID を指定しています - その OID は NULL 署名付き BLOB 用です。RSA 署名付き BLOB の場合、1.2.840.113549.1.1.5 sha1RSA を使用する必要があります。

于 2012-03-16T16:04:51.963 に答える