Зашифруйте имя файла в C #, не включая бесполезные символы в результирующей строке - PullRequest
3 голосов
/ 21 декабря 2009

Я хочу зашифровать имя файла, но убедиться, что зашифрованное имя файла не содержит символов, которые не разрешены (в системе Windows) в именах файлов.

Строка также должна быть в состоянии расшифровать обратно к исходному имени файла (чтобы вы не могли просто отфильтровать недопустимые символы после шифрования).

Насколько мне известно, непригодными для использования символами являются \ /: *? "> <|. Мне известно о System.IO.Path.InvalidPathChars, но я не знаю метода шифрования, который позволит избежать этих символов. </p>

Ответы [ 5 ]

7 голосов
/ 21 декабря 2009

Вы можете преобразовать имя файла или зашифрованный вывод в кодировку MIME Base64. Я не верю, что стандарт использует какой-либо из запрещенных символов. (Даже если это так, вы можете .Replace() запрещенные символы с запрещенными.)

Например, ваш вопрос base64'd:

c2UgdGhpcyBiYXNlNjQgc2FtcGxlIGRlY29kZXIgYW5kIGVuY29kZXIgdG86DQpGcmVuZCBDemVj aCBsaW5rcw0KDQpMYXN0IG1pbnV0ZSBaYWplemR5DQpBa2NpZSBCaWJsZQ0KTGV2bmUgcG5ldQ0K RmFrdHVyYQ0KU2VhcmNoIEN6ZWNoDQpIcnksIFZ5enZhbmVuaSBuYSBtb2JpbA0KT3RoZXINCg0K ICAgICogRGVjb2RlIGJhc2U2NCBzdHJpbmdzIChiYXNlNjQgc3RyaW5nIGxvb2tzIGxpa2UgWVRN ME5ab21JekkyT1RzbUl6TTBOVHVlWVE9PSkNCiAgICAqIERlY29kZSBhIGJhc2U2NCBlbmNvZGVk IGZpbGUgKGZvciBleGFtcGxlIElDTyBmaWxlcyBvciBmaWxlcyBmcm9tIE1JTUUgbWVzc2FnZSkN CiAgICAqIENvbnZlcnQgc291cmNlIHRleHQgZGF0YSBmcm9tIHNldmVyYWwgY29kZSBwYWdlcyBh bmQgZW5jb2RlIHRoZW0gdG8gYSBiYXNlNjQgc3RyaW5nIG9yIGEgZmlsZQ0KDQoNCiAgICAgIFRo ZSBGb3JtLlNpemVMaW1pdCBpcyAxMDAwMDAwMGJ5dGVzLiBQbGVhc2UsIGRvIG5vdCBwb3N0IG1v cmUgZGF0YSB1c2luZyB0aGlzIGZvcm0uDQoNCiAgICAgVHlwZSAob3IgY29weS1wYXN0ZSkgc29t ZSB0ZXh0IHRvIGEgdGV4dGJveCBiZWxsb3cuIFRoZSB0ZXh0IGNhbiBiZSBCYXNlNjQ =

4 голосов
/ 21 декабря 2009

Как отмечает @Tom, вы можете base64 кодировать имя файла. Однако методы .NET base64 включают символ косой черты, поэтому вам нужно заменить его.

var encryptedFilename = GetEncryptedFileName();
var encodedFileName = Convert.ToBase64String(Encoding.UTF8.GetBytes(encryptedFilename));
var encodedAndEscapedFilename = encodedFileName.Replace('/', '-');

Затем вы можете сделать то же самое в обратном порядке, чтобы получить оригинальное имя (используя Convert.FromBase64String и Encoding.UTF8.GetString).

3 голосов
/ 21 декабря 2009

Отсутствует результирующая «строка», все преобразования шифрования приводят к тому, что байт [] отсутствует в строке. Существуют строковые представления byte [], как хорошо известно hex (0xBAADF00D) или Base64. Вероятно, наиболее подходящим является base64, просто используйте Convert.ToBase64String и Convert.FromBase64String.

То, что говорится о шифровании имени файла, кажется очень плохой идеей. Имена файлов по определению являются ключами поиска индекса, и с шифрованием вы потеряете любую возможность поиска. Вам нужно будет отсканировать весь диск / папку и расшифровать каждое имя файла, чтобы найти нужный файл. Обратите внимание, что вы не можете полагаться на известное зашифрованное значение (например, если я ищу «file.txt», я шифрую «file.txt», а затем ищу зашифрованное имя), поскольку для шифрования необходимо использовать случайное IV значение (которое добавляется к результату шифрования). Неспособность правильно рандомизировать IV приведет к кроваткам . И все же успешное засоление ключа (хороший случайный IV) сделает результат неисследимым.

1 голос
/ 03 сентября 2010

Мой ответ заключался в преобразовании зашифрованного кода в HEX. Преимуществом для этого была совместимость между ASP, ASPX, SQL, VB, C # и Javascript.
Еще одним преимуществом было то, что я мог использовать шифрование по своему выбору, не беспокоясь о выводе.

1 голос
/ 21 декабря 2009

Как сказал выше Ремус, в результате нет 'строки', все преобразования шифрования приводят к байту [], а не к строке.

Обычно я беру массив выходных байтов шифрования и вызываю BitConverter.ToString(Bytes);, чтобы преобразовать его в шестнадцатеричный формат, хотя в результате получается формат FF-D0-FF-D1. Если требуется простая шестнадцатеричная строка, просто запустите .Replace("-", "");

, например

возврат BitConverter.ToString (AESEncryption.Encrypt (маркер, key)).Replace("-", "");

(AESEncryption - это простая пользовательская оболочка для RijndaelManaged)

Расшифровка не такая аккуратная, немного грубая сила, но все же простая

    private byte[] FromHexString(string encryptedToken)
    {
        List<byte> bytes = new List<byte>();

        for (int i = 0; i <= encryptedToken.Length; i+=2)
        {
            try
            {
                bytes.Add((byte)Int32.Parse(encryptedToken.Substring(i, 2), System.Globalization.NumberStyles.HexNumber));
            }
            catch //whatever exception
            {
                //handle
            }

        }

        return bytes.ToArray();
    }      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...