当前位置:首页 » 密码管理 » vcrsa加密算法

vcrsa加密算法

发布时间: 2022-04-20 15:49:53

Ⅰ 求RSA加密解密算法,c++源代码

#include<iostream.h>
#include<stdio.h>
#include<math.h>
int pf_c(int m,int k);
int pf(int m1,int n1);
int gcd(int f);
int r;
int h;
void main()
{ int a,b,c,d,d1,a1,b1,c1;
cout<<"请输入你选择的2个大素数!"<<endl;
cin>>a1;
cin>>b1;
r=a1*b1;
c=(a1-1)*(b1-1);
c1=gcd(c);
cout<<"公开钥为:"<<c1<<endl;
cout<<"请选择你要的操作:1.加密 2.解密"<<endl;
cin>>a;
switch(a){
case 1: cout<<"请输入明文:"<<endl;
cin>>b;
cout<<"密文为:"<<pf_c(b,c1)<<endl;
break;
case 2: cout<<"请输入密文:"<<endl;
cin>>d;
d1=pf(c,c1);
cout<<"私密钥为:"<<d1<<endl;
cout<<"明文为:"<<pf_c(d,d1)<<endl;
break;
}
getchar();
}
int pf_c(int m,int k)
{
int a,i1,a1,b[50],c1,c;
c=0;c1=1;i1=0;
do{
a=k/2;
a1=k%2;
b[i1]=a1;
k=a;
i1++;
}while(a>0);
i1--;
for(int i=i1;i>=0;i--)
{
c=2*c;
c1=(c1*c1)%r;
if(b[i]==1)
{
c=c+1;
c1=(c1*m)%r;
}
}
return c1;
}
int pf(int m1,int n1)
{
int x1=1,x2=0,x3;
int y1=0,y2=1,y3;
x3=m1;
y3=n1;
int d;
for(int i=0; ;i++)
{
int q=x3/y3;
int t1=x1-q*y1;
int t2=x2-q*y2;
int t3=x3-q*y3;
x1=y1;
x2=y2;
x3=y3;
y1=t1;
y2=t2;
y3=t3;
if(y3==1)
{
if(y2<0) d=m1+y2;
else d=y2;
break;
}
}
return d;
}
int gcd(int f)
{
int x1=1,x2=0,x3;
int y1=0,y2=1,y3;
for(int i1=2;i1<f;i1++)
{
x3=f;
y3=i1;
int q=x3/y3;
int t1=x1-q*y1;
int t2=x2-q*y2;
int t3=x3-q*y3;
x1=y1;
x2=y2;
x3=y3;
y1=t1;
y2=t2;
y3=t3;
if(y3==1)
{
return i1;
break;
}
}
}

Ⅱ C++程序 可以执行RSA 加密解密算法 可以给我吗

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctime>
#define gcc 10007
#define MAX ((INT)1<<63)-1
using namespace std;

typedef unsigned long long INT;
INT p[10]={2,3,5,7,11,13,17,19,23,29};
inline INT gcd(INT a,INT b)
{
INT m=1;
if(!b) return a;
while(m)
{
m=a%b;
a=b;
b=m;
}
return a;
}

//计算a*b%n

