· 7 years ago · May 30, 2018, 04:40 PM
1#include "rsa.h"
2#include <math.h>
3//проверка: проÑтое ли чиÑло
4bool isPrime(unsigned short value)
5{
6 if (value == 1)
7 return false;
8
9 if (value == 2)
10 return true;
11
12 if (value % 2 == 0)
13 return false;
14
15 bool result = true;
16 for (int i = 3; i <= sqrt((float)value); i++)
17 {
18 if (value % i == 0)
19 result = false;
20 }
21
22 return result;
23}
24//получение ÐОД
25unsigned short getGreatestCommonDivider(unsigned short firstNumber, unsigned short secondNumber)
26{
27 while (secondNumber != 0)
28 {
29 int temp = firstNumber % secondNumber;
30 firstNumber = secondNumber;
31 secondNumber = temp;
32 }
33 return firstNumber;
34}
35//вычиÑление мультипликативного инверÑного
36unsigned short getMultiplyInverse(unsigned short value, unsigned short mod)
37{
38 int a = mod;
39 int b = value;
40 int x0 = 1, x1 = 0;
41 int y0 = 0, y1 = 1;
42
43 while (b > 1)
44 {
45 int q = a / b;
46 int temp = a % b;
47 int x2 = x0 - q * x1;
48 int y2 = y0 - q * y1;
49 a = b;
50 b = temp;
51 x0 = x1;
52 x1 = x2;
53 y0 = y1;
54 y1 = y2;
55 }
56
57 if (y1 < 0)
58 y1 += mod;
59
60 return y1;
61}
62//вычиÑление закрытого ключа
63unsigned short getKey(unsigned short p, unsigned short q, unsigned short key)
64{
65 unsigned short eilerR = (p - 1) * (q - 1);
66 return getMultiplyInverse(key, eilerR);
67}
68//быÑтрое возведение в Ñтепень
69int getFastExp(unsigned long long value, unsigned short power, unsigned short mod)
70{
71 unsigned long long result = 1;
72 while (power != 0)
73 {
74 while (power % 2 == 0)
75 {
76 power = power / 2;
77 value = (value * value) % mod;
78 }
79 power -= 1;
80 result = (result * value) % mod;
81 }
82
83 return result;
84}
85//поиÑк делителÑ
86unsigned short getDivider(unsigned short value)
87{
88 if (value == 1)
89 return 1;
90
91 unsigned short result = 2;
92 while (!(value % result == 0 && isPrime(value / result) && isPrime(result)) && result <= value / 2)
93 {
94 result++;
95 }
96
97 if (result > value / 2)
98 result = value;
99
100 return result;
101}
102//шифрование
103unsigned short getCipher(unsigned short value, unsigned short p, unsigned short q, unsigned short secretKey)
104{
105 unsigned short r = p * q;
106 unsigned short publicKey = getKey(p, q, secretKey);
107 return getFastExp(value, publicKey, r);
108}
109//дешифрование
110unsigned short getPlain(unsigned short value, unsigned short r, unsigned short key)
111{
112 return getFastExp(value, key, r);
113}