#c# #.net #encryption
#c# #.net #шифрование
Вопрос:
У нас есть устаревшее веб-приложение, которое использует aspEncrypt от Persits Software. У меня есть тысячи файлов, зашифрованных с помощью этой настройки, поэтому мне нужно оставаться совместимым.
Я пытаюсь написать новое служебное приложение на C #, соответствующее тому же шифрованию. Цель здесь СОСТОИТ в том, чтобы НЕ использовать aspEncrypt в новом приложении и сопоставить шифрование с использованием встроенных в .NET framework. В случае успеха я мог бы использовать одни и те же устаревшие процедуры дешифрования как для устаревших, так и для новых файлов.
Пример кода для того, как я обрабатываю этап шифрования с использованием aspEncrypt:
public static int EncryptFileWithRawKey2()
{
string InputFile = @"D:TEMP04testfile.txt"; // contains single line of ANSI text with no end of line characters "hello this is a file"
string OutPutFile = @"D:TEMP04testfile.txt.3.xxx";
string RawKey = "4CDD1518CD6662C9D1583A8732173EDC";
int iRet = 0;
ASPENCRYPTLib.ICryptoKey eKey = null;
try
{
ASPENCRYPTLib.CryptoManager CM = new ASPENCRYPTLib.CryptoManager();
ASPENCRYPTLib.ICryptoContext Context = CM.OpenContext("", 0, 0);
ASPENCRYPTLib.ICryptoBlob Blob = CM.CreateBlob();
Blob.Hex = RawKey;
eKey = Context.ImportRawKey(Blob, ASPENCRYPTLib.CryptoAlgorithms.calgRC2);
ASPENCRYPTLib.ICryptoBlob IVblob = CM.CreateBlob();
IVblob.Hex = "0000000000000000";
eKey.SetIV(IVblob);
eKey.Mode = ASPENCRYPTLib.CryptoCipherModes.ccmCBC;
eKey.Padding = ASPENCRYPTLib.CryptoCipherPadding.ccpPKCS5;
eKey.EffectiveLength = 40;
eKey.EncryptFile(InputFile.Trim(), OutPutFile.Trim());
if (File.Exists(OutPutFile) == true)
iRet = 1;
}
catch (Exception e)
{
Console.WriteLine("EncryptFileWithRawKey2 FAILED");
Console.WriteLine(e.ToString());
iRet = - 1;
}
return iRet;
}
И вот код, который я написал в пока безуспешной попытке сопоставить его:
public static void EncryptTextToFile2()
{
String Data = "hello this is a file";
String FileName = @"D:TEMP04testfile.txt.4.xxx";
String sTempKey = "4CDD1518CD6662C9D1583A8732173EDC";
byte[] Key;
byte[] IV;
try
{
Key = StringToByteArray(sTempKey);
IV = StringToByteArray("0000000000000000");
FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);
RC2 RC2alg = RC2.Create();
RC2alg.Padding = PaddingMode.PKCS7;
RC2alg.Mode = CipherMode.CBC;
RC2alg.KeySize = 40;
RC2alg.EffectiveKeySize = 40;
CryptoStream cStream = new CryptoStream(fStream, RC2alg.CreateEncryptor(Key, IV), CryptoStreamMode.Write);
cStream.FlushFinalBlock();
StreamWriter sWriter = new StreamWriter(cStream);
sWriter.WriteLine(Data);
sWriter.Close();
cStream.Close();
fStream.Close();
}
catch (CryptographicException e)
{
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("A file error occurred: {0}", e.Message);
}
}
public static byte[] StringToByteArray(string hex)
{
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
Выходные данные двух подпрограмм не совпадают. Я не могу изменить логику, использующую библиотеки AspEncrypt, поэтому мне нужно каким-то образом изменить второй раздел кода, чтобы он соответствовал выводам из первого.
Комментарии:
1. вопрос, который возникает у меня в голове, заключается в том, почему вы пытаетесь это сделать? Какова конечная цель? Избавиться от этой библиотеки aspEncrypt?
2. Конечная цель — позволить двум независимым системам передавать зашифрованные файлы взад и вперед. Поскольку у нас уже есть тысячи зашифрованных файлов, мы не хотим менять метод. Одна веб-система будет продолжать использовать AspEncrypt, и в идеале вторая система будет реализовывать тот же метод с использованием системы. Безопасность. Криптографический материал, встроенный в .NET.