當前位置:首頁 » 密碼管理 » 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.

熱點內容
js調用php的方法 發布:2025-05-15 09:29:13 瀏覽:495
android添加sdk 發布:2025-05-15 08:59:20 瀏覽:6
oracle數據導入sql 發布:2025-05-15 08:55:00 瀏覽:50
最適合做的腳本 發布:2025-05-15 08:54:27 瀏覽:381
太原php培訓班 發布:2025-05-15 08:41:38 瀏覽:938
豌豆伺服器地址 發布:2025-05-15 08:34:56 瀏覽:713
linux下php編譯安裝 發布:2025-05-15 08:30:37 瀏覽:593
c語言八進制十六進制 發布:2025-05-15 08:22:17 瀏覽:283
華為安卓如何更新鴻蒙 發布:2025-05-15 08:18:52 瀏覽:373
工商密碼器是什麼 發布:2025-05-15 08:18:50 瀏覽:752