Проба пера -> RSA шифрование на Java
Апр 17, 2010 Java, Программирование
Добрый день!
Как Вы, наверное, помните я в данный момент пытаюсь разобраться и вникнуть в язык программирования Java. В данный момент читаю одну замечательную книгу в которой все доступно объясняется и вот вчера, читая ее, подумал, что пора что-нибудь написать, хотя бы кривое и не оптимизированное, но мало мальски рабочее. По бродил по интернету и в который раз вышел на статью о криптографии и в частности методе RSA. Раньше у меня как то не очень получалось разобраться в данной теме, но вчера решил, что пора наконец-то хотя бы эти азы понять.
В итоге потратив пару часов на чтение Wiki, реализовал данный вид шифрования информации. В данный момент он не совсем рабочий, т.е. иногда почему-то дешифрует не правильно – с этим буду еще конечно разбираться, но “проба пера”, я считаю, успешна.
Прошу строго не судить мой код, так как это моя первая программа на Java. Вот и код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | import java.util.Random; public class RSA { private int RInteger() { Random rand = new Random(); int intRand = rand.nextInt(987); int R2 = intRand%2; int R3 = intRand%3; int R5 = intRand%5; int R7 = intRand%7; if((R2 > 0) && (R3 > 0) && (R5 > 0) && (R7 > 0)) { return intRand; }else{ return 0; } } public int FEler(int N) { int ret = 1, p; for(p = 2; p <= N; ++p) { if(N%p == 0) { N /= p; while(N%p == 0) { N /= p; ret *= p; } ret *= p - 1; } } return N > 1 ? ret * (N - 1) : ret; } private int Evklid(int a, int b) { while(b != 0) { int tmp = a%b; a = b; b = tmp; } return a; } public int Simple() { boolean varCheck = true; int ret = 0; while(varCheck) { if((ret = this.RInteger()) > 0) varCheck = false; } return ret; } public static void main(String args[]) { RSA r = new RSA(); int Q = r.Simple(); int P = r.Simple(); int N = P*Q; int fN = r.FEler(N); int E = 3; int D = r.Evklid(E, fN); int message = 11111; int shifr = (message^E % N); int deShifr = (shifr^D % N); System.out.println("Number Q: " + Q); System.out.println("Number P: " + P); System.out.println("Module N: " + N); System.out.println("Eler Function fN: " + fN); System.out.println("D: " + D); System.out.println("RSA go: " + shifr); System.out.println("deRSA go: " + deShifr); } } |
Алгоритм
С алгоритмом RSA можно более подробно ознакомиться на все той же, всеми любимой Wiki. А тут я приведу короткий алгоритм:
- Выбираем 2 случайных простых числа P и Q
- Вычисляем их произведение N (N = P*Q)
- Вычисляем значение функции Эйлера от N
- Выбираем целое число E, взаимно простое со значением из пункта 3 (открытая экспонента)
- Вычисляем число D, которое мультипликативно обратное к числу E по модулю из пункта 3 (секретная экспонента)
- Открытый ключ (E,N)
- Закрытый ключ (D,N)
Проблемы в моей реализации скорее всего связанны с 5 пунктом – буду разбираться.
Вот результат работы:

Комментарии приветствуются
С уважением, Главный Лаборант!
Советуем почитать:
Метки: Java, RSA, Пример, программирование




master, написал:
апреля 18, 2010 в 16:05
Учи яву, может скоро скрипты будешь целые писать
[Ответить на комментарий]
Главный Лаборант ответил на комментарий:
18 Апр 2010 в 16:39
Я понимаю, что данный коммент размещен, только ради ссылки, которую я удалил, но все таки выскажусь:
во-первых, на Java пишут программы, а на JS пишут скрипты, которые в то же время являются программами, отличие в том, что скрипты – это не компилируемый код, а интерпретируемый, если я ничего не путаю.
во-вторых, я и так учу Java
в-третьих, спасибо
[Ответить на комментарий]