Шифрование в буквенно-цифровую форму в System.Security.Cryptography - PullRequest
1 голос
/ 04 февраля 2010

У меня есть проект, который требует шифрования идентификаторов клиентов.Зашифрованное значение используется в качестве значения строки запроса для веб-сайта, который затем возвращает персонализированную форму для заполнения.

Проблема, с которой я сталкиваюсь, состоит в том, что веб-сайт, с которым мы работаем, имеет политику безопасности, которая запрещаетбуквенно-цифровые символы из строки запроса.

В настоящее время я пытаюсь получить подтверждение того, какие именно символы блокируются, но идеальным решением было бы использование алгоритма шифрования, который возвращает буквенно-цифровую строку.

Я не нашеллюбой такой алгоритм в пространстве имен System.Security.Cryptography пока нет - очевидно, потому что размер ключа, как правило, составляет 64 бита или несколько кратных - но я надеюсь, что такой алгоритм доступен.

Единственной альтернативой на этом этапе является замена любых допустимых символов на другие допустимые символы, однако я не думаю, что у меня будет достаточно допустимых символов, чтобы это работало.

Есть ли у кого-нибудь опыт с этим или предложения о том, как действовать?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2010

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

Base64 работает следующим образом - он кодирует произвольный двоичный код в символы в наборе [A-Za-z0-9+/] (что почти соответствует желаемому, с добавлением + и /). Вы можете использовать кодировку Base64, а затем заменить + и / на два других «разрешенных символа», если они есть (возможно, - и _?).

На вашем языке должны быть доступны функции кодирования и декодирования Base64.

2 голосов
/ 04 февраля 2010

Шифрование (или, скорее, в данном случае - хеширование) вернет массив байтов. Преобразуйте байтовые значения в шестнадцатеричную строку и передайте ее через.

private static string ByteArrayToHexString(byte[] byteArray)
{
    string result = string.Empty;

    foreach (byte outputByte in byteArray)
    {
        result += outputByte.ToString("x2");
    }
    return result;
}

Затем преобразовать обратно из шестнадцатеричной строки в байтовый массив

private static byte[] HexStringToByteArray(String hexString)
{
    int stringLength = hexString.Length;
    byte[] bytes = new byte[stringLength / 2];

    for (int i = 0; i < stringLength; i += 2)
    {
        bytes[i / 2] = System.Convert.ToByte(hexString.Substring(i, 2), 16);
    }
    return bytes;
}

Используя эти методы, вы можете быть уверены, что единственное значение, которое вы передадите, будет шестнадцатеричное (0123456789ABCDEF)

...