#c# #encryption #tripledes
#c# #шифрование #утроение
Вопрос:
когда я пытаюсь расшифровать свой зашифрованный ключ, я получаю сообщение об ошибке, в котором говорится, что это неправильные данные / неточные данные. Некоторое время пытался искать без какого-либо результата. Это и код шифрования, и код дешифрования. Indata — это MAC-адрес для шифрования, а indata для дешифрования считывается из текстового файла.
public string encryptMAC(string indata)
{
byte[] resultCrypt;
UTF8Encoding utf8 = new UTF8Encoding();
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
byte[] encrypt = utf8.GetBytes(indata);
try
{
ICryptoTransform encryptor = tdes.CreateEncryptor();
resultCrypt = encryptor.TransformFinalBlock(encrypt, 0, encrypt.Length);
}
finally
{
tdes.Clear();
}
return Convert.ToBase64String(resultCrypt);
}
public string decryptMAC(string indata)
{
byte[] resultDecrypt;
UTF8Encoding utf8 = new UTF8Encoding();
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
byte[] decrypt = Convert.FromBase64String(indata);
try
{
ICryptoTransform decryptor = tdes.CreateDecryptor();
resultDecrypt = decryptor.TransformFinalBlock(decrypt, 0, decrypt.Length);
}
catch (CryptographicException ex)
{
Console.WriteLine(ex);
}
finally
{
tdes.Clear();
}
return utf8.GetString(decrypt);
}
Комментарии:
1. Я добавил ключ из MD5Crypto, но какой IV?
Ответ №1:
TripleDESCryptoServiceProvider
сгенерирует для вас ключ. Если вы не установите его самостоятельно или не получите его во время шифрования, вы не сможете расшифровать зашифрованный текст.
Я предлагаю вам добавить ключ к вашим методам и использовать его для шифрования и дешифрования:
public string encryptMAC(string indata, byte[] key)
{
byte[] resultCrypt;
UTF8Encoding utf8 = new UTF8Encoding();
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
tdes.Key = key;
byte[] encrypt = utf8.GetBytes(indata);
try
{
ICryptoTransform encryptor = tdes.CreateEncryptor();
resultCrypt = encryptor.TransformFinalBlock(encrypt, 0, encrypt.Length);
}
finally
{
tdes.Clear();
}
return Convert.ToBase64String(resultCrypt);
}
public string decryptMAC(string indata, byte[] key)
{
byte[] resultDecrypt = new byte[0];
UTF8Encoding utf8 = new UTF8Encoding();
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
tdes.Key = key;
byte[] decrypt = Convert.FromBase64String(indata);
try
{
ICryptoTransform decryptor = tdes.CreateDecryptor();
resultDecrypt = decryptor.TransformFinalBlock(decrypt, 0, decrypt.Length);
}
catch (CryptographicException ex)
{
Console.WriteLine(ex);
}
finally
{
tdes.Clear();
}
return utf8.GetString(resultDecrypt);
}
Имейте в виду, что DES имеет небольшой набор слабых ключей, поэтому вы должны использовать TripleDESCryptoServiceProvider
для генерации ключа для вас, который будет отфильтровывать эти слабые ключи. Вы можете сгенерировать действительный ключ с помощью (new TripleDESCryptoServiceProvider()).Key
.
Комментарии:
1. Я внес ваши изменения, и когда я вызываю метод, какие входные данные должны быть в ключе? Я попытался преобразовать hidden в byte, но это говорит о том, что размер ключа недоступен для этого алгоритма
2. Я добавил пример к своему ответу.
3. Я изменил, это так, когда я вызываю метод decryptMAC(MACAdress, new TripleDESCryptoServiceProvider()).key); Хотя в этой строке снова появились неточные данные: resultDecrypt = decryptor. TransformFinalBlock(расшифровать, 0, расшифровать. Длина); Спасибо за ответы 🙂
4. Вы должны использовать один и тот же ключ для шифрования и дешифрования. Сгенерируйте ключ, присвоите его переменной и передайте эту переменную как методам шифрования, так и дешифрования.
5. Ну, вы должны вернуть правильный массив байтов (
resultDecrypt
и нетdecrypt
)