Я должен воссоздать вещи с C # до PHP.
Я действительно не знаю, что делать, потому что мне никогда не приходилось иметь дело с такими вещами, как шифрование или что-то в этом роде.
В C # я получил это:
public static byte[] decrypt(byte[] data, byte[] key)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = key;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.None;
return des.CreateDecryptor().TransformFinalBlock(data, 0, data.Length);
}
public static byte[] encrypt(byte[] data, byte[] key)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = key;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.None;
return des.CreateEncryptor().TransformFinalBlock(data, 0, data.Length);
}
public static byte[] get8byte(string input)
{
byte[] ByteArray = new byte[8];
string tmp = string.Empty;
int j = 0;
for (int i = 0; i < 16; i++)
{
tmp = "" + input[i];
tmp = tmp + input[i + 1];
ByteArray[j] = byte.Parse(tmp, System.Globalization.NumberStyles.HexNumber);
j++;
i++;
}
return ByteArray;
}
и ключ, который я должен использовать, зашифрован следующим образом:
var Buffer = new char[16];
var cMasterKey = new byte[8];
byte[] Key = {
(byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5',
(byte) '6', (byte) '7', (byte) '8'
};
cMasterKey = DESUtils.get8byte(new string(Buffer));
MasterKey = DESUtils.decrypt(cMasterKey, Key);
«Буфер» исходит от USB-накопителя, на котором есть файл, содержащий мастер-ключ из 16 символов.
Я действительно не знаю, как реализовать это в PHP. Я пробовал много вещей, таких как pack (‘C *’, $ var) и тому подобное, но я не получил тот же результат.
Есть здесь кто-нибудь, кто знает, как с этим справиться? Я не знаю, нахожусь ли я на правильном пути, но я пробовал такие вещи:
$key = pack('C*', 1, 2, 3, 4, 5, 6, 7, 8);
$masterbyte = pack('C*', $buffer);
$decmasterkey = mcrypt_decrypt(MCRYPT_DES, $key, $masterbyte, MCRYPT_MODE_ECB);
'1'
в C # это символьный литерал. Символы могут быть напрямую преобразованы в байт в предположении ASCII по умолчанию. Так '1'
на самом деле это байт 0x31, а не байт 0x01, как у вас в PHP.
Ты хочешь»:
$key = "12345678";
Ли расшифровка $buffer
Это правильно, зависит от его содержания и того, как вы его читаете.
Некоторые заметки:
Не используйте DES в настоящее время. Это действительно небезопасно. AES — лучшая альтернатива
Никогда не используйте Режим ЕЦБ. Это детерминированный и, следовательно, не семантически безопасный. Вы должны по крайней мере использовать случайный режим, как CBC или же CTR. Лучше аутентифицировать ваши шифротексты так, чтобы атаки набивка оракула не возможно. Это можно сделать с помощью аутентифицированных режимов, таких как GCM или EAX, или с шифровать-то-MAC схема.
Других решений пока нет …