C# RSA用PHP签名,用C验证#

C# RSA用PHP签名,用C验证#,c#,php,rsa,signing,phpseclib,C#,Php,Rsa,Signing,Phpseclib,不幸的是,我还没有找到任何适合我的问题,因此我将创建一个新问题。 我的PHP代码(使用phpseclib的RSA)对字符串进行签名,您可能会注意到该代码用于验证许可证代码 <?php include('Crypt/RSA.php'); $rsa = new Crypt_RSA(); //$rsa->setPassword('password'); $rsa->loadKey('-----BEGIN RSA PRIVATE KEY----- ... -----END RSA P

不幸的是,我还没有找到任何适合我的问题,因此我将创建一个新问题。
我的PHP代码(使用phpseclib的RSA)对字符串进行签名,您可能会注意到该代码用于验证许可证代码

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
//$rsa->setPassword('password');
$rsa->loadKey('-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
'); // private key

$plaintext = 'AAAAA-AAAAA-AAAAA-AAAAA';

$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
$signature = $rsa->sign($plaintext);
echo base64_encode($signature);
            bool success = false;
            using (var rsa = new RSACryptoServiceProvider())
            {
                StreamReader reader = new StreamReader(dataStream);
                String signedString = reader.ReadToEnd();
                byte[] signedBytes = Convert.FromBase64String(signedString);
                byte[] bytesToVerify = Encoding.UTF8.GetBytes(value);
                try
                {
                    RSAParameters parameters = new RSAParameters();
                    parameters.Exponent = new byte[] { 0x01, 0x10, 0x01 };
                    parameters.Modulus = OtherClass.StringToByteArray(Program.Modulus);
                    rsa.ImportParameters(parameters);

                    success = rsa.VerifyData(bytesToVerify, new SHA1CryptoServiceProvider(), signedBytes);
                }
                catch (CryptographicException e)
                {
                    Console.WriteLine(e.Message);
                }
                finally
                {
                    rsa.PersistKeyInCsp = false;
                }
            }

dataStream是webrequest的响应流。

我现在通过使用另一种方式加载密钥来解决这个问题。
            bool success = false;
            using (var rsa = new RSACryptoServiceProvider())
            {
                StreamReader reader = new StreamReader(dataStream);
                String signedString = reader.ReadToEnd();
                byte[] signedBytes = Convert.FromBase64String(signedString);
                byte[] bytesToVerify = Encoding.UTF8.GetBytes(value);
                try
                {
                    RSAParameters parameters = new RSAParameters();
                    parameters.Exponent = new byte[] { 0x01, 0x10, 0x01 };
                    parameters.Modulus = OtherClass.StringToByteArray(Program.Modulus);
                    rsa.ImportParameters(parameters);

                    success = rsa.VerifyData(bytesToVerify, new SHA1CryptoServiceProvider(), signedBytes);
                }
                catch (CryptographicException e)
                {
                    Console.WriteLine(e.Message);
                }
                finally
                {
                    rsa.PersistKeyInCsp = false;
                }
            }
我使用此在线转换器将PEM密钥转换为XML密钥:

            bool success = false;
            using (var rsa = new RSACryptoServiceProvider())
            {
                StreamReader reader = new StreamReader(dataStream);
                String signedString = reader.ReadToEnd();
                byte[] signedBytes = Convert.FromBase64String(signedString);
                byte[] bytesToVerify = Encoding.UTF8.GetBytes(value);
                try
                {
                    RSAParameters parameters = new RSAParameters();
                    parameters.Exponent = new byte[] { 0x01, 0x10, 0x01 };
                    parameters.Modulus = OtherClass.StringToByteArray(Program.Modulus);
                    rsa.ImportParameters(parameters);

                    success = rsa.VerifyData(bytesToVerify, new SHA1CryptoServiceProvider(), signedBytes);
                }
                catch (CryptographicException e)
                {
                    Console.WriteLine(e.Message);
                }
                finally
                {
                    rsa.PersistKeyInCsp = false;
                }
            }
因此,我将try{…}部分更改为:

            bool success = false;
            using (var rsa = new RSACryptoServiceProvider())
            {
                StreamReader reader = new StreamReader(dataStream);
                String signedString = reader.ReadToEnd();
                byte[] signedBytes = Convert.FromBase64String(signedString);
                byte[] bytesToVerify = Encoding.UTF8.GetBytes(value);
                try
                {
                    RSAParameters parameters = new RSAParameters();
                    parameters.Exponent = new byte[] { 0x01, 0x10, 0x01 };
                    parameters.Modulus = OtherClass.StringToByteArray(Program.Modulus);
                    rsa.ImportParameters(parameters);

                    success = rsa.VerifyData(bytesToVerify, new SHA1CryptoServiceProvider(), signedBytes);
                }
                catch (CryptographicException e)
                {
                    Console.WriteLine(e.Message);
                }
                finally
                {
                    rsa.PersistKeyInCsp = false;
                }
            }
rsa.FromXmlString("{XML_KEY}");
success = rsa.VerifyData(bytesToVerify, new SHA1CryptoServiceProvider(), signedBytes);

现在它工作得很好。我想我真的不明白如何通过模和指数加载密钥。

问题是什么?你发布了你的代码,但没有询问或告诉什么不起作用。哦,是的,对了,对不起:D,它不起作用。验证总是失败。好吧,千万不要把你的私钥放在这样的网站上。我宁愿使用参考的一段C代码在格式之间进行转换。我没有转换我的私钥;)别担心。我只转换了我的公钥,因为我只需要该公钥就可以与C#一起使用,但谢谢链接!
            bool success = false;
            using (var rsa = new RSACryptoServiceProvider())
            {
                StreamReader reader = new StreamReader(dataStream);
                String signedString = reader.ReadToEnd();
                byte[] signedBytes = Convert.FromBase64String(signedString);
                byte[] bytesToVerify = Encoding.UTF8.GetBytes(value);
                try
                {
                    RSAParameters parameters = new RSAParameters();
                    parameters.Exponent = new byte[] { 0x01, 0x10, 0x01 };
                    parameters.Modulus = OtherClass.StringToByteArray(Program.Modulus);
                    rsa.ImportParameters(parameters);

                    success = rsa.VerifyData(bytesToVerify, new SHA1CryptoServiceProvider(), signedBytes);
                }
                catch (CryptographicException e)
                {
                    Console.WriteLine(e.Message);
                }
                finally
                {
                    rsa.PersistKeyInCsp = false;
                }
            }