.NET 5 加密签名异常密钥不存在
.NET 5 Cryptographic Signatures exception Key does not exist
我已经按照 msdn verifying-signatures
实施了数字签名验证
请不要因为它在 f# 中的事实而分散了对问题的注意力。我正在使用 .NET 5 框架中的标准加密库
module GenericCryptography =
let createRsa (res: GenericPublicKey) =
let rsa = RSA.Create()
// create params
let mutable rsaParams = RSAParameters()
rsaParams.Modulus <- res.Modulus
rsaParams.Exponent <- res.Exponent
rsa.ImportParameters(rsaParams)
// export final RSA class
rsa
let rsaFormatter =
let r = RSAPKCS1SignatureFormatter(rsa)
r.SetHashAlgorithm("SHA1") |> ignore
r
let rsaDeformatter =
let r = RSAPKCS1SignatureDeformatter(rsa)
r.SetHashAlgorithm("SHA1") |> ignore
r
let sha1 =
let crytProv = new SHA1CryptoServiceProvider()
crytProv.Initialize()
crytProv
let encrypt (data: byte[]) =
let hash = sha1.ComputeHash(data)
rsaFormatter.CreateSignature(hash)
let verify (data: byte[]) (signature: byte[]) =
let hash = sha1.ComputeHash(data)
rsaDeformatter.VerifySignature(hash, signature)
encrypt
&verify
方法是这样使用的
let signature = GenericCryptography.encrypt (message |> Helpers.getUTF8Bytes)
let encryptedMessage = GenericCryptography.encrypt (message |> Helpers.getUTF8Bytes)
let verifiedSignature = GenericCryptography.verify encryptedMessage signature
这失败了
Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Key does not exist.
这在文档中没有提到用于验证...我不确定为什么我得到它 - 我知道我导入了 public 密钥,并且与此有关,但问题是什么
要重现,只需执行 var rsa = RSA.Create()
和 rsa.ExportParameters(false)
,这将 return 您可以从中获取 Modulus
和 Exponent
的结构传递给 createRsa
函数
进一步分析
这发生在这一行:
let encrypt (data: byte[]) =
let hash = sha1.ComputeHash(data)
rsaFormatter.CreateSignature(hash) //<-- this line
评论中所述的问题是,在导入 RSA 参数时,只设置了 public 密钥,为了加密它也需要私钥。
我已经按照 msdn verifying-signatures
实施了数字签名验证请不要因为它在 f# 中的事实而分散了对问题的注意力。我正在使用 .NET 5 框架中的标准加密库
module GenericCryptography =
let createRsa (res: GenericPublicKey) =
let rsa = RSA.Create()
// create params
let mutable rsaParams = RSAParameters()
rsaParams.Modulus <- res.Modulus
rsaParams.Exponent <- res.Exponent
rsa.ImportParameters(rsaParams)
// export final RSA class
rsa
let rsaFormatter =
let r = RSAPKCS1SignatureFormatter(rsa)
r.SetHashAlgorithm("SHA1") |> ignore
r
let rsaDeformatter =
let r = RSAPKCS1SignatureDeformatter(rsa)
r.SetHashAlgorithm("SHA1") |> ignore
r
let sha1 =
let crytProv = new SHA1CryptoServiceProvider()
crytProv.Initialize()
crytProv
let encrypt (data: byte[]) =
let hash = sha1.ComputeHash(data)
rsaFormatter.CreateSignature(hash)
let verify (data: byte[]) (signature: byte[]) =
let hash = sha1.ComputeHash(data)
rsaDeformatter.VerifySignature(hash, signature)
encrypt
&verify
方法是这样使用的
let signature = GenericCryptography.encrypt (message |> Helpers.getUTF8Bytes)
let encryptedMessage = GenericCryptography.encrypt (message |> Helpers.getUTF8Bytes)
let verifiedSignature = GenericCryptography.verify encryptedMessage signature
这失败了
Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Key does not exist.
这在文档中没有提到用于验证...我不确定为什么我得到它 - 我知道我导入了 public 密钥,并且与此有关,但问题是什么
要重现,只需执行 var rsa = RSA.Create()
和 rsa.ExportParameters(false)
,这将 return 您可以从中获取 Modulus
和 Exponent
的结构传递给 createRsa
函数
进一步分析
这发生在这一行:
let encrypt (data: byte[]) =
let hash = sha1.ComputeHash(data)
rsaFormatter.CreateSignature(hash) //<-- this line
评论中所述的问题是,在导入 RSA 参数时,只设置了 public 密钥,为了加密它也需要私钥。