我有一个带有特定访问令牌的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()
函数运行一些文本,然后将出现的所有内容粘贴到下一行。
加密的文本=将您的加密文本放在这里。
答案 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。你可能会做。
希望有帮助!