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 值。
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
}
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 字段的值。
--
此外,请注意,您已将私钥发布到互联网上,因此它现在已被泄露,现在除了测试之外不应用于任何其他用途。
我有这个问题,当我在 .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 值。
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
}
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 字段的值。
--
此外,请注意,您已将私钥发布到互联网上,因此它现在已被泄露,现在除了测试之外不应用于任何其他用途。