WindowsCryptographicException

WindowsCryptographicException

我有这个问题,当我在 .net 3.0 中 运行 以下代码时,在调试模式 VisualStudio 2019 上 Windows 10 S.O.

var iat = Math.Round((DateTime.UtcNow.AddMinutes(-1) - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds, 0);
var exp = Math.Round((DateTime.UtcNow.AddMinutes(60) - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds, 0);

        var payload = new Dictionary<string, object>()
        {
            { "iat", iat },
            { "exp", exp }
        };
        var extraHeader = new Dictionary<string, object>()
        {
            { "alg", "ES256" }
        };

        // private
         var keyString = "MIGkAgEBBDAIam72yz6+Yc8oR4z3OGUp7GRnpKyo5aDDztHFCclxfND8lxCHSPrmIVyMEHiLtumgBwYFK4EEACKhZANiAATtj95dxIpKztIMNnWsT9nZISdhAAWt/aQGOWaEScwaaFGrB/3/8ISytsIcMpIqA+cr7owlF+fhYjlF50gYOewpJgTHAsJnMUHNO+TA3ghTibQsJIGZSOqCsHSNaijWzmc=";

         //TO DO  CngKeyBlobFormat.Pkcs8PrivateBlob Error during Import
         CngKey privateKey = CngKey.Import(Convert.FromBase64String(keyString), CngKeyBlobFormat.Pkcs8PrivateBlob, CngProvider.MicrosoftSmartCardKeyStorageProvider);

在最后一行我收到此错误:

Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: '编码或解码时出错。

这是什么意思?我该如何解决?

这里的特定值不是 PKCS#8 PrivateKeyInfo 有效负载,它看起来像一个 ECPrivateKey 值。

https://lapo.it/asn1js/#MIGkAgEBBDAIam72yz6-Yc8oR4z3OGUp7GRnpKyo5aDDztHFCclxfND8lxCHSPrmIVyMEHiLtumgBwYFK4EEACKhZANiAATtj95dxIpKztIMNnWsT9nZISdhAAWt_aQGOWaEScwaaFGrB_3_8ISytsIcMpIqA-cr7owlF-fhYjlF50gYOewpJgTHAsJnMUHNO-TA3ghTibQsJIGZSOqCsHSNaijWzmc

SEQUENCE (4 elem)
  INTEGER 1
  OCTET STRING (48 byte) 086A6EF6CB3EBE61CF28478CF7386529EC6467A4ACA8E5A0C3CED1C509C9717CD0FC97…
  [0] (1 elem)
    OBJECT IDENTIFIER 1.3.132.0.34 secp384r1 (SECG (Certicom) named elliptic curve)
  [1] (1 elem)
    BIT STRING (776 bit) 0000010011101101100011111101111001011101110001001000101001001010110011…

看起来像 ECPrivateKey

ECPrivateKey ::= SEQUENCE {
  version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
  privateKey     OCTET STRING,
  parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
  publicKey  [1] BIT STRING OPTIONAL
}

VS一个PKCS#8 PrivateKeyInfo

PrivateKeyInfo ::= SEQUENCE {
    version                   Version,
    privateKeyAlgorithm       PrivateKeyAlgorithmIdentifier,
    privateKey                PrivateKey,
    attributes           [0]  IMPLICIT Attributes OPTIONAL }

Version ::= INTEGER
PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier
PrivateKey ::= OCTET STRING
Attributes ::= SET OF Attribute

要使其成为 PKCS#8,您需要将当前值 (ECPrivateKey) 作为 PrivateKeyInfo.privateKey 字段的值。

--

此外,请注意,您已将私钥发布到互联网上,因此它现在已被泄露,现在除了测试之外不应用于任何其他用途。