Автор Тема: Шифрование с открытым ключом  (Прочитано 4156 раз)

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Шифрование с открытым ключом
« : Декабрь 26, 2012, 03:31:30 pm »
Привет,
мне нужна ваша помощь в основах шифрования, поскольку для меня это несколько новая тема. Знаю, что надо читать статьи, но время поджимает.

Имеются два сервера, между которыми передаётся сообщение (транзакция). Требуется удостовериться в том, что сервер второй стороны получил исконное сообщение и затем полученное ответное сообщение с результатом выполнения операции является именно сообщением доверенного сервера второй стороны.

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

Поясните какими ключами (открытым, закрытым) и на каком этапе как шифруется и как проверяется подпись.

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Шифрование с открытым ключом
« Ответ #1 : Декабрь 26, 2012, 03:45:31 pm »
Смотрите. Чтобы подписать сообщение, Вы берёте хэш от него, шифруете его своим закрытым ключом и прикладываете к сообщению.
Любой, у кого есть открытый ключ на Вас, может убедиться, что Вы отправляли сообщение именно с этим хэшем (потому что только Вы могли зашифровать его своим закрытым ключом).

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Шифрование с открытым ключом
« Ответ #2 : Декабрь 26, 2012, 03:48:21 pm »
Это если нужно только подписать сообщение, а отправлять его открытым текстом.

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

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Шифрование с открытым ключом
« Ответ #3 : Декабрь 28, 2012, 01:16:04 pm »
Для шифрования и дешифрования нужна функция PowerMod[m,e,n] = m^e (mod n), где m, e, n - очень большие целые числа.

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

Вот программка на Mathematica 8 генерирующая ключи для RSA с примером шифрования и дешифрования:

(* Генерируем простое число размером bitsCount разрядов *)
MyRandomPrime[bitsCount_] := NextPrime[RandomInteger[{2^(bitsCount-1),2^bitsCount}]];

(* Генерируем один из вариантов ключей. Вариант может быть неудачным *)
GenerateRandomKeyVariant[bitsCount_] := Module[{p,q,e,n,d,f,x,k},
  p = MyRandomPrime[bitsCount/2];
  q = MyRandomPrime[bitsCount/2];
  e = MyRandomPrime[bitsCount];
  n = p q;
  f = (p-1) (q-1);
  {x,{d,k}} = ExtendedGCD[e,f];
  Return[{p,q,e,n,d,f,k}];
];

(* Генерируем ключи. Просто перебираем варианты до первого удачного. *)
GenerateKey[bitsCount_]:=Module[{p,q,e,n,d,f,k},
  {p,q,e,n,d,f,k} = GenerateRandomKeyVariant[bitsCount];
  While[d<0,{p,q,e,n,d,f,k} = GenerateRandomKeyVariant[bitsCount];];
  Return[{e,n,d}];
];

(* Пример использования. Генерируем ключи длиной 256 разрядов*)
{e,n,d} = GenerateKey[256]

(* Получаем что-то вот такое: *)
{106474780081756000849443530376385002811553039013608684548473063572334466703629,
59222289060328681086701519045552968082786829153713768742253207685947641051833,
191011303451374405811626717837027403073810972106220097519518873217160081729}

(* Процедуры шифрования и дешифрования.*)
Encrypt[m_] := PowerMod[m,e,n];
Decrypt[s_] := PowerMod[s,d,n];

(* Проверяем *)
Encrypt[Decrypt[1234567890]] == 1234567890
Decrypt[Encrypt[1234567890]] == 1234567890

True
True

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

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Шифрование с открытым ключом
« Ответ #4 : Декабрь 28, 2012, 01:30:48 pm »
Если будете использовать готовенькое стороннее ПО для RSA, то можете получить сюрприз. Оно может генерировать некриптостойкие наборы ключей, а со сторонними ключами отказываться работать.

Например в микрософтовском дотнете есть готовенькие классы для работы с RSA. Однако ключики, которые они генерируют "особенные". В США законы какие-то есть на счёт криптостойкости. Ежели ключи сгенерировать самому, то микрософтовские RSA классы откажутся с ними работать (мол этот ключ не был сгенерирован нами).

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Шифрование с открытым ключом
« Ответ #5 : Декабрь 28, 2012, 01:44:38 pm »
Если будете использовать готовенькое стороннее ПО для RSA, то можете получить сюрприз. Оно может генерировать некриптостойкие наборы ключей, а со сторонними ключами отказываться работать.

Например в микрософтовском дотнете есть готовенькие классы для работы с RSA. Однако ключики, которые они генерируют "особенные". В США законы какие-то есть на счёт криптостойкости. Ежели ключи сгенерировать самому, то микрософтовские RSA классы откажутся с ними работать (мол этот ключ не был сгенерирован нами).
У нас тоже соответствующие законы есть. ГОСТовское шифрование считается кошерным только с определенным сетом ключей, которые генерятся соотв.  органами.
Y = λf.(λx.f (x x)) (λx.f (x x))

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Шифрование с открытым ключом
« Ответ #6 : Декабрь 29, 2012, 02:04:48 am »
В первую очередь "фишка" в таблицах перемешивания.
Знают, какие таблицы перемешивания хорошие, только компетентные органы :)

Как мне объяснили, если я захочу сертифицировать своё крипто-ПО (а в России нет криптографии, кроме ГОСТ - кроме того, если я получу лицензию на криптографию, то я должен буду удовлетворять правилу "предприятие не должно использовать несертифицированного крипто-ПО" - т.е. не разрабатывать чего-то другого), то мои таблицы будут оценивать и говорить - "удовлетворяет - не удовлетворяет". Чтобы получить доступ к критериям стойкости, нужно получить форму допуска (кажется, 3-ей будет мало, нужно 2-ю).