密码学课程设计
2.4运行结果
20
密码学课程设计
实验三 Rabin加密和签名
3.1 Rabin加密解密概述
3.2 程序与算法
int mod_exp(int a,int b,int n) {
int tmp=a%n,ans=1; for(;b>0;b>>=1) { if(b&1)
{ans*=tmp;ans%=n;} tmp*=tmp;tmp%=n; }
return ans; }
int extended_euclid(int a, int b, int &x, int &y) {
int d; if(b == 0)
21
密码学课程设计
{x = 1; y = 0; return a;}
d = extended_euclid(b, a % b, y, x); y -= a / b * x; return d; }
int chinese_remainder(int len) { int i, d, x, y, m, n, ret; ret = 0; n = 1; for(i=0; i < len ;i++) n *= w[i]; for(i=0; i < len ;i++) {
m = n / w[i];
d = extended_euclid(w[i], m, x, y); ret = (ret + y*m*b[i]) % n; }
return (n + ret%n) % n; }
int main() {
int n,i; int p,q,M,N; int M1,M2,M3,M4;
cout<<\输入大素数p,q\
cin>>p>>q;
cout<<\输入需加密明文M\ cin>>M;
N = p*q; int C = (M*M)%N; cout<<\
22
密码学课程设计
int a1 = mod_exp( (int)C,((p+1)/4), p); int a2 = -(mod_exp( (int)C,((p+1)/4), p)); int b1 = mod_exp( (int)C,((q+1)/4) , p); int b2 = -(mod_exp( (int)C,((q+1)/4) , p)); b[0] = a1; b[1] = b1; w[0] = p; w[1] = q;
M1 = chinese_remainder(2);
b[0] = a1; b[1] = b2; w[0] = p; w[1] = q;
M2 = chinese_remainder(2);
b[0] = a2; b[1] = b1; w[0] = p; w[1] = q;
M3 = chinese_remainder(2);
b[0] = a2; b[1] = b2; w[0] = p; w[1] = q;
M4 = chinese_remainder(2);
3.3 运行结果
23
密码学课程设计
实验四 公钥密码算法RSA
24