You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP实现的RSA签名无法与C#生成一致结果的问题求助

PHP实现的RSA签名无法与C#生成一致结果的问题求助

我现在遇到一个头疼的问题:我有一段可以正常工作的C# RSA签名代码,现在需要用PHP(phpseclib v1.0.22)实现相同的功能,让它生成和C#完全一致的签名结果,但试了好多次都失败了。我本身不是PHP开发者,实在找不到问题出在哪,希望大家能帮我排查一下!

工作正常的C#代码

private string SignLicense(string strLic, string strPrivateKey)
{
    // Create instance of RSACryptoServiceProvider and import private key params into it
    System.Security.Cryptography.RSACryptoServiceProvider rsaCSP = new System.Security.Cryptography.RSACryptoServiceProvider();
    rsaCSP.FromXmlString(strPrivateKey);
    RSAParameters rsaPrivateParams; // stores private key
    rsaPrivateParams = rsaCSP.ExportParameters(true);
    rsaCSP.ImportParameters(rsaPrivateParams);

    // Convert the string to a Byte array
    byte[] userData = Encoding.UTF8.GetBytes(strLic);

    // Setup to sign the userData using SHA1 and RSAPKCS1
    AsymmetricSignatureFormatter asf = new RSAPKCS1SignatureFormatter(rsaCSP);
    HashAlgorithm algorithm = new SHA1Managed();
    asf.SetHashAlgorithm(algorithm.ToString);

    // Hash the user userData now
    byte[] myhashedData; // a byte array to store hash value
    string myhashedDataString;
    myhashedData = algorithm.ComputeHash(userData);
    myhashedDataString = BitConverter.ToString(myhashedData).Replace("-", string.Empty);

    // Sign the Hashed data and convert it back to a string and return it to the caller
    byte[] mysignature; // holds signatures
    mysignature = asf.CreateSignature(algorithm);
    return Convert.ToBase64String(mysignature);
}

我尝试的PHP代码(无法得到一致结果)

function SignLicense($strLic, $strPrivateKey) {
    // Decode the Install Code
    $strReq = base64_decode($strLic);

    // Create a new Crypt_RSA object using phpseclib
    $rsa = new Crypt_RSA();

    // Set the hash to sha1 and the encryption mode to PKCS1
    $rsa->SetHash("sha1");
    $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);

    //Load the Key file from the stored GCode which is in XML Format
    $rsa->loadKey($strPrivateKey, CRYPT_RSA_PRIVATE_FORMAT_XML);

    //utf8 Encode the license string now
    $userdata = utf8_encode($strLic);

    //Sign the stLic now (encrypt it using the loaded Private Key (GCODE))
    //$hasheddata = base64_encode($rsa->sign($userdata))
    $strSig = $rsa->sign($userdata);

    // Add the signature to the license
    $strLicKey = str_replace('=', '', base64_encode($strSig));
    return $strLicKey;
}

测试结果对比

使用完全相同的strLic和strPrivateKey调用两个函数,得到的签名完全不同:

C#生成的签名:

uTlJd3Ce8N1Z2I36FznY8wCtlmmgOtmyv1wdos330Bgk4D6S9GlWl+p+lNKcjamDxyrUrt+jf47wVx777W0zZlie9zufX/UkhMZNxM+ZOkdEU61qltyb122M1GBK6BjzhicwM/BW8aP/ei3DZwMrZuSvqxLxjT/Q4bC73xbpTGUl9KssGLmIxsYm0p3wbxsDM85nnD3yCzRtZYpdW1S5UU4EHXqudLPCSDIJ7DCPDft8k7iRsaKhpiloWax9AD2a5y5Hxhkrq4KH58ZcQ1aYCc+eEbfVnOS822EOY7aTOVH8FmiwXgaLgm5/3XsKayJam0GH4th7MXzcn77OPQOQeQ==

PHP生成的签名:

0ITgqYxK/clH6VbzP6R+oDdD8bfcKrOeurySCrtHnJmjyCYa4WPnNUw63uhEpcnyQOCJjx7YoNqQeeWwHn6URrTymk3ck8XEQ2w6wGvZtgACfpJ/vCgAhd/MYNDyhauaxKqqY2qTjslbaoBi8Ne0chvrgN4iImA3qETX2kwrI+3DZUSW8Zr78dVv8abRjPc8kjG87TK3Mtxf0joT+2/XMB0Dh6A2xCf2Hoz+P4lMNLR85j2X4xyBlW/Kumg6woAgJUhaeQfPbSuSQPrB9N08v7cCgUnuT+YaAjAC1UdBoDovYQ2bZRFSiZ73+Muejk9/m2uHbv6mAsDdVmgUaky9SQ

实在搞不懂为什么会这样,有没有大佬能帮我找出问题所在?

备注:内容来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 07:19:29