Oberon space
General Category => Общий раздел => Тема начата: Romiras от Декабрь 26, 2012, 03:31:30 pm
-
Привет,
мне нужна ваша помощь в основах шифрования, поскольку для меня это несколько новая тема. Знаю, что надо читать статьи, но время поджимает.
Имеются два сервера, между которыми передаётся сообщение (транзакция). Требуется удостовериться в том, что сервер второй стороны получил исконное сообщение и затем полученное ответное сообщение с результатом выполнения операции является именно сообщением доверенного сервера второй стороны.
Для этого, как я понимаю, нужно применять технологию шифрования с открытым ключом.
Итак, мой сервер должен зашифровать сообщение и поставить подпись. Имеется открытый ключ сервера второй стороны и известно, что сообщение должно шифроваться с помощью RSA-SHA1.
Поясните какими ключами (открытым, закрытым) и на каком этапе как шифруется и как проверяется подпись.
-
Смотрите. Чтобы подписать сообщение, Вы берёте хэш от него, шифруете его своим закрытым ключом и прикладываете к сообщению.
Любой, у кого есть открытый ключ на Вас, может убедиться, что Вы отправляли сообщение именно с этим хэшем (потому что только Вы могли зашифровать его своим закрытым ключом).
-
Это если нужно только подписать сообщение, а отправлять его открытым текстом.
Если нужно шифровать, то, собственно, нужно его зашифровать закрытым ключом вместе с хэшем (чтобы при расшировке проверять, правильно ли расшифровалось).
-
Для шифрования и дешифрования нужна функция 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 - приватный. Завист от того что требуется шифрование сообщения или подпись сообщения.
-
Если будете использовать готовенькое стороннее ПО для RSA, то можете получить сюрприз. Оно может генерировать некриптостойкие наборы ключей, а со сторонними ключами отказываться работать.
Например в микрософтовском дотнете есть готовенькие классы для работы с RSA. Однако ключики, которые они генерируют "особенные". В США законы какие-то есть на счёт криптостойкости. Ежели ключи сгенерировать самому, то микрософтовские RSA классы откажутся с ними работать (мол этот ключ не был сгенерирован нами).
-
Если будете использовать готовенькое стороннее ПО для RSA, то можете получить сюрприз. Оно может генерировать некриптостойкие наборы ключей, а со сторонними ключами отказываться работать.
Например в микрософтовском дотнете есть готовенькие классы для работы с RSA. Однако ключики, которые они генерируют "особенные". В США законы какие-то есть на счёт криптостойкости. Ежели ключи сгенерировать самому, то микрософтовские RSA классы откажутся с ними работать (мол этот ключ не был сгенерирован нами).
У нас тоже соответствующие законы есть. ГОСТовское шифрование считается кошерным только с определенным сетом ключей, которые генерятся соотв. органами.
-
В первую очередь "фишка" в таблицах перемешивания.
Знают, какие таблицы перемешивания хорошие, только компетентные органы :)
Как мне объяснили, если я захочу сертифицировать своё крипто-ПО (а в России нет криптографии, кроме ГОСТ - кроме того, если я получу лицензию на криптографию, то я должен буду удовлетворять правилу "предприятие не должно использовать несертифицированного крипто-ПО" - т.е. не разрабатывать чего-то другого), то мои таблицы будут оценивать и говорить - "удовлетворяет - не удовлетворяет". Чтобы получить доступ к критериям стойкости, нужно получить форму допуска (кажется, 3-ей будет мало, нужно 2-ю).