Can't get PHP code to sign data the same as C#

132 Views Asked by At

I have the following code in C# that is working perfectly. I need to create the same function in php that will return the exact same signed license as C#. I am using phpseclib v1.0.22 and for the life of me, I can't get the php function to return the same signature for a given License and privatekey. I am not a php programer, so I need some help to figure out the error of my ways.

The working C# code is below:

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);
}

My attempt at a php equivalent, which is not working is below:

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;
}

When I pass in the same strLic and strPrivateKey to each of these functions I get totally different signed licenses back. Below are what I get back:

C# SignLicense: uTlJd3Ce8N1Z2I36FznY8wCtlmmgOtmyv1wdos330Bgk4D6S9GlWl+p+lNKcjamDxyrUrt+jf47wVx777W0zZlie9zufX/UkhMZNxM+ZOkdEU61qltyb122M1GBK6BjzhicwM/BW8aP/ei3DZwMrZuSvqxLxjT/Q4bC73xbpTGUl9KssGLmIxsYm0p3wbxsDM85nnD3yCzRtZYpdW1S5UU4EHXqudLPCSDIJ7DCPDft8k7iRsaKhpiloWax9AD2a5y5Hxhkrq4KH58ZcQ1aYCc+eEbfVnOS822EOY7aTOVH8FmiwXgaLgm5/3XsKayJam0GH4th7MXzcn77OPQOQeQ==

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

They are totally different and I can't for the life of me figure out why. Can someone help me figure this out.

Thanks!

0

There are 0 best solutions below