RSA3072_RSASSA-PSS RSASignaturePadding.Pss not work when use RSACryptoServiceProvider to signdata()

203 Views Asked by At

I have pair of RSA3072 public and private key.

i want use this private key to sign some date with RSA3072_RSASSA-PSS (SHA256 PSS pading) but error is report in step: SignData rsaP.SignData(date1, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);

"System.Security.Cryptography.CryptographicException:“Specified padding mode is not valid for this algorithm.”"

ps: private and public key is generate use below code:

void GenerateKeys()
{
    using (var rsa = new RSACryptoServiceProvider(3072))
    {
        try
        {
            // 获取私钥和公钥。
            var publicKey = rsa.ToXmlString(false);
            var privateKey = rsa.ToXmlString(true);

            // 保存到磁盘
            File.WriteAllText(Path.Combine("C:\\Users\\pkean\\source\\repos\\ConsoleApp1\\ConsoleApp1", "publickey.xml"), publicKey);
            File.WriteAllText(Path.Combine("C:\\Users\\pkean\\source\\repos\\ConsoleApp1\\ConsoleApp1", "privateKey.xml"), privateKey);

        }
        finally
        {
            rsa.PersistKeyInCsp = false;
        }
    }
}

below is my code:

byte\[\] content = new byte \[2\]{0x12,0x34} ;

string readoutprivateXmlKey;
readoutprivateXmlKey = File.ReadAllText(Path.Combine("C:\\Users\\pkean\\source\\repos\\ConsoleApp1\\ConsoleApp1", "privateKey.xml"));

SingData(readoutprivateXmlKey,content);

byte[] SignData(string privatekey, byte[] date1)
{
    RSACryptoServiceProvider rsaP = new RSACryptoServiceProvider(3072);
    rsaP.FromXmlString(privatekey);
    byte[] byteSign0 = rsaP.SignData(date1, "SHA256");
    byte[] byteSign1 = rsaP.SignData(date1, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);
    byte[] byteSignusehash = rsaP.SignHash(sha256hash, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);

    return byteSign0;
}

try to change Pad with RSASignaturePadding.pkcs1, Test is OK. but i need use RSA3072_RSASSA-PSS

1

There are 1 best solutions below

0
David On

Using AsymmetricSignatureProvider works for me.

// using Microsoft.IdentityModel.Tokens;
SecurityKey sk = new RsaSecurityKey(new RSAParameters
{
    Exponent = firstPublicKeyData.Exponent,
    Modulus = firstPublicKeyData.Modulus,
});
var provider = new AsymmetricSignatureProvider(sk, SecurityAlgorithms.RsaSsaPssSha256, willCreateSignatures: false);
var res = provider.Verify(bytesNotHashed, signature);