- В этой рассылке рассказывается об одном из наиболее популярных методов защиты базы данных открытым ключом RSA, названый так по начальным буквам фамилий ее изобретателей (Rivest, Shamir and Adleman). Возникает вопрос, а надо ли еще "городить" новый вариант защиты, когда уже есть встроенные системы защиты в Access, такие как, ограничение доступа к объектам базы данных на основе пароля или системного файла system.mdw.
Ответ однозначный - необходимо, т.к. из-за высокой популярности использования Access файлов, все больше специалистов пытаются определить структуру mdb файла (см. AccessRecovery или la_prot.mdb). Cледовательно нет 100% уверенности, что не появится программа, которая прочитает ваши данные. Таким образом, попробуем разобраться в алгоритме RSA, чтобы потом применить его к защите полей вашей базы данных. В RSA используется для шифрования один ключ, а для расшифровки другой. Первый ключ не является секретным и может быть известен всем, кто работает с базой данных.
- Очевидные факторы алгоритма :
- • расшифровать данные с помощью известного ключа невозможно;
• ключ расшифровки не может быть определен из ключа шифрования; • ключи должны иметь очень большую величину;
- Определим термины, которые встречаются при описании алгоритма:
- • простое число - это такое, которое может делится только на 1 и на само себя;
• взаимно простые числа - это числа не имеющие ни одного общего делителя кроме 1; • i mod j - деление по модулю; • i ^ j - возведение в степень j числа i;
- Описание алгоритма RSA. В скобках дан пример вычислений в цифрах.
- 1. Возьмем два простых числа A и B. [3 и 11]
2. Определим c=A*B [33] 3. Выберем число d [3] взаимно простое с выражением (A-1)*(B-1) [20] 4. Найдем число e [7], чтобы (e*d) mod ((A-1)*(B-1))=1 5. Итак, e[7] и c[33] - открытый ключ d[3] и c[33] - секретный ключ Проверка алгоритма 6. Зашифруем число x[2] по формуле: p=(x^e) mod c [((2^7) mod 33)=29] 7. Расшифруем число p[29] по формуле: x=(p^d) mod c [((29^3) mod 33)=2]
-
- Выводы
- 1. Перед шифрованием надо разбить текст на блоки, а затем каждому из них дать определенное число. В примере выше использован простой случай, т.е. текст разбивается на символы, где число x имеет код 2.
2. Сам процесс зашифровки/расшифровки требует эффектных решений, т.к. если использовать стандартные математические операции для расчета, то уже для простых чисел 23 и 17 может возникнуть переполнение при возведении в степень. Как этого избежать и подобрать простые числа указано в файле: profi_prot1.mdb 3. Для проверки изложенного выше алгоритма используйте следующую программу (действует на малых числах):
-
Тестирование
- Private Sub funTestRSAencryption()
- Dim A As Long, B As Long, c As Long
Dim d As Long, e As Long, x As Long, p As Long '1. Возьмем два простых числа A и B. A = 3 B = 11 Debug.Print "A=" & A, "B=" & B '2. Определим c = A * B c = A * B Debug.Print "C=" & c '3. Выберем число d взаимно простое с выражением (A-1)*(B-1) d = 3 Debug.Print "Test1=" & (A - 1) * (B - 1) '4. Найдем число e, чтобы (e*d) mod ((A-1)*(B-1))=1 e = 7 Debug.Print "Test2=" & (e * d) Mod ((A - 1) * (B - 1)) '5. Выбираем символ x для шифрования x = 2 Debug.Print "X=" & x '6. Зашифруем число x по формуле: p=(x^e) mod c p = x ^ e Mod c Debug.Print "P=" & p '7. Расшифруем число p по формуле: x=(p^d) mod c x = (p ^ d) Mod c Debug.Print "X=" & x
- End Sub
P.S. В качестве дополнительного материала, я бы посоветовал прочитать книгу "Защита информации в персональных ЭВМ", Спесивцев, Вегнер, Крутяков, Серегин, Сидоров. Москва "РАДИО и СВЯЗЬ" 1992 год, стр. 39-41. Вот умная выдержка из этой книги Криптостойкость алгоритма RSA основывается на предположении, что исключительно трудно определить секретный ключ по известному, поскольку для этого необходимо решить задачу о существование делителей целого числа. Данная задача является NP – полной и, как следствие этого факта, не допускает в настоящие время эффектного (полиномиального) решения. Более того, сам вопрос существования эффективных алгоритмов решения NP – полных задач является до настоящего времени открытым. В связи с этим для чисел, состоящих из 200 цифр (а именно такие числа рекомендуются использовать), традиционные методы требуют выполнения огромного числа операций (около 10^23).
|