您的位置:首页 > 编程语言 > C语言/C++

C语言学习笔记(九)---简单的RSA加密算法练习

2017-11-15 19:24 316 查看
写完了带有cbc的背包加密,按照课程,接下来应该学RSA,限于码力不足,仍然选用一个字符对应一个数字的加密方法,再加上cbc扩散提高加密强度。

源代码贴在下面,exe下载密码:2zpp

一、算法设计

RSA算法–百度百科

1.算法设计过程

首先考虑到明文多由各种字符组成,如“Just for fun.“。然后思考后决定加密后的密文为多个数字,每个数字对应一个字符。与字符对应的数字首先想到ASCII码,于是考虑对ASCII码进行RSA加密。(同样是限于码力不足,公开钥和秘密钥都是提前在代码里定义好的。)

2.公开钥

e、n:{11,899}

3.秘密钥

d、p、q:{611,29,31}

4.明文

Just for fun.

(初始向量为‘P’)

5.密文

769 171 92 665 697 823 351 172 605 313 730 422 844

6.加解密运算过程

1.加密(以加密’I’为例)

读取字符’I’——>得到其ASCII码值:73——>与前一位密文或初始向量密文异或:254——>使用公开钥进行加密计算得到密文:212

2.解密(以解密212为例)

读取密文数字212——>使用密钥对其求解:254——>得到其ASCII码值:73——>得到明文:I

二、简单的C语言实现

//
//  RSA
//
//  Created by passer_by_A on 2017/11/14.
//
#include <stdio.h>
int p=29,q=31;
int n=29*31;//899
int N=28*30;//840
int e=11,d=611;
char pt[100]={0};
int ct[100]={0};
int length;//the length

int FastMod(int a,int b,int c)//快速幂取模
{
int ans=1;
a=a%c;
4000
while(b>0)
{
if(b%2==1) ans=(ans*a)%c;
b/=2;
a=(a*a)%c;
}
return ans;
}
char translateC(int nu,int i)//将密文一个个解密
{
nu=FastMod(nu,e,n);
nu=nu^ct[i-1];
return (char)nu;
}

int translateP(char ch,int i)//将明文一个个加密
{
int k=(int)ch;
k=k^ct[i-1];
k=FastMod(k, d, n);
return k;
}

void encode()//加密
{
printf("This program will encrypt your plaintext into numbers.\n");
printf("Please input your plaintext:\n");
for(int i=1;;i++)
{
scanf("%c",&pt[i]);
if(pt[i]=='\n') break;
length=i;
}
for(int i=1;i<=length;i++)
{
ct[i]=translateP(pt[i],i);
}
printf("The ciphertext is:\n");
for(int i=1;i<=length;i++)
{
printf("%d ",ct[i]);
}
putchar('\n');
}

void decode()//解密
{
printf("This program will decrypt your plaintext into text.\n");
printf("Please input your ciphertext and end with '#':\n");
for(int i=1;;i++)
{
scanf("%d",&ct[i]);
char chh=getchar();
length=i;
if(chh=='#') break;
}
for(int i=1;i<=length;i++)
{
pt[i]=translateC(ct[i],i);
}
printf("The plaintext is:\n");
for(int i=1;i<=length;i++)
{
printf("%c",pt[i]);
}
putchar('\n');
}

int main() {
int num;
pt[0]='P';
ct[0]=183;
printf("Input 1 for encrypt, 0 for decrypt.\n");
scanf("%d",&num);
getchar();

if(num) encode();
else decode();
return 0;
}


学加密算法真的有意思(就是头有点凉)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: