Как зашифровать строку текста, чтобы зашифрованная строка каждый раз отличалась, даже если значение одинаково - PullRequest
5 голосов
/ 30 января 2012

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

Например, если я зашифрую текст "FooBar" в два отдельных раза,Я хочу, чтобы зашифрованная строка каждый раз выглядела по-разному, как бы я поступил так?

Кроме того, какой самый безопасный тип шифрования я могу использовать для этого?

Я хочуиспользовать C # с .Net, если это возможно, но я полный нуб шифрования!

Спасибо

Ответы [ 6 ]

10 голосов
/ 30 января 2012

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

Это чрезвычайно распространенное требование.

Каждый ответ пока говорит, что используется соль . Это неверно , как вы могли бы знать, если бы прочитали первое предложение на странице Википедии по теме:

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

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

То, что вы хотите, это вектор инициализации .

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

Вы мудро указываете:

Я полный нуб шифрования!

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

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

Мой совет: наймите специалиста для решения вашей конкретной проблемы. Чтобы узнать о криптографии, начните с некоторых вводных текстов, таких как «Прикладная криптография», чтобы понять, какие проблемы крипто действительно решает и как эффективно их использовать. Crypto - это не волшебная фея пыли, которую вы брызгаете на данные, чтобы обеспечить их безопасность; это только одна маленькая часть всей стратегии защиты данных от атак.

4 голосов
/ 30 января 2012

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

Обдумайте следующий подход:

Впервые вы можете зашифровать «FooBar» как есть.,давайте предположим, что его шифрование равно X.

Во второй раз вы можете зашифровать "FooBar" как"FooBar" (обратите внимание на пробел), используя ту же соль, что приведет кшифрование равно Y из-за изменений в строке.

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

Это приведет кдругое шифрование для той же (виртуально) строки.

3 голосов
/ 30 января 2012

Соль предпочтительна, но достаточно добавить небольшой кусочек текста:

static int count = 0;

string textToSend = ...;
string textToEncryp =  count.ToString("D4") + "." textToSend;  // prefix with "0021."
count++;

// encryp + decrypt

string decryptedText = ...;
string receivedText = decryptedText.Copy(5);  // remove "0021."
3 голосов
/ 30 января 2012

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

1 голос
/ 30 января 2012

Для шифрования с помощью C # см .: http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider.aspx.

Если вы хотите сохранить пароль, это говорит об этом.https://stackoverflow.com/a/1054033/939213

0 голосов
/ 30 января 2012

Вы можете использовать DateTime.Now.Ticks как соль.

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