inline INT multi_mod(INT a,INT b,INT mod)
{
INT sum=0;
while(b)
{
if(b&1) sum=(sum+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return sum;
}

//计算a^b%n;

inline INT quickmod(INT a,INT b,INT mod)
{
INT sum=1;
while(b)
{
if(b&1) sum=multi_mod(sum,a,mod);
a=multi_mod(a,a,mod);
b>>=1;
}
return sum;
}

bool miller_rabin(INT n)
{
INT i,j,k=0;
INT u,m,buf;
//将n分解为m*2^k
if(n==2)
return true;
if(n<2||!(n&1))
return false;
m=n-1;
while(!(m&1))
k++,m>>=1;
for(i=0;i<9;i++)
{
if(p[i]>=n)
return true;
u=quickmod(p[i],m,n);
if(u==1)
continue;
for(j=0;j<k;j++)
{
buf=multi_mod(u,u,n);
if(buf==1&&u!=1&&u!=n-1)
return false;
u=buf;
}
//如果p[i]^(n-1)%n!=1那么n为合数
if(u-1)
return false;
}
return true;
}
INT extended_euclidean(INT n, INT m, INT &x, INT &y) {
if (m == 0) {
x = 1; y = 0; return n;
}
INT g = extended_euclidean(m, n % m, x, y);
INT t = x - n / m * y;
x = y;
y = t;
return g;
}
INT invmod(INT a,INT n)//求a对n的乘法逆元
{
INT x,y;
if(extended_euclidean(a,n,x,y)!=1) return -1;
return (x%n+n)%n;
}
void fff(char *str,INT *x){
INT t=0;
INT i,j=0;
for(i=0;i<strlen(str);i++){
t=t*10+str[i]-'0';
if(i%2==1){
x[j]=t;
j++;
t=0;
}
}
if(i%2) x[j]=t;
}
void rsa(INT *m,INT e,INT n){
for(INT i=0;i<100;i++)
m[i]=quickmod(m[i],e,n);
}
INT ranprim(){
INT p=0;
while(1){
p=(rand()%1000)+1000;
if(miller_rabin(p))
return p;
}

}
int main(){

srand((unsigned)time(NULL));
INT p,q,e,n,d,x;
do{
p=ranprim();
q=ranprim();
e=ranprim();
n=p*q;
d=invmod(e,(p-1)*(q-1));
x=(e*d)%((p-1)*(q-1));
}while(x!=1);
cout<<"p:"<<p<<" q:"<<q<<" e:"<<e<<" d:"<<d<<" n:"<<n<<endl;
char str[100];
int t;
INT m[100];
memset(m,0,sizeof(m));
while(scanf("%s",str)!=EOF){
t=(strlen(str)+1)/2;
fff(str,m);
rsa(m,e,n);
for(int i=0;i<t;i++)
printf("%d ",m[i]);
printf("\n");
rsa(m,d,n);
for(int i=0;i<t;i++)
printf("%d ",m[i]);
printf("\n");
}
}
我昨天刚给老师查的,没问题。输入数字,对数字加密。加密过程是两位一组。

Ⅲ 如何用VC++随机生成一个大素数(满足RSA算法)

你需要的包含在这个程序中,生成一个大数然后做RM素数测试,通过的我们假设其为素数即可!

RSA算法
1978年就出现了这种算法,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。
RSA的安全性依赖于大数难于分解这一特点。公钥和私钥都是两个大素数(大于100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。
密钥对的产生。选择两个大素数,p 和q 。计算:n = p * q 然后随机选择加密密钥e,要求 e 和 ( p - 1 ) * ( q - 1 )互质。最后,利用Euclid 算法计算解密密钥d, 满足e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )其中n和d也要互质。数e和n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任何人知道。加密信息 m(二进制表示)时,首先把m分成等长数据块 m1 ,m2,..., mi ,块长s,其中 2^s <= n, s 尽可能的大。对应的密文是:ci = mi^e ( mod n ) ( a ) 解密时作如下计算:mi = ci^d ( mod n ) ( b )
RSA 可用于数字签名,方案是用 ( a ) 式签名, ( b )式验证。具体操作时考虑到安全性和 m信息量较大等因素,一般是先作HASH 运算。RSA 的安全性。RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前,RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解140多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。
由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。
*/
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;//RSA算法所需参数
typedef struct RSA_PARAM_Tag
{
unsigned __int64 p, q; //两个素数,不参与加密解密运算
unsigned __int64 f; //f=(p-1)*(q-1),不参与加密解密运算
unsigned __int64 n, e; //公匙,n=p*q,gcd(e,f)=1
unsigned __int64 d; //私匙,e*d=1 (mod f),gcd(n,d)=1
unsigned __int64 s; //块长,满足2^s<=n的最大的s,即log2(n)
} RSA_PARAM;//小素数表
const static long g_PrimeTable[]=
{
3,
5,
7,
11,
13,
17,
19,
23,
29,
31,
37,
41,
43,
47,
53,
59,
61,
67,
71,
73,
79,
83,
89,
97
};
const static long g_PrimeCount=sizeof(g_PrimeTable) / sizeof(long);const unsigned __int64 multiplier=12747293821;
const unsigned __int64 adder=1343545677842234541;//随机数类
class RandNumber
{

private:
unsigned __int64 randSeed;
public:
RandNumber(unsigned __int64 s=0);
unsigned __int64 Random(unsigned __int64 n);
};
RandNumber::RandNumber(unsigned __int64 s)
{
if(!s)
{
randSeed= (unsigned __int64)time(NULL);
}
else
{
randSeed=s;
}
}
unsigned __int64 RandNumber::Random(unsigned __int64 n)
{
randSeed=multiplier * randSeed + adder;
return randSeed % n;
}static RandNumber g_Rnd;
inline unsigned __int64 MulMod(unsigned __int64 a, unsigned __int64 b, unsigned __int64 n)
{
return a * b % n;
}
unsigned __int64 PowMod(unsigned __int64 &base, unsigned __int64 &pow, unsigned __int64 &n)
{
unsigned __int64 a=base, b=pow, c=1;
while(b)
{
while(!(b & 1))
{
b>>=1; //a=a * a % n; //函数看起来可以处理64位的整数,但由于这里a*a在a>=2^32时已经造成了溢出,因此实际处理范围没有64位
a=MulMod(a, a, n);
} b--; //c=a * c % n; //这里也会溢出,若把64位整数拆为两个32位整数不知是否可以解决这个问题。
c=MulMod(a, c, n);
} return c;
}
long RabinMillerKnl(unsigned __int64 &n)
{
unsigned __int64 b, m, j, v, i;
m=n - 1;
j=0; //0、先计算出m、j,使得n-1=m*2^j,其中m是正奇数,j是非负整数
while(!(m & 1))
{
++j;
m>>=1;
} //1、随机取一个b,2<=b<n-1
b=2 + g_Rnd.Random(n - 3); //2、计算v=b^m mod n
v=PowMod(b, m, n); //3、如果v==1,通过测试
if(v == 1)
{
return 1;
} //4、令i=1
i=1; //5、如果v=n-1,通过测试
while(v != n - 1)
{
//6、如果i==l,非素数,结束
if(i == j)
{
return 0;
} //7、v=v^2 mod n,i=i+1
unsigned __int64 tmp1 = 2;
v=PowMod(v,tmp1, n);
++i; //8、循环到5
} return 1;
}
long RabinMiller(unsigned __int64 &n, long loop)
{
//先用小素数筛选一次,提高效率
for(long i=0; i < g_PrimeCount; i++)
{
if(n % g_PrimeTable[i] == 0)
{
return 0;
}
} //循环调用Rabin-Miller测试loop次,使得非素数通过测试的概率降为(1/4)^loop
for(long i=0; i < loop; i++)
{
if(!RabinMillerKnl(n))
{
return 0;
}
} return 1;
}
unsigned __int64 RandomPrime(char bits)
{
unsigned __int64 base;
do
{
base= (unsigned long)1 << (bits - 1); //保证最高位是1
base+=g_Rnd.Random(base); //再加上一个随机数
base|=1; //保证最低位是1,即保证是奇数
} while(!RabinMiller(base, 30)); //进行拉宾-米勒测试30次
return base; //全部通过认为是素数
}
unsigned __int64 EuclidGcd(unsigned __int64 &p, unsigned __int64 &q)
{
unsigned __int64 a=p > q ? p : q;
unsigned __int64 b=p < q ? p : q;
unsigned __int64 t;
if(p == q)
{
return p; //两数相等,最大公约数就是本身
}
else
{
while(b) //辗转相除法,gcd(a,b)=gcd(b,a-qb)
{
a=a % b;
t=a;
a=b;
b=t;
} return a;
}
}
unsigned __int64 SteinGcd(unsigned __int64 &p, unsigned __int64 &q)
{
unsigned __int64 a=p > q ? p : q;
unsigned __int64 b=p < q ? p : q;
unsigned __int64 t, r=1;
if(p == q)
{
return p; //两数相等,最大公约数就是本身
}
else
{
while((!(a & 1)) && (!(b & 1)))
{
r<<=1; //a、b均为偶数时,gcd(a,b)=2*gcd(a/2,b/2)
a>>=1;
b>>=1;
} if(!(a & 1))
{
t=a; //如果a为偶数,交换a,b
a=b;
b=t;
} do
{
while(!(b & 1))
{
b>>=1; //b为偶数,a为奇数时,gcd(b,a)=gcd(b/2,a)
} if(b < a)
{
t=a; //如果b小于a,交换a,b
a=b;
b=t;
} b=(b - a) >> 1; //b、a都是奇数,gcd(b,a)=gcd((b-a)/2,a)
} while(b);
return r * a;
}
}
unsigned __int64 Euclid(unsigned __int64 &a, unsigned __int64 &b)
{
unsigned __int64 m, e, i, j, x, y;
long xx, yy;
m=b;
e=a;
x=0;
y=1;
xx=1;
yy=1;
while(e)
{
i=m / e;
j=m % e;
m=e;
e=j;
j=y;
y*=i;
if(xx == yy)
{
if(x > y)
{
y=x - y;
}
else
{
y-=x;
yy=0;
}
}
else
{
y+=x;
xx=1 - xx;
yy=1 - yy;
} x=j;
} if(xx == 0)
{
x=b - x;
} return x;
}
RSA_PARAM RsaGetParam(void)
{
RSA_PARAM Rsa={ 0 };
unsigned __int64 t;
Rsa.p=RandomPrime(16); //随机生成两个素数
Rsa.q=RandomPrime(16);
Rsa.n=Rsa.p * Rsa.q;
Rsa.f=(Rsa.p - 1) * (Rsa.q - 1);
do
{
Rsa.e=g_Rnd.Random(65536); //小于2^16,65536=2^16
Rsa.e|=1; //保证最低位是1,即保证是奇数,因f一定是偶数,要互素,只能是奇数
} while(SteinGcd(Rsa.e, Rsa.f) != 1); Rsa.d=Euclid(Rsa.e, Rsa.f);
Rsa.s=0;
t=Rsa.n >> 1;
while(t)
{
Rsa.s++; //s=log2(n)
t>>=1;
} return Rsa;
}
void TestRM(void)
{
unsigned long k=0;
cout << " - Rabin-Miller prime check.n" << endl;
for(unsigned __int64 i=4197900001; i < 4198000000; i+=2)
{
if(RabinMiller(i, 30))
{
k++;
cout << i << endl;
}
} cout << "Total: " << k << endl;
}
void TestRSA(void)
{
RSA_PARAM r;
char pSrc[]="abcdefghijklmnopqrstuvwxyz";
const unsigned long n=sizeof(pSrc);
unsigned char *q, pDec[n];
unsigned __int64 pEnc[n];
r=RsaGetParam();
cout << "p=" << r.p << endl;
cout << "q=" << r.q << endl;
cout << "f=(p-1)*(q-1)=" << r.f << endl;
cout << "n=p*q=" << r.n << endl;
cout << "e=" << r.e << endl;
cout << "d=" << r.d << endl;
cout << "s=" << r.s << endl;
cout << "Source:" << pSrc << endl;
q= (unsigned char *)pSrc;
cout << "Encode:";
for(unsigned long i=0; i < n; i++)
{
unsigned __int64 tmp2 = q[i];
pEnc[i]=PowMod(tmp2, r.e, r.n);
cout << hex << pEnc[i] << " ";
} cout << endl;
cout << "Decode:";
for(unsigned long i=0; i < n; i++)
{
pDec[i]=PowMod(pEnc[i], r.d, r.n);
cout << hex << (unsigned long)pDec[i] << " ";
} cout << endl;
cout << (char *)pDec << endl;
}
int main(void)
{
TestRSA();
return 0;
}

Ⅳ 用VC++实现RSA加密算法的加密和解密需要程序 谢谢!!!

我只写了生成公钥和密钥的程序(包括大数的四则运算),但是不包括大素数的测试,以及对文件的加密和解密过程。你要不,纯c++代码。

Ⅳ 如何用C语言程序实现RSA算法

#include "stdafx.h"
#include<math.h>
#include<stdio.h>
int isP(int m)
{
int i;
for(i=2;i<m;i++)
if(m % i==0)return 0;
return 1;
}
int num(int m,int k)
{
int i=0;
for(m=m;k>0;m++)
if(isP(m))
{
k--;
return m;
}
}
int main(int argc, char* argv[])
{
int P,Q,E,D,i,k,fn,c=0,j=0,t=1,f1=1,l=2;
int a[10];
long N0,N1;
long PT,CT,N;
printf("请输入第一个数:");
scanf("%d",&P);
P=num(P,1);
printf("请输入比第一次大的数:");
scanf("%d",&Q);
Q=num(Q,1);
N=P*Q;
N1=(P-1)*(Q-1);
N0=N1;
while(N1>=3)
{

while(N1%l!=0)
{
l++;
}
a[j++]=l;
N1=N1/l;

}
printf("请输入一个奇数E,若E不合适,系统将会找一个比E大的合适值:");
scanf("%d",&E);
for(i=E;t>0;i=i+2)
{
for(k=0;k<j+1;k++)
{
if(E%a[k-1]==0) break;
else if(k==j)
{
t--;
}
E=i;
}
}
for(k=1; ;k++)
{
if((N0*k+1)%E==0)
{
D=(N0*k+1)/E;
if((D*E)%N0==1)
break;
}

}
printf("请输入明文:");
scanf("%ld",&PT);
for(i=1;i<=E;i++)
{
fn=(f1*PT)%N;
f1=fn;
CT=fn;
}
f1=1;
for(i=1;i<=D;i++)
{
fn=(f1*CT)%N;
f1=fn;
PT=fn;
}
printf("P=%d,Q=%d\n",P,Q);
for(k=0;k<j;k++)
printf("%d ",a[k]);
printf("\n");
printf("E=%d,D=%d,N=%ld\n",E,D,N);
printf("密码是:%ld\n",CT);
printf("明文是:%ld\n",PT);
return 0;
}

Ⅵ 谁能给我一个用VC++实现RSA加密算法的加密和解密需要程序 谢谢!!!

5分……这程序卖钱都能卖很多。呵呵。

Ⅶ 谁给用C或C++实现一个加密算法DES或者RSA的都行

一个DES或者RSA的一个算法,不是你这种初级学生能看的明白的。。。。

这样你可以自己算一个 比如将文件内的数据,按一定的公式进行差序,然后再进行 某些运算(+ - ‘某个字符’ 或者其他),最后生成的一个加密后的文件。。。

记得再按照加密的方法,写一个解密的东西。。。。

这么下来就能完成任务了!~~~~

Ⅷ rsa算法实现代码

你看看这个行不行,位数可以自己改,今天在网上找到了,我也想用C生成512、1024位的大素数进行RSA加密。。如果谁有好方法麻烦共享下:[email protected],跪谢

package test;

import java.math.BigInteger;

// 生成一个随机大整数,然后找出比这个整数大的下一个素数
public class Primes {
// 下面的 BigInteger.ZERO 和 BigInteger.ONE 在 JDK 1.1 中是无效的
private static final BigInteger ZERO = BigInteger.ZERO;
private static final BigInteger ONE = BigInteger.ONE;
private static final BigInteger TWO = new BigInteger("2");

// 产生一个错误素数的概率小于 1/2 的 ERR_VAL 次方,可以将 ERR_VAL 定义为 200,降低其错误率
// Java 应该使用的是 Miller-Rabin 测试法,这种错误概率基本上可以认为是无错误。
private static final int ERR_VAL = 100;
private static StringBuffer[] digits = { new StringBuffer("0"), new StringBuffer("1"), new StringBuffer("2"), new StringBuffer("3"), new StringBuffer("4"), new StringBuffer("5"),
new StringBuffer("6"), new StringBuffer("7"), new StringBuffer("8"), new StringBuffer("9") };

private static StringBuffer randomDigit(boolean isZeroOK) {
// 产生一个随机的数字(字符串形式的),isZeroOK 决定这个数字是否可以为 0
int index;
if (isZeroOK)
index = (int) Math.floor(Math.random() * 10);
else
index = 1 + (int) Math.floor(Math.random() * 9);
return (digits[index]);
}

public static BigInteger bigRandom(int numDigits) {
// 产生一个随机大整数,各位上的数字都是随机产生的,首位不为 0
StringBuffer s = new StringBuffer("");
for (int i = 0; i < numDigits; i++)
if (i == 0)
s.append(randomDigit(false));
else
s.append(randomDigit(true));
return (new BigInteger(s.toString()));
}

private static boolean isEven(BigInteger n) {
// 测试一个大整数是否为偶数
return (n.mod(TWO).equals(ZERO));
}

public static BigInteger nextPrime(BigInteger start) {
// 产生一个比给定大整数 start 大的素数,错误率低于 1/2 的 ERR_VAL 次方
if (isEven(start))
start = start.add(ONE);
else
start = start.add(TWO);
if (start.isProbablePrime(ERR_VAL))
return (start);
else
// 采用递归方式(递归的层数会是个天文数字吗?)
return (nextPrime(start));
}

// 一个基于命令行的测试程序,如果位数错误,默认 150 位,输出 20 个素数
public static void main(String[] args) {
int numDigits;
try {
numDigits = Integer.parseInt(args[0]);
} catch (Exception e) {
numDigits = 128;
}
BigInteger start = bigRandom(numDigits);

start = nextPrime(start);
BigInteger end = bigRandom(5);
end = nextPrime(end);
System.out.println("大素数" + start);
System.out.println("大素数" + end);
BigInteger result = start.multiply(end);
System.out.println("结果数" + result);

Ⅸ VC这段代码什么意思

Socket client = server.Accept();等待连接
rsa = new RSACryptoServiceProvider();实例化一个RSA标准加密算法
rsa.KeySize = 512;设置密钥大小 吖的,不给分杀了你补充一下:这哪是什么vc的,这分明是c#的,这人脑残的

Ⅹ 怎么用vc++6.0创建一个RSA加密算法的图形界面工程 步骤尽量完整哈 谢谢哈

图形界面用MFC,加密可以用CSP.

热点内容
排序函数c语言 发布:2025-05-15 13:06:28 浏览:5
韩服lol挂机脚本 发布:2025-05-15 12:42:56 浏览:460
监控存储服务器如何调试 发布:2025-05-15 12:36:30 浏览:218
一万级净化车间有哪些配置 发布:2025-05-15 12:16:41 浏览:97
javazip解压加密 发布:2025-05-15 12:15:02 浏览:941
dnf服务器存放什么信息 发布:2025-05-15 12:11:07 浏览:216
办公室视频剧本脚本 发布:2025-05-15 12:03:51 浏览:491
编译失败什么意思 发布:2025-05-15 11:58:18 浏览:87
lcs脚本官网 发布:2025-05-15 11:56:15 浏览:88
三国志战略版打9级矿什么配置 发布:2025-05-15 11:41:29 浏览:953