Как создать собственную числовую систему? - PullRequest
1 голос
/ 30 июля 2009

Вопрос для любого современного неуправляемого языка. C-подобные языки, delphi, что угодно.

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

Моей первой мыслью было создать свою собственную систему счисления, похожую на шестнадцатеричную, но с большим количеством символов. Например, [0..9] + [A..Z]. Это сделало бы число до 40 в однозначное значение. Я также мог бы добавить другие цифры, такие как «!,. /?) (#!» И т. Д.

Мой вопрос заключается в том, как реализовать такую ​​систему счисления от A до Z, включающую от 0 до 9. Должен ли я объявлять каждое значение как константу до 0xZZZZZZZZ? это сделало бы мою жизнь ужасной

Пожалуйста, дайте мне ваши предложения, примеры. :)

Ответы [ 6 ]

5 голосов
/ 30 июля 2009

Вам нужно изменить способ работы компьютеров и хранилища.

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

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

Обычно некоторое сжатие форм выполняется ДО шифрования (GZip или что-то подобное), но это не работает при изменении систем счисления.

P.S. Используйте проверенный алгоритм шифрования.

4 голосов
/ 30 июля 2009

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

2 голосов
/ 30 июля 2009

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

Возможно, вы придумаете небезопасный алгоритм.

Использовать существующий алгоритм и использовать сжатие.

2 голосов
/ 30 июля 2009

Давайте подумаем об этом.

Каждый символ Base 40 занимает 8 бит. Он кодирует число от 0 до 39, что составляет всего лишь 5 бит фактической информации.

Один байт может представлять 256 различных значений. Базовая кодировка 40 представляет только 40 различных значений в одном и том же байте.

Кажется, что это чистая потеря из 2-3 битов на байт.

Сказав это, базовое значение 40 - это строка и ничего более. Не требуется никакого необычного объявления базы данных - это просто строка.

Вы пишете две функции - toBase40 (someBytes) и toBytes (someBase40string) для преобразования ваших строк base40 в обычные строки.

Если вы хотите хорошо выполненное существующее решение, исследуйте base64 .

1 голос
/ 30 июля 2009

Строки Base64 распространены на многих компьютерных языках и довольно стандартны. Используются следующие символы:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /

См. http://en.wikipedia.org/wiki/Base64 для получения дополнительной информации

1 голос
/ 30 июля 2009

Я бы порекомендовал просто сжать входные данные (используя gzip, zlib или что-то еще) перед шифрованием. Это проще и безопаснее, чем создавать собственный алгоритм. (GnuPG делает это, например.)

...