我的任务是使用Php解密用C#加密的数据。我尝试使用phpseclib库。因此,这是C#中用于加密的现有代码:
public static String EncryptMyText(string clearText,string Password)
{
if (clearText.Length == 0) return "";
byte[] clearBytes = System.Text.Encoding.UTF8.GetBytes(clearText);
// second parameter is "Ivan Medvedev" in string
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,new byte[] { 0x49,0x76,0x61,0x6e,0x20,0x4d,0x65,0x64,0x76 });
byte[] encryptedData = Encrypt(clearBytes,pdb.GetBytes(32),pdb.GetBytes(16));
return Convert.ToBase64String(encryptedData);
}
public static byte[] Encrypt(byte[] clearData,byte[] Key,byte[] IV)
{
try
{
MemoryStream ms = new MemoryStream();
Rijndael alg = Rijndael.Create();
alg.Key = Key;
alg.IV = IV;
CryptoStream cs = new CryptoStream(ms,alg.CreateEncryptor(),CryptoStreamMode.Write);
cs.Write(clearData,clearData.Length);
cs.Close();
byte[] encryptedData = ms.ToArray();
return encryptedData;
}
catch (Exception ex)
{
string message = ex.Message;
}
return null;
}
EncryptMyText("sometext","xxxxxxxxxxxxxxx"); // password have 15 characters length
无法更改此代码。所以这是我尝试使用phpseclib的内容:
$key = "xxxxxxxxxxxxxxx";
$salt = "Ivan Medvedev";
$cipher = new Rijndael();
$cipher->setPassword($cle,'pbkdf1','sha1',$salt);
$cipher->decrypt(base64_decode("someCryptedText"));
这时,代码以setPassword()
调用引发的异常“派生密钥太长”而中断。
我尝试了许多操作,例如更改blockLength
和KeyLenghth
而不使用setPassword()
$cipher->setKeyLength(256);
$cipher->setBlockLength(128);
没有明显变化。
我几乎没有解密和密码方面的经验,因此我就所使用的C#代码挖掘了一些信息。在https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.rijndael?view=netframework-4.8处查看Rijndael类。我尝试了几件事,对应该看的东西没有太多的想法。我什至不知道是否可以使用Phpseclib来解密此C#代码生成的数据。
感谢所有可以给我一些指导的人。