.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 您可以从中获取 ModulusExponent 的结构传递给 createRsa 函数


进一步分析

这发生在这一行:

let encrypt (data: byte[]) = 
  let hash = sha1.ComputeHash(data)
  rsaFormatter.CreateSignature(hash) //<-- this line

评论中所述的问题是,在导入 RSA 参数时,只设置了 public 密钥,为了加密它也需要私钥。