RSA公钥解密C#(PowerShell)

时间:2018-07-02 07:40:13

标签: c# powershell cryptography rsa signing

我们有一个签名服务,该服务接受sha256哈希作为输入,并使用pkcs11和C#中的充气城堡库对哈希进行签名,将签名的摘要编码为Bae64并将其发送给请求者。因此,从本质上讲,我们正在生成哈希的哈希并对该哈希进行签名。

在另一端的请求者为了验证此消息,对base64接收到的摘要进行了解码并进行了验证。我在PowerShell的末端使用了.NET库,并实现了一个验证过程。请参见下面。

## Load a certificate Public key and verify

$certusedforsigning = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2

$certusedforsigning.Import($signingcertificate)

$certusedforsigning.PublicKey.key  -as [System.Security.Cryptography.RSACryptoServiceProvider] | Out-null

$oid = [System.Security.Cryptography.CryptoConfig]::MapNameToOID('SHA256')

$padding = [System.Security.Cryptography.RSASignaturePadding]::Pkcs1

$result = $certusedforsigning.PublicKey.key.Verifyhash($originalhashinBinary,$signedbinary,'SHA256',$padding)

$result

if($result -eq 'True' ) { write-host 'Signature verified True'} else { write-host 'Signature validation Failed'}

}
}

现在,为了避免对哈希进行哈希处理,我们正在使用RSA私钥对接收到的sha256哈希进行加密。现在,我假设我需要使用公共密钥来解密散列,生成原始消息的sha256散列并比较两者以进行验证。

.NET中是否有可以让我执行此操作的方法或函数?我可以使用OpenSSL完成此操作吗?您能否指出我如何完成如上所述的验证消息。谢谢。

1 个答案:

答案 0 :(得分:1)

通常,使用私钥加密的定义不明确。 PKCS#1 v1.5填充方法有两种:一种用于签名(使用私钥),另一种用于加密(使用公钥)。因此,取决于使用哪种填充方法。

让我们假设使用了用于签名的签名。检查这很容易:只需在相同数据上重新生成签名即可。如果它与前一个相同,则选择用于签名的填充(通过密钥类型选择PKCS#11实现)。

要验证签名,您只需要对数据进行哈希处理,然后执行签名验证(在C#中可以包括哈希处理)并针对基数为64的解码签名值进行验证。除此之外,不需要任何特殊的魔术。

如果使用非确定性加密方案,则您可能需要重新考虑协议。 RSA填充对于RSA密码系统提供的安全性至关重要。