发一个我写的RSA算法的源码!
这个源码的是读取D盘下的一个名为123.txt的文件,然后对其中的内容加密.
利用的是RSA的加密算法.
#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>
using namespace std;
/////////==========读取文件内容并用v向量返回其值========///////
void get_v(vector<char> &v)
{
//vector<char> v;
ifstream in("d:\\123.txt");
char CHAR;
if(in.bad())
{
cout<<"Can't open the file!"<<endl;
}
while(!in.eof())
{
in.get(CHAR);
v.push_back(CHAR);
}
}
/////////=========把读取的字符生成数字序列==========///////////
void change_chars_into_numbers(vector<char> v,vector<int> &v1)
{
for(int i=0;i<v.size();i++)
v1.push_back(int(v[i]));
}
//////////======加密解密的函数======/////////
void converted(vector<int> v,vector<int> &v1,vector<char> &v2,int a,int n)
{
int b,temp,k;
for(int i=0;i<v.size();i++)
{
b=a;
temp=1;
k=v[i];
while(b!=1)
{
if(b%2==1) temp=temp*k%n;
b=b/2;
k=k*k%n;
}
k=temp*k%n;
v1.push_back(k);
v2.push_back(char(k));
}
}
template <typename T>
void display(vector<T> v) //////////==========输出生成后的序列===========////////
{
for(int i=0;i<v.size();i++)
cout<<v[i];
cout<<endl;
}
void main()
{
int p,q,m,n,b;
vector<int> s1;
vector<int> s2,s3;
vector<char> s,s4,s5;
cout<<" 输入两个素数p和q:"<<endl; /////=====提示输入两个素数,也可以
/////自己开始的时候就定义素数的值====//
cin>>p>>q; //====输入两个素数,比如43和59====//
m=(p-1)*(q-1); ////////======秘密计算的m==========//////
n=p*q; ///====计算可以公开的n=========//////
cout<<"========输入一个整数b========="<<endl;///选取b,如13
cin>>b;
for(int a=1;a<m;a++) /////======for循环算出a============////
{
if(a*b%m==1)
{
cout<<"由(q-1)*(p-1)的值算出a为:"<<a<<endl;
break;
}
a++;
}
get_v(s);///========调用get_v()函数读取文件内容===========//
cout<<"===================转换前的字母为==================="<<endl;
display(s); //=====调用display()函数对取得的字符输出=====//////
change_chars_into_numbers(s,s1); ///===把生成的字符序列转化为数字===//
cout<<"=================字母转化为数字的序列为==============="<<endl;
display(s1); ///////=========输出转化后的数字序列==========////////
cout<<"====================加密后的明文为======================="<<endl;
converted(s1,s2,s4,b,n); /////=====调用converted()函数加密=====///
display(s2); //////=====输出加密后的明文=============//////
cout<<"=========解密后还原文件内容为========="<<endl;
converted(s2,s3,s5,a,n);/////=====调用converted()函数解密=====///////
display(s5); //////=========调用display()函数输出解密后的内容===/////
}
欢迎大家加入CSDN编程爱好者群!号码是:11763385
问题点数:0、回复次数:17Top
1 楼WZHS1983()回复于 2006-04-11 19:59:50 得分 0
欢迎大家指正,我在VC6.0通过.Top
2 楼defyer007(深入浅出)回复于 2006-04-12 00:49:05 得分 0
mark
RSA有这么简单吗?Top
3 楼yuanchuang(元创)回复于 2006-04-12 06:55:55 得分 0
留名Top
4 楼DiabloWalkOnTheEarth(我想到个绝妙的昵称,只是地方太小,写不下)回复于 2006-04-12 09:37:54 得分 0
RSA 你怎么也得 512的 N 吧, 这个 32位的算什么啊....
Top
5 楼Beover1984(摇滚人生)回复于 2006-04-12 10:03:04 得分 0
楼上的有点儿打击人了,楼主能把自己的代码贴出来让大家参考和指正是很不错的,并不一定要和实际应用什么的联系起来.Top
6 楼SSS520()回复于 2006-04-12 18:50:26 得分 0
Beover1984(摇滚人生)说得对,楼主可能只是给出思路,至于N是多大那是自己使用的时候再根据实际定义.Top
7 楼WZHS1983()回复于 2006-04-12 19:18:23 得分 0
这是我写的一个简单的RSA程序,
至于可靠性可能不是很大,毕竟我们的CPU
不是很强,不 可能让素数的位数达到200位以上.
如果要加强可靠性就要加大素数的位数.Top
8 楼babyQ(restarting)回复于 2006-11-21 09:54:47 得分 0
MARKTop
9 楼taodm((不能收CSDN社区短信息,请莫浪费精力))回复于 2006-11-21 10:06:23 得分 0
写个长整型数吧,继续练练手。Top
10 楼jianshi051(看到我就给我一点分吧>_<~)回复于 2006-11-21 10:10:47 得分 0
楼主的共享精神可佳~
有空慢慢看~Top
11 楼C20062222()回复于 2006-11-21 11:12:56 得分 0
原理是实现了,但没有使用价值,
大数处理是必须实现的,或者借用现成的,都可以Top
12 楼chai2010(C++/Qt...)回复于 2006-11-21 14:43:01 得分 0
原理差不多了,
不过sqrt(2^32)内也就6000多个素数,
因式分解n太容易了Top
13 楼chai2010(C++/Qt...)回复于 2006-11-21 14:58:54 得分 0
int p, q, n;
n = p*q; // 这里可能会溢出
Top
14 楼laiwusheng(风清扬)回复于 2006-11-21 16:11:43 得分 0
MARKTop
15 楼LeadWorld(夕霞孤雁)回复于 2006-11-22 09:51:02 得分 0
markTop
16 楼gapwind()回复于 2006-11-23 14:33:11 得分 0
markTop
17 楼meric(空藏书千册而无一能读,无它,书非借尔.)回复于 2006-11-23 14:38:53 得分 0
mark
再贴个椭圆曲线的就好了,这个还没见过Top




