使用PHP解密访问令牌以进行C#加密

时间:2019-01-16 05:16:05

标签: php encryption openssl rijndaelmanaged

我有一个带有特定访问令牌的API URL,该URL已用C#(以下代码)加密,并且我想通过将访问令牌传递给参数来使用PHP发布请求对其进行解密。谁能帮我解决这个问题。

预先感谢!

C#加密代码:

private String AES_encrypt(String Input)
   {
   var aes = new RijndaelManaged();
   aes.KeySize = 256;
   aes.BlockSize = 256;
   aes.Padding = PaddingMode.PKCS7;
   aes.Key =Convert.FromBase64String("QdZx1B0ZIcLK7DPNRK09wc/rjP4WnxtE");
   aes.IV = Convert.FromBase64String("hBSE4tn6e/5c3YVKFZ54Iisi4MiDyCO0HJO+WZBeXoY=");
   var encrypt = aes.CreateEncryptor(aes.Key, aes.IV);
   byte[] xBuff = null;
   using (var ms = new MemoryStream())
   {
   using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
   {
     byte[] xXml = Encoding.UTF8.GetBytes(Input);
     cs.Write(xXml, 0, xXml.Length);
   }
     xBuff = ms.ToArray();
   }
     String Output = Convert.ToBase64String(xBuff);
     return Output;
   }

到目前为止,我尝试使用以下代码对其进行解密

function strippadding($string)
    {
        $slast = ord(substr($string, -1));
        $slastc = chr($slast);
        $pcheck = substr($string, -$slast);
        if(preg_match("/$slastc{".$slast."}/", $string)){
        $string = substr($string, 0, strlen($string)-$slast);
            return $string;
        } else {
            return false;
        }
   }
function decrypt($string)
    {
        $key = base64_decode("DZR");
        $iv = base64_decode("Shravan");
        $string = base64_decode($string);
        return strippadding(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_CBC, $iv));
    }

填写以下项目:

使用此键和下面的iv。

key = QdZx1B0ZIcLK7DPNRK09wc/rjP4WnxtE

iv= hBSE4tn6e/5c3YVKFZ54Iisi4MiDyCO0HJO+WZBeXoY=

通过AES_encrypt()函数运行一些文本,然后将出现的所有内容粘贴到下一行。

加密的文本=将您的加密文本放在这里。

2 个答案:

答案 0 :(得分:0)

$xXml = openssl_decrypt(
   $Output, #openssl_decrypt works with base64 encoded data
   'AES-256-CBC',
   base64_decode("QdZx1B0ZIcLK7DPNRK09wc/rjP4WnxtE"), #key
   OPENSSL_RAW_DATA,
   base64_decode("hBSE4tn6e/5c3YVKFZ54Iisi4MiDyCO0HJO+WZBeXoY=") #IV
);

现在$xXml是采用UTF-8编码的输入字符串的二进制形式。

并确保openssl包含在您的PHP版本中。

答案 1 :(得分:0)

您尚未向我提供任何加密的文本以进行测试。

这是我认为您需要做的:

在C#代码中,您需要将块大小更改为128位:

aes.BlockSize = 128;

在C#代码中,IV必须为128位或16个字节长。它需要等于您选择的块大小。

所以现在这需要作为您的IV:

IV = HWeR102dxMjRHZlxTqL2aA==

您的密钥设置为256位:所以这是256位密钥:

Key = aZUEBKSsYRKA6CGQbwFwvIS8rUnW7YA2hVMNHnnf844=

C#具有可以自动为您生成一定长度的加密强字符串的功能。我建议您找到这些功能并学习如何使用它们,以便可以生成自己的密钥和IV。

现在是PHP部分。

您应该使用OpenSSL库而不是Mcrypt库。 Mcrypt已弃用,不再受支持。因此,这里有一个OpenSSL解决方案。

由于块大小现在为128位,密钥大小为256位,因此它将与openssl库的AES-256-CBC函数兼容。

$key = 'aZUEBKSsYRKA6CGQbwFwvIS8rUnW7YA2hVMNHnnf844='; //256 bit key.  
$iv = 'HWeR102dxMjRHZlxTqL2aA=='; //128 bit IV length.  The same as the block size that is set in the C#.

function decrypt($string, $key, $iv){

  $cipherText = base64_decode($string);  //We are going to use raw data.
  return openssl_decrypt($cipherText, 'AES-256-CBC', base64_decode($key), OPENSSL_RAW_DATA, base64_decode($iv));
  //Note that I did not specify no padding in the function.  By default it is PKCS#7 which is what is set in the C# code.
}

据我所知,这应该对您有用。此假设基于以下事实:您的AES_encrypt()正常工作,并且您的计算机上装有OpenSSL。你可能会做。

希望有帮助!