ademosh

8,WIP

Apr 9th, 2020
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.11 KB | None | 0 0
  1. let testN=100;
  2. let roundCount=1000;
  3. let message="абракадабра";
  4. let m=15;
  5.  
  6. const alphaFactory= (symbol,code) => {
  7. return {
  8. symbol,
  9. code
  10. }
  11. }
  12. let alpha=[];
  13. alpha.push(alphaFactory('й','10'));
  14. alpha.push(alphaFactory('ц','10'));
  15. alpha.push(alphaFactory('у','10'));
  16. alpha.push(alphaFactory('к','10'));
  17. alpha.push(alphaFactory('е','10'));
  18. alpha.push(alphaFactory('н','10'));
  19. alpha.push(alphaFactory('г','10'));
  20. alpha.push(alphaFactory('ш','10'));
  21. alpha.push(alphaFactory('щ','10'));
  22. alpha.push(alphaFactory('з','11'));
  23. alpha.push(alphaFactory('х','111'));
  24. alpha.push(alphaFactory('ъ','112'));
  25. alpha.push(alphaFactory('ф','113'));
  26. alpha.push(alphaFactory('ы','114'));
  27. alpha.push(alphaFactory('в','115'));
  28. alpha.push(alphaFactory('а','116'));
  29. alpha.push(alphaFactory('п','117'));
  30. alpha.push(alphaFactory('р','118'));
  31. alpha.push(alphaFactory('о','119'));
  32. alpha.push(alphaFactory('л','120'));
  33. alpha.push(alphaFactory('д','121'));
  34. alpha.push(alphaFactory('ж','122'));
  35. alpha.push(alphaFactory('э','123'));
  36. alpha.push(alphaFactory('я','124'));
  37. alpha.push(alphaFactory('ч','125'));
  38. alpha.push(alphaFactory('с','126'));
  39. alpha.push(alphaFactory('м','127'));
  40. alpha.push(alphaFactory('и','128'));
  41. alpha.push(alphaFactory('т','129'));
  42. alpha.push(alphaFactory('ь','130'));
  43. alpha.push(alphaFactory('б','131'));
  44. alpha.push(alphaFactory('ю','132'));
  45. alpha.push(alphaFactory('ё','133'));
  46.  
  47.  
  48. //Необходимые функции
  49. const breakeNumber = number => {
  50. let buf=0;
  51. while (number%2===0) {
  52. buf++;
  53. number=number/2;
  54. }
  55. return [buf,number]; //buf - степень двойки s, t; number - t
  56. }
  57. const genRand = (min,max) => {
  58. return Math.floor(Math.random()*(max-min)+min);
  59. }
  60. //Функция для возведения в степень по модулю
  61. const powMod = (number,pow, mod) => {
  62. let c=1;
  63. for (let i=1;i<=pow;++i) {
  64. c=(c*number)%mod;
  65. }
  66. return c;
  67. }
  68.  
  69.  
  70. const checkSimple = (n,roundCount) => {
  71. if (n===2||n===3) {
  72. return true;
  73. }
  74. if (n<2||n%2==0) {
  75. return false;
  76. }
  77. let s=breakeNumber(n-1)[0];
  78. let t=breakeNumber(n-1)[1];
  79. for (let i=0;i<roundCount;++i) {
  80. let a=genRand(2,n-2);
  81. let x=powMod(a,t,n);
  82. if (x===1||x===n-1) {
  83. continue;
  84. }
  85. for (let r=0;r<s;r++) {
  86. x=(x*x)%n;
  87. if (x==n-1) break;
  88. }
  89. if (x!=n-1) return false;
  90. }
  91. return true;
  92. }
  93. //Две следующие функции выполняют проверку на первообразныйй корень
  94. const findSqrt=p => {
  95. let fact =[];
  96. let phi=p-1;
  97. let n=phi;
  98. for (let i=2;(i*i)<=n;++i) {
  99. if (n%i==0) {
  100. fact.unshift (i);
  101. while (n%i==0) {
  102. n=n/i;
  103. }
  104. }
  105. }
  106. if (n>1) {
  107. fact.unshift(n);
  108. }
  109. for (let res=2;res<=p;res++) {
  110. let ok=true;
  111. for (let i=0;(i<fact.length&&ok);i++) {
  112. if (powMod(res,phi/fact[i],p)!=1) {
  113. ok=true;
  114. } else {
  115. ok=false;
  116. }
  117. }
  118. if (ok) return res;
  119. }
  120. return -1;
  121. }
  122.  
  123.  
  124.  
  125. const codeMessage = (message) => {
  126. let outputString=[];
  127. for (let i=0;i<message.length;++i) {
  128. let buf=message[i];
  129. console.log(buf);
  130. for (let j=0;j<alpha.length;++j) {
  131. if (alpha[j].symbol===buf) {
  132. outputString+=alpha[j].code;
  133. }
  134. }
  135. }
  136. return outputString;
  137. }
  138.  
  139.  
  140. //НОД
  141. const gcd=(a,b) => {
  142. if (b==0) return a;
  143. return gcd(b,a%b);
  144. }
  145.  
  146. const getK = (P) => {
  147. let buf=Math.floor(Math.random()*P);
  148. while (gcd(P,buf)!=1) {
  149. buf=Math.floor(Math.random()*P);
  150. }
  151. return buf;
  152. }
  153.  
  154. //Основная часть
  155. //Кодировка символов
  156. console.log(codeMessage(message));
  157. console.log(alpha);
  158. //Генерируем большое просто число больше сотки с проверкой на простоту
  159. //Далее для него же находим первообразную в том же
  160. let g,p;
  161. while (typeof(g)==='undefined'||typeof([p])==='undefined') {
  162. p=genRand(8000,100000);
  163. //цикл, находящий простое большое P
  164. while (!checkSimple(p,100)) {
  165. p++;
  166. console.log(p);
  167. console.log(checkSimple(p,100));
  168. }
  169. g=findSqrt(p);
  170. }
  171. console.log(`g=${g} p=${p}`);
  172. //Данный модуль будет получать случайное значение P в пределах от 80000
  173. //до 200000 и, если число не простой, найдет ближайшее большее простое число
  174. //затем будет извлечен первообразный корень A из этого числа, отвечающий требованию
  175. //суть различности по модулю P
  176. //console.log(checkSimple(96157,1000))
  177. ///Первый пользователь
  178. let c1=genRand(2,p-3);
  179. let d1=powMod(g,c1,p);
  180. //Второй пользователь
  181. let c2=genRand(2,p-3);
  182. let d2=powMod(g,c2,p);
  183. //шифрование
  184. let k=getK(p-3);
  185. let r=powMod(g,k,p);
  186. let e=(m*powMod(d2,k,p))%p;
  187. console.log(`k= ${k}`);
  188. console.log(r);
  189. console.log(e);
  190. let md=(e*powMod(r,p-1-c2,p))%p;
  191. console.log(md);
Add Comment
Please, Sign In to add comment