RSA签名与PHP,验证与c#

本文关键字:验证 PHP RSA | 更新日期: 2023-09-27 17:51:24

不幸的是,我还没有找到任何适合我的东西,所以我将创建一个新的问题。
我的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);
验证响应的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;
                }
            }

数据流是webquest的响应流。

RSA签名与PHP,验证与c#

我现在通过使用另一种方式加载密钥来解决这个问题。
我使用这个在线转换器将我的PEM密钥转换为XML密钥:https://superdry.apphb.com/tools/online-rsa-key-converter

所以我改变了try{…}部分到:

rsa.FromXmlString("{XML_KEY}");
success = rsa.VerifyData(bytesToVerify, new SHA1CryptoServiceProvider(), signedBytes);

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