iЛаборатория » Blog Archive » Проба пера -> RSA шифрование на Java

Проба пера -> RSA шифрование на Java

1

Добрый день!

Как Вы, наверное, помните я в данный момент пытаюсь разобраться и вникнуть в язык программирования 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. А тут я приведу короткий алгоритм:

  1. Выбираем 2 случайных простых числа P и Q
  2. Вычисляем их произведение N (N = P*Q)
  3. Вычисляем значение функции Эйлера от N
  4. Выбираем целое число E, взаимно простое со значением из пункта 3 (открытая экспонента)
  5. Вычисляем число D, которое мультипликативно обратное к числу E по модулю из пункта 3 (секретная экспонента)
  6. Открытый ключ (E,N)
  7. Закрытый ключ (D,N)

Проблемы в моей реализации скорее всего связанны с 5 пунктом – буду разбираться.

Вот результат работы:

При условии что: шифруем число int равное: 11111. E = 3 – простое число Ферма.

Комментарии приветствуются ;)

С уважением, Главный Лаборант!

Советуем почитать:



2 комментария к записи “Проба пера -> RSA шифрование на Java”

  1. master, написал:

    Учи яву, может скоро скрипты будешь целые писать

    [Ответить на комментарий]

    Главный Лаборант ответил на комментарий:

    Я понимаю, что данный коммент размещен, только ради ссылки, которую я удалил, но все таки выскажусь:
    во-первых, на Java пишут программы, а на JS пишут скрипты, которые в то же время являются программами, отличие в том, что скрипты – это не компилируемый код, а интерпретируемый, если я ничего не путаю.
    во-вторых, я и так учу Java
    в-третьих, спасибо :)

    [Ответить на комментарий]


Оставить свой комментарий

XHTML: Вы можете использовать следующие теги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">