elgamal算法 c语言实现,RSA&ElGamal算法实现.doc

RSA

信息保障与安全

实验报告

学 院 计算机科学与技术

专 业 计算机科学与技术

年 级 2007级

姓 名 张炎辉

学 号 3007216108

2010年 4 月 28 日

1、试验题目

1.1题目

《简化RSA、ElGamal算法》

1.2具体要求

任务:(1) 编写一个程序实现简化RSA加密算法如图1; (2) 编写一个程序实现简化ElGamal加密算法如图2。

要求:两个程序都应该具有一个简单的输入{密钥长度,公开密钥,明文M/密文C}和输出{秘密密钥,密文C /明文M }界面。所有的输入输出数据用十进制表示。

1.3 测试用例

(1) 简化RSA加密

密钥长度=15 bits,N=pq=131×191=25021,e=3,d=16467,M=24021,C=14307。

(2) 简化ElGamal加密

密钥长度=14 bits,p=9973,α=11,y=5445,a=1751,M=7651,C={111520( 1028(mod 9973),5905}。

2、算法实现

2.1流程图

2.2测试结果

2.2.1 测试用例一

图一 开始界面

图二 密钥生成器

图三 加密

图四 解密

2.2.2测试用例二

图一 密钥生成器

图二 加密

图三 解密

3、代码实现

#include

#include

using namespace std;

int gcd(long a,long b)

{

if(a < b){

long temp = a;

a = b;

b = temp;

}

while(a%b){

long c = a%b;

a = b;

b = c;

}

return b;

}

/*RSA*/

void RSA_key_generate(long length,long p,long q,long &n,long &e,long &d){

n = q * p;

long t = (p - 1)*(q - 1);

for(e = 2; gcd(e,t) != 1 ;e++);

long de = 1;

for(int k = 0;de%e != 0;k++){

de = de + t;

}

d = de/e;

}

int RSA_Encryption(long n,long e,long m){

long c = 1;

for(int i = 1;i <= e; i++)

{

c = c*m;

if(c > n) c = c%n;

}

return c;

}

int RSA_Decrypt(long n,long d,long c){

long m = 1;

for(int i = 1;i <= d; i++)

{

m = m*c;

if(m > n) m = m%n;

}

return m;

}

/**/

/*ElGamal*/

typedef struct r_t

{

long r;

long t;

};

void ElGamal_key_generate(long length,long p,long a,long x,long &y)

{

y = 1;

for(int i = 1;i <= x;i++)

{

y = y*a;

if(y > p) y = y%p;

}

}

r_t ElGamal_Encryption(long p,long a,long y,long m)

{

struct r_t rt;

rt.r = 1;

rt.t = m;

/*random number*/

srand((unsigned)time(NULL));

int k = 1520;//rand()%1024;

/**/

for(int i = 1;i <= k; i++){

rt.r = rt.r*a;

if(rt.r > p){

rt.r = rt.r%p;

}

rt.t = rt.t*y;

if(rt.t > p){

rt.t = rt.t%p;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值