ademosh

8=,WIP2

Apr 10th, 2020
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.32 KB | None | 0 0
  1. //Колличество раундов проверки простоты числа
  2. let roundCount=1000;
  3.  
  4.  
  5. //factoryfunction, которая будет создавать объект с параметром "символ" и параметром "код"
  6. //тем самым давая возможность достаточно просто добавлять новые символы в алфавит сразу
  7. //вместе с их кодом
  8. const alphaFactory= (symbol,code) => {
  9. return {
  10. symbol,
  11. code
  12. }
  13. }
  14.  
  15. //не самая удачная, но наиболее наглядная инициализация алфавита с использованием
  16. //описанной ранее функции
  17. let alpha=[];
  18. alpha.push(alphaFactory('а','10'));
  19. alpha.push(alphaFactory('б','11'));
  20. alpha.push(alphaFactory('в','12'));
  21. alpha.push(alphaFactory('г','13'));
  22. alpha.push(alphaFactory('д','14'));
  23. alpha.push(alphaFactory('е','15'));
  24. alpha.push(alphaFactory('ё','16'));
  25. alpha.push(alphaFactory('ж','17'));
  26. alpha.push(alphaFactory('з','18'));
  27. alpha.push(alphaFactory('и','19'));
  28. alpha.push(alphaFactory('й','20'));
  29. alpha.push(alphaFactory('к','21'));
  30. alpha.push(alphaFactory('л','22'));
  31. alpha.push(alphaFactory('м','23'));
  32. alpha.push(alphaFactory('н','24'));
  33. alpha.push(alphaFactory('о','25'));
  34. alpha.push(alphaFactory('п','26'));
  35. alpha.push(alphaFactory('р','27'));
  36. alpha.push(alphaFactory('с','28'));
  37. alpha.push(alphaFactory('т','29'));
  38. alpha.push(alphaFactory('у','30'));
  39. alpha.push(alphaFactory('ф','31'));
  40. alpha.push(alphaFactory('х','32'));
  41. alpha.push(alphaFactory('ц','33'));
  42. alpha.push(alphaFactory('ч','34'));
  43. alpha.push(alphaFactory('ш','35'));
  44. alpha.push(alphaFactory('щ','36'));
  45. alpha.push(alphaFactory('ъ','37'));
  46. alpha.push(alphaFactory('ы','38'));
  47. alpha.push(alphaFactory('ь','39'));
  48. alpha.push(alphaFactory('э','40'));
  49. alpha.push(alphaFactory('ю','41'));
  50. alpha.push(alphaFactory('я','42'));
  51. alpha.push(alphaFactory('0','43'));
  52. alpha.push(alphaFactory('1','44'));
  53. alpha.push(alphaFactory('2','45'));
  54. alpha.push(alphaFactory('3','46'));
  55. alpha.push(alphaFactory('4','47'));
  56. alpha.push(alphaFactory('5','48'));
  57. alpha.push(alphaFactory('6','49'));
  58. alpha.push(alphaFactory('7','50'));
  59. alpha.push(alphaFactory('8','51'));
  60. alpha.push(alphaFactory('9','52'));
  61.  
  62.  
  63.  
  64.  
  65. //Необходимые функции
  66.  
  67. //Данная функция по введенному p вернет оптимальное кол-во символов в одном блоке
  68. //что необходимо для оптимизации работы программы и корректной ее работы
  69. const blocksLength = number => {
  70. let count=1;
  71. number=Math.trunc(number/10);
  72. while (number>0) {
  73. count++;
  74. number=Math.trunc(number/10);
  75. }
  76. return count-1;
  77. }
  78. console.log(blocksLength(95617));
  79.  
  80.  
  81. //функция представления числа x как 2^buf*t, необходима для теста Миллера-Рабина
  82. const breakeNumber = number => {
  83. let buf=0;
  84. while (number%2===0) {
  85. buf++;
  86. number=number/2;
  87. }
  88. return [buf,number]; //buf - степень двойки s, t; number - t
  89. }
  90. const genRand = (min,max) => {
  91. return Math.floor(Math.random()*(max-min)+min);
  92. }
  93.  
  94.  
  95. //Функция для возведения в степень по модулю
  96. const powMod = (number,pow, mod) => {
  97. let c=1;
  98. for (let i=1;i<=pow;++i) {
  99. c=(c*number)%mod;
  100. }
  101. return c;
  102. }
  103.  
  104. //тест Миллера-Рабина
  105. const checkSimple = (n,roundCount) => {
  106. if (n===2||n===3) {
  107. return true;
  108. }
  109. if (n<2||n%2==0) {
  110. return false;
  111. }
  112. let s=breakeNumber(n-1)[0];
  113. let t=breakeNumber(n-1)[1];
  114. for (let i=0;i<roundCount;++i) {
  115. let a=genRand(2,n-2);
  116. let x=powMod(a,t,n);
  117. if (x===1||x===n-1) {
  118. continue;
  119. }
  120. for (let r=0;r<s;r++) {
  121. x=(x*x)%n;
  122. if (x==n-1) break;
  123. }
  124. if (x!=n-1) return false;
  125. }
  126. return true;
  127. }
  128. //Функция, которая будет возвращать первообразный корень, либо -1 в случае его отсутствия
  129. const findSqrt=p => {
  130. let fact =[];
  131. let phi=p-1;
  132. let n=phi;
  133. for (let i=2;(i*i)<=n;++i) {
  134. if (n%i==0) {
  135. fact.unshift (i);
  136. while (n%i==0) {
  137. n=n/i;
  138. }
  139. }
  140. }
  141. if (n>1) {
  142. fact.unshift(n);
  143. }
  144. for (let res=2;res<=p;res++) {
  145. let ok=true;
  146. for (let i=0;(i<fact.length&&ok);i++) {
  147. if (powMod(res,phi/fact[i],p)!=1) {
  148. ok=true;
  149. } else {
  150. ok=false;
  151. }
  152. }
  153. if (ok) return res;
  154. }
  155. return -1;
  156. }
  157.  
  158.  
  159. //функция берет на вход строку, проходится по каждому символу и выводит
  160. //представление только указанных в заднии символов входой строки в
  161. //цифровую форму
  162. const codeMessage = (message) => {
  163. let outputString=[];
  164. for (let i=0;i<message.length;++i) {
  165. let buf=message[i];
  166. console.log(buf);
  167. for (let j=0;j<alpha.length;++j) {
  168. if (alpha[j].symbol===buf) {
  169. outputString+=alpha[j].code;
  170. }
  171. }
  172. }
  173. return outputString;
  174. }
  175.  
  176.  
  177. //НОД
  178. const gcd=(a,b) => {
  179. if (b==0) return a;
  180. return gcd(b,a%b);
  181. }
  182.  
  183. const getK = (P) => {
  184. let buf=Math.floor(Math.random()*P);
  185. while (gcd(P,buf)!=1) {
  186. buf=Math.floor(Math.random()*P);
  187. }
  188. return buf;
  189. }
  190.  
  191. const makeBlock = (r,e) => {
  192. return r+","+e+" ";
  193. }
  194. //Следующие 2 функции будут искать кол-во цифер в числах r и e, чтобы корректно
  195. //извлечь их из криптограммы
  196. const findR = string => {
  197. let temp=",";
  198. let count=0;
  199. while (string[count]!=temp) {
  200. count++;
  201. }
  202. return count;
  203. }
  204.  
  205. const findE = string => {
  206. let temp=" ";
  207. let count=0;
  208. while (string[count]!=temp) {
  209. count++;
  210. }
  211. return count;
  212. }
  213.  
  214. //Основная часть
  215.  
  216.  
  217. //Сообщение инициализируется тут
  218. let message="2 2 а б р к а д а б р а";
  219. let m=15;
  220. //вводим p
  221. let p=96157;
  222.  
  223.  
  224. if (!checkSimple(p)) {
  225. console.log(`Ошибка: введенное p является составным`)
  226. } else {
  227. //Перевод символов открытого текста в цифровую форму
  228. let messageCoded=codeMessage(message);
  229. console.log(messageCoded);
  230. //для данного P находим первобразный корень
  231. let g;
  232. g=findSqrt(p);
  233. console.log(`g=${g} p=${p}`);
  234.  
  235. //Создаем двух пользователей, если режим шифрования, и вводим секретные ключи пользователей
  236. //если режим дешифрования
  237.  
  238. //Первый пользователь
  239. let c1=genRand(2,p-3);
  240. let d1=powMod(g,c1,p);
  241. //Второй пользователь
  242. let c2=genRand(2,p-3);
  243. let d2=powMod(g,c2,p);
  244. //шифрование
  245. let cryptogramm="";
  246.  
  247. while (messageCoded.length>0) {
  248. let temp=messageCoded.slice(0,blocksLength(p));
  249. messageCoded=messageCoded.substring(blocksLength(p));
  250. console.log(`До кодировки=${temp}`);
  251. console.log(messageCoded);
  252. let k=getK(p-3);
  253. let r=powMod(g,k,p);
  254. let e=(temp*powMod(d2,k,p))%p;
  255. console.log(`r=${r} e=${e}`);
  256. cryptogramm=cryptogramm+makeBlock(r,e);
  257. //cryptogramm+=',';
  258. ///cryptogramm+=e;
  259. //cryptorramm+=' ';
  260. }
  261. console.log(cryptogramm);
  262.  
  263.  
  264. //Дешифровани
  265. let openTextDigital="";
  266. while (cryptogramm.length>3) {
  267. let r=cryptogramm.substring(0,findR(cryptogramm));
  268. cryptogramm=cryptogramm.substring(findR(cryptogramm)+1);
  269. let e=cryptogramm.substring(0,findE(cryptogramm));
  270. cryptogramm=cryptogramm.substring(findE(cryptogramm)+1);
  271. let m=(e*powMod(r,p-1-c2,p))%p;
  272. console.log(`r=${r} e=${e} m=${m}`);
  273. openTextDigital+=m;
  274. }
  275. console.log(openTextDigital);
  276. let openText="";
  277. while (openTextDigital.length>0) {
  278. let temp=openTextDigital.substring(0,2);
  279. openTextDigital=openTextDigital.substring(2);
  280. for (let i=0;i<alpha.length;++i) {
  281. if (alpha[i].code==temp) {
  282. openText=openText+alpha[i].symbol;
  283. }
  284. }
  285. }
  286. console.log(openText);
  287. }
Add Comment
Please, Sign In to add comment