Шифрование текста с помощью .СЕТЕВЫЕ библиотеки, соответствующие шифрованию из aspEncrypt

#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.