1. 程式人生 > >C語言簡單實現現代密碼學rabin簽名

C語言簡單實現現代密碼學rabin簽名

#include<cstdio>
#include<string.h>
#include <stdlib.h>   
#include <time.h>  
#include <cmath>
#include <malloc.h>
#include<iostream>
#define max 10




using namespace std;


int gcd(int a, int b)//廣義歐幾里得
{
int k;
if (a < b)
{
k = a;
a = b;
b = k;
}
k = a%b;
while (k != 0)
{
a = b;
b = k;
k = a%b;
//cout << b << endl;
}
return b;
}


int  EX_gcd(int a, int b, int &s, int &t)
{
if (a == 0 && b == 0) {
return -1;
}
if (b == 0) {
s = 1;
t = 0;
return a;
}
int  d = EX_gcd(b, a%b, t, s);
t -= a / b*s;
//cout << "s是:" << s << "\n" << "t是:" << t << endl;
return d;
}




int prime_rand()//產生餘三的素數
{


int p;
while (1)
{
p = abs(rand()) % 1000;
int i = 0;
if (p > 100 && p % 2 != 0 && (p - 3) % 4 == 0) {
for (i = 3; i*i <= p;) {
if (p%i == 0) {
break;
}
i += 2;
}
}
if (i*i > p) {
return p;
}
}
}


int jiemi(int p, int q, int c)//解密函式即對映,解出的任一一根都是p和q的平方剩餘
{
int u, v;
u = 1;
for (int i = 0; i < (p + 1) / 4; i++) {
u = (c*u) % p;
}
cout << "u是:" << u << endl;
v = 1;
for (int i = 0; i < (q + 1) / 4; i++) {
v = (c*v) % q;
}
//v = (v*k) % q;
cout << "v是:" << v << endl;
int s, t;
EX_gcd(p, q, s, t);
/*s = (s%p + p) % p;
t = (t%q + q) % q;*/
int x;
x = ((t*q*u + s*p*v) % (p*q)+(p*q))%(p*q);
cout << "x是:" << x << endl;
int y = 0;
y = ((t*p*q - s*p*v) % (p*q) + (p*q)) % (p * q);
cout << "y是:" << y << endl;
return x;


}




double underwrite(int p, int q, int c)//簽名生成
{
double  s; //簽名
int m;
m =jiemi(p, q, c);
s = m;
cout << "生成的簽名是:" << endl;
cout << s;
return s;
}
int is_underwrite(int s,int c,int p,int q)//簽名驗證
{
int zhi,zhi1;
zhi = (s*s) % (p*q);
zhi1 = (-s + (p*q))*(-s + p*q) % (p*q);
cout << "zhi是:" << endl;
cout << zhi << endl;
if (c == zhi||c==zhi1) {
cout << "簽名通過!" << endl;
}
else {
cout << "簽名不通過!" << endl;
}
return 0;
}


int main()
{
int p, q;
srand((unsigned)time(NULL));
p = prime_rand();
q = prime_rand();
//cin >> p >> q;
cout << "私鑰p和q是:" << endl;
cout << p << "\n" << q << endl;
int m; //明文 
cout << "明文是:" << endl;
cin >> m;
int n;
n = p*q;
cout << "公鑰n是;" << n << endl;
int c;//密文
c = (m*m) % n;
cout << "密文c是:" << c << endl;
double s;//生成的簽名
s = underwrite(p, q, c);
int s1 = (int)s;
is_underwrite(s,c,p,q);
}