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
相关产品推荐
相关产品推荐

