двусторонний ключ шифрования / алгоритм хэширования

Я не имею никакого опыта в этом типе вещей, поэтому я даже не уверен в ключевых словах (отсюда и название). В основном мне нужна двусторонняя функция

encrypt(w,x,y) = z

decrypt(z) = w, x, y

Where w = integer 
      x = string (username)
      y = unix timestamp 

и z = является 8-значным числом (возможно, включая буквы, спецификацияпока нет.)

Я хотел бы, чтобы z было нелегко угадать и легко проверить. Скорость нетогромный беспокойство, безопасность нет тоже. Отслеживание отношений один-к-одному является основным требованием. Любые ресурсы или направления будут оценены.

РЕДАКТИРОВАТЬ

Спасибо за ответы, многому учусь. Таким образом, чтобы уточнить, 8 символов является единственным жестким требованием, наряду с возможностью связать W <-> Z. Имя пользователя (Y) и метка времени (Z) будут считаться глазурью на торте.

Я хотел бы сделать это математически, а не выполнять поиск некоторых баз данных, если это возможно.

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

 jskulski26 авг. 2009 г., 00:28
@Zed, мы хотим расшифровать, чтобы избежать долгого поиска внешнего стола. Тем не менее, это 'Это мягкое требование, но приятное.
 Zed25 авг. 2009 г., 22:08
Не могли бы вы уточнить, почему вы должны иметь возможность дешифровать z в эти значения?
 San Jacinto25 авг. 2009 г., 22:09
Комментарий, а не ответ: вы не избежите проблемы с разделением ключей в этом сценарии, просто чтобы убедиться, что вы об этом подумали.

Ответы на вопрос(7)

Шифрование против хеширования

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

Для шифрования необходим некоторый ключевой материал. Существует много алгоритмов шифрования, но они делятся на две основные группы: симметричные и асимметричные.

заявка

Приложение здесь неЯсно. Но если тышифровки» некоторую информацию и отправить ее куда-нибудь, а затем получить обратно и что-то с ней сделать,симметричный Шифрование это путь. Например, скажем, вы хотите закодировать имя пользователя, IP-адрес и некоторый идентификатор из вашего приложения в параметре, который вы включаете в ссылку в каком-то HTML. Когда пользователь щелкает ссылку, этот параметр передается обратно в ваше приложение, и вы декодируете его, чтобы восстановить исходную информацию. Тот'отлично подходит для симметричного шифрования, потому что отправитель и получатель - одна и та же сторона, а обмен ключами запрещен.

Фон

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

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

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

Поскольку открытые ключи могут свободно распространяться, два человека могут обмениваться личными сообщениями по небезопасному каналу без предварительного согласования ключа. Однако асимметричное шифрование намного медленнее, поэтому его обычно используют для шифрования или выполнения симметричного ключа ».ключевое соглашение " для симметричного шифра. SSL и большинство криптографических протоколов проходят через рукопожатие, где асимметричное шифрование используется для настройки симметричного ключа, который используется для защиты остальной части разговора.

Позволять's формализовать вашу проблему, чтобы лучше изучить ее.

Позволятьk быть ключом из набора K возможных ключей, и(w, x, y) часть информации из набора I, которая нам нужна для шифрования. Позволять'S определить набор "Crypted-сообщения» как A8где A - алфавит, из которого мы извлекаем символы в наше зашифрованное сообщение (A = {0, 1, ..., 9, a, b, ..., z, ...}, в зависимости от ваших спецификаций, как вы сказали).

Мы определим две функции:

crypt: I * K --> A^8.
decrypt A^8 * K --> I

Проблема здесь заключается в том, что размер набора зашифрованных сообщений A ^ 8 может быть меньше, чем набор фрагментов информации (w, x, y). Если это так, просто невозможно достичь того, что вы ищете, если мы не попробуем что-то другое ...

Позволять'скажем, что только ВЫ (или ваш сервер, или ваше приложение на вашем сервере) должны иметь возможность рассчитывать (w, x, y) по z. То есть вы можете отправитьz кому-то, а ты невсе равно, что они не смогут расшифровать его.

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

Id: char[8]
CryptedInformation: byte[]

Затем вы будете хранитьz в столбце Id и зашифрованная информация в соответствующем столбце.

Когда вам нужно расшифровать информацию, кто-то даст вамz, индекс зашифрованной информации, а затем вы можете приступить к расшифровке.

Однако, если это работает для вас, вам может даже не понадобиться шифровать информацию, у вас может быть таблица:

Id: char[8]
Integer: int
Username: char[]
Timestamp: DateTime

И использовать тот же метод, ничего не шифруя.

Это может быть применено ксистема проверки электронной почты " на процесс подписки, например. Ссылка, которую вы отправите пользователю по почте, будет содержать.z

Надеюсь это поможет.

 jskulski26 авг. 2009 г., 00:39
Спасибо за оформление. Спасибо за информацию, но я пытаюсь избежать таблицы поиска.

