Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- let testN=100;
- let roundCount=1000;
- let message="абракадабра";
- let m=15;
- const alphaFactory= (symbol,code) => {
- return {
- symbol,
- code
- }
- }
- let alpha=[];
- alpha.push(alphaFactory('й','10'));
- alpha.push(alphaFactory('ц','10'));
- alpha.push(alphaFactory('у','10'));
- alpha.push(alphaFactory('к','10'));
- alpha.push(alphaFactory('е','10'));
- alpha.push(alphaFactory('н','10'));
- alpha.push(alphaFactory('г','10'));
- alpha.push(alphaFactory('ш','10'));
- alpha.push(alphaFactory('щ','10'));
- alpha.push(alphaFactory('з','11'));
- alpha.push(alphaFactory('х','111'));
- alpha.push(alphaFactory('ъ','112'));
- alpha.push(alphaFactory('ф','113'));
- alpha.push(alphaFactory('ы','114'));
- alpha.push(alphaFactory('в','115'));
- alpha.push(alphaFactory('а','116'));
- alpha.push(alphaFactory('п','117'));
- alpha.push(alphaFactory('р','118'));
- alpha.push(alphaFactory('о','119'));
- alpha.push(alphaFactory('л','120'));
- alpha.push(alphaFactory('д','121'));
- alpha.push(alphaFactory('ж','122'));
- alpha.push(alphaFactory('э','123'));
- alpha.push(alphaFactory('я','124'));
- alpha.push(alphaFactory('ч','125'));
- alpha.push(alphaFactory('с','126'));
- alpha.push(alphaFactory('м','127'));
- alpha.push(alphaFactory('и','128'));
- alpha.push(alphaFactory('т','129'));
- alpha.push(alphaFactory('ь','130'));
- alpha.push(alphaFactory('б','131'));
- alpha.push(alphaFactory('ю','132'));
- alpha.push(alphaFactory('ё','133'));
- //Необходимые функции
- const breakeNumber = number => {
- let buf=0;
- while (number%2===0) {
- buf++;
- number=number/2;
- }
- return [buf,number]; //buf - степень двойки s, t; number - t
- }
- const genRand = (min,max) => {
- return Math.floor(Math.random()*(max-min)+min);
- }
- //Функция для возведения в степень по модулю
- const powMod = (number,pow, mod) => {
- let c=1;
- for (let i=1;i<=pow;++i) {
- c=(c*number)%mod;
- }
- return c;
- }
- const checkSimple = (n,roundCount) => {
- if (n===2||n===3) {
- return true;
- }
- if (n<2||n%2==0) {
- return false;
- }
- let s=breakeNumber(n-1)[0];
- let t=breakeNumber(n-1)[1];
- for (let i=0;i<roundCount;++i) {
- let a=genRand(2,n-2);
- let x=powMod(a,t,n);
- if (x===1||x===n-1) {
- continue;
- }
- for (let r=0;r<s;r++) {
- x=(x*x)%n;
- if (x==n-1) break;
- }
- if (x!=n-1) return false;
- }
- return true;
- }
- //Две следующие функции выполняют проверку на первообразныйй корень
- const findSqrt=p => {
- let fact =[];
- let phi=p-1;
- let n=phi;
- for (let i=2;(i*i)<=n;++i) {
- if (n%i==0) {
- fact.unshift (i);
- while (n%i==0) {
- n=n/i;
- }
- }
- }
- if (n>1) {
- fact.unshift(n);
- }
- for (let res=2;res<=p;res++) {
- let ok=true;
- for (let i=0;(i<fact.length&&ok);i++) {
- if (powMod(res,phi/fact[i],p)!=1) {
- ok=true;
- } else {
- ok=false;
- }
- }
- if (ok) return res;
- }
- return -1;
- }
- const codeMessage = (message) => {
- let outputString=[];
- for (let i=0;i<message.length;++i) {
- let buf=message[i];
- console.log(buf);
- for (let j=0;j<alpha.length;++j) {
- if (alpha[j].symbol===buf) {
- outputString+=alpha[j].code;
- }
- }
- }
- return outputString;
- }
- //НОД
- const gcd=(a,b) => {
- if (b==0) return a;
- return gcd(b,a%b);
- }
- const getK = (P) => {
- let buf=Math.floor(Math.random()*P);
- while (gcd(P,buf)!=1) {
- buf=Math.floor(Math.random()*P);
- }
- return buf;
- }
- //Основная часть
- //Кодировка символов
- console.log(codeMessage(message));
- console.log(alpha);
- //Генерируем большое просто число больше сотки с проверкой на простоту
- //Далее для него же находим первообразную в том же
- let g,p;
- while (typeof(g)==='undefined'||typeof([p])==='undefined') {
- p=genRand(8000,100000);
- //цикл, находящий простое большое P
- while (!checkSimple(p,100)) {
- p++;
- console.log(p);
- console.log(checkSimple(p,100));
- }
- g=findSqrt(p);
- }
- console.log(`g=${g} p=${p}`);
- //Данный модуль будет получать случайное значение P в пределах от 80000
- //до 200000 и, если число не простой, найдет ближайшее большее простое число
- //затем будет извлечен первообразный корень A из этого числа, отвечающий требованию
- //суть различности по модулю P
- //console.log(checkSimple(96157,1000))
- ///Первый пользователь
- let c1=genRand(2,p-3);
- let d1=powMod(g,c1,p);
- //Второй пользователь
- let c2=genRand(2,p-3);
- let d2=powMod(g,c2,p);
- //шифрование
- let k=getK(p-3);
- let r=powMod(g,k,p);
- let e=(m*powMod(d2,k,p))%p;
- console.log(`k= ${k}`);
- console.log(r);
- console.log(e);
- let md=(e*powMod(r,p-1-c2,p))%p;
- console.log(md);
Add Comment
Please, Sign In to add comment