Хеширование по определению является только одним способом, после хеширования очень трудно вернуть исходное значение снова.

Для 2-х стороннего шифрования я бы посмотрел на TripleDES, который .net запек сразуTripleDESCryptoServiceProvider.

Довольно прямолинейная статья о реализации.

РЕДАКТИРОВАТЬ

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

 Matthew Vines25 авг. 2009 г., 22:13
Я думал, что это то, что я сказал, Хэши - это 1 способ, а не 2, но я вижу, как ты это получил, яПересмотрю
 erickson25 авг. 2009 г., 22:35
Да, извините, я, должно быть, неправильно прочитал это, "хэши - один из способов сделать это ". В любом случае этотеперь очень ясно.
 erickson25 авг. 2009 г., 22:11
Хеши нетак. Оригинал w, x и y выигралне подлежит восстановлению после хеширования (если хеш не сломан).

Вы, вероятно, можетет.

Позволять'скажем, что w - 32 бита, x поддерживает не менее 8 символов ASCII без учета регистра, поэтому не менее 37 бит, а y - 32 бита (возвращает вас к 2038, а 31 бит - нет)Т даже до тебя).

Чтобы'в общей сложности не менее 101 бита данных. Вы'пытаемся сохранить его в 8-значном номере. Это'математически невозможно создать обратимую функцию из большего набора в меньший набор, поэтому вынужно хранить более 12,5 бит на "цифра».

Конечно, если вы перейдете к более чем 8 символам или если ваши символы будут 16-битными юникодами, то вы 'по крайней мере, с шансом.

 jskulski26 авг. 2009 г., 00:33
8 символов это жесткое требование, которое яБоюсь. Но это действительно единственное требование.
 gotofritz05 февр. 2015 г., 19:29
 Это'С математической точки зрения невозможно создать обратимую функцию из большего набора в меньший набор: isn 'Т то, что делает сжатие?
 Steve Jessop05 февр. 2015 г., 23:38
@gotofritz: нет, это не такт. Рассмотрим, например, набор всех возможных файлов 10k, их 2 ^ 10240. Ваш алгоритм сжатия сопоставляет их с одинаковым числом (2 ^ 10240) разных сжатых файлов. Некоторые из них меньше 10 КБ, некоторые больше.
 Jonathan Leffler26 авг. 2009 г., 00:48
@jskulski: Учитывая жесткое ограничение в 8 символов, нужно надеяться, что w достаточно мало, чтобы его можно было зашифровать в 8 байтов; забудьте x и y, потому что они не подходят.>

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

Целое число составляет 4 байта. Позволять'Предполагается, что ваше имя пользователя ограничено 8 символами, а символы являются байтами. Тогда отметка времени составляет как минимум еще 4 байта. Тот'с 16 байтов прямо там. В шестнадцатеричном формате это займет 32 цифры. Base36 или что-то будет меньше, но этоне будет около 8.

 jskulski26 авг. 2009 г., 00:38
В этом есть смысл. А если мы отбросим требование и захотим использовать только X (10-битное целое число без знака - столбец mysql id)?

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

Если вы действительно хотите сделать то, что вы описали, вы должны просто объединить строку и временную метку (заполните лишние пробелы подчеркиванием или чем-то еще). Возьмите эту результирующую строку, преобразуйте ее в ASCII или UTF-8 или что-то еще, и найдите ее значение по модулю наибольшего простого числа меньше 10 ^ 8.

 jskulski26 авг. 2009 г., 00:27
Нет, это не для паролей.
Решение Вопроса

Вам просто нужно зашифровать сериализацию (w, x, y) с помощью закрытого ключа. Используйте тот же закрытый ключ, чтобы расшифровать его.

В любом случае размер z не может быть просто ограничен, как вы, так как он зависит от размера сериализации (так как он должен быть двухсторонним,s ограничение на сжатие вы можете сделать, в зависимости от энтропии).

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

РЕДАКТИРОВАТЬ: Поскольку размер z является жестким ограничением, вам необходимо ограничить ввод до 8 байтов и выбрать метод шифрования, который использует 64-битный (или менее) размер блока.Blowfish а такжеТройной DES использовать 64-битные блоки, но помните, что эти алгоритмы нене получить такое же пристальное внимание, какAES.

Если вы хотите что-то действительно простое и совершенно небезопасное, простоxor Ваш ввод с секретным ключом.

 Jonathan Leffler26 авг. 2009 г., 00:46
Если размер z является жестким ограничением (как указано), то w должно быть достаточно маленьким, чтобы помещаться в 8 байтов, а x и y должны быть забыты. Эта информация не была доступна вам в то время, когда вы ответили. +1 за "Это н'хеш, который вы хотите ".
 tonfa26 авг. 2009 г., 01:44
@ Джонатан Я отредактировал пост, чтобы отразить его, спасибо.

Ваш ответ на вопрос