当前位置:首页 > 代码 > 正文

rsa加密算法源代码(rsa算法加密和解密举例)

admin 发布:2022-12-20 00:00 339


今天给各位分享rsa加密算法源代码的知识,其中也会对rsa算法加密和解密举例进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

RSA算法的C++实现

RSA算法介绍及JAVA实现,其实java和c++差不多,参考一下吧

一基础

RSA算法非常简单,概述如下:

找两素数p和q

取n=p*q

取t=(p-1)*(q-1)

取任何一个数e,要求满足et并且e与t互素(就是最大公因数为1)

取d*e%t==1

这样最终得到三个数: n d e

设消息为数M (M n)

设c=(M**d)%n就得到了加密后的消息c

设m=(c**e)%n则 m == M,从而完成对c的解密。

注:**表示次方,上面两式中的d和e可以互换。

在对称加密中:

n d两个数构成公钥,可以告诉别人;

n e两个数构成私钥,e自己保留,不让任何人知道。

给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。

别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。

rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解

从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法

求得d。

二实践

接下来我们来一个实践,看看实际的操作:

找两个素数:

p=47

q=59

这样

n=p*q=2773

t=(p-1)*(q-1)=2668

取e=63,满足et并且e和t互素

用perl简单穷举可以获得满主 e*d%t ==1的数d:

C:\Tempperl -e "foreach $i (1..9999){ print($i),last if $i*63%2668==1 }"

847

即d=847

最终我们获得关键的

n=2773

d=847

e=63

取消息M=244我们看看

加密:

c=M**d%n = 244**847%2773

用perl的大数计算来算一下:

C:\Tempperl -Mbigint -e "print 244**847%2773"

465

即用d对M加密后获得加密信息c=465

解密:

我们可以用e来对加密后的c进行解密,还原M:

m=c**e%n=465**63%2773 :

C:\Tempperl -Mbigint -e "print 465**63%2773"

244

即用e对c解密后获得m=244 , 该值和原始信息M相等。

三字符串加密

把上面的过程集成一下我们就能实现一个对字符串加密解密的示例了。

每次取字符串中的一个字符的ascii值作为M进行计算,其输出为加密后16进制

的数的字符串形式,按3字节表示,如01F

代码如下:

#!/usr/bin/perl -w

#RSA 计算过程学习程序编写的测试程序

#watercloud 2003-8-12

#

use strict;

use Math::BigInt;

my %RSA_CORE = (n=2773,e=63,d=847); #p=47,q=59

my $N=new Math::BigInt($RSA_CORE{n});

my $E=new Math::BigInt($RSA_CORE{e});

my $D=new Math::BigInt($RSA_CORE{d});

print "N=$N D=$D E=$E\n";

sub RSA_ENCRYPT

{

my $r_mess = shift @_;

my ($c,$i,$M,$C,$cmess);

for($i=0;$i length($$r_mess);$i++)

{

$c=ord(substr($$r_mess,$i,1));

$M=Math::BigInt-new($c);

$C=$M-copy(); $C-bmodpow($D,$N);

$c=sprintf "%03X",$C;

$cmess.=$c;

}

return \$cmess;

}

sub RSA_DECRYPT

{

my $r_mess = shift @_;

my ($c,$i,$M,$C,$dmess);

for($i=0;$i length($$r_mess);$i+=3)

{

$c=substr($$r_mess,$i,3);

$c=hex($c);

$M=Math::BigInt-new($c);

$C=$M-copy(); $C-bmodpow($E,$N);

$c=chr($C);

$dmess.=$c;

}

return \$dmess;

}

my $mess="RSA 娃哈哈哈~~~";

$mess=$ARGV[0] if @ARGV = 1;

print "原始串:",$mess,"\n";

my $r_cmess = RSA_ENCRYPT(\$mess);

print "加密串:",$$r_cmess,"\n";

my $r_dmess = RSA_DECRYPT($r_cmess);

print "解密串:",$$r_dmess,"\n";

#EOF

测试一下:

C:\Tempperl rsa-test.pl

N=2773 D=847 E=63

原始串:RSA 娃哈哈哈~~~

加密串:5CB6CD6BC58A7709470AA74A0AA74A0AA74A6C70A46C70A46C70A4

解密串:RSA 娃哈哈哈~~~

C:\Tempperl rsa-test.pl 安全焦点(xfocus)

N=2773 D=847 E=63

原始串:安全焦点(xfocus)

加密串:3393EC12F0A466E0AA9510D025D7BA0712DC3379F47D51C325D67B

解密串:安全焦点(xfocus)

四提高

前面已经提到,rsa的安全来源于n足够大,我们测试中使用的n是非常小的,根本不能保障安全性,

我们可以通过RSAKit、RSATool之类的工具获得足够大的N 及D E。

通过工具,我们获得1024位的N及D E来测试一下:

n=0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90B66EC3A85F5005D

BDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF1538D4C2013433B383B

47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941D2ED173CCA50E114705D7E2

BC511951

d=0x10001

e=0xE760A3804ACDE1E8E3D7DC0197F9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C2995

4C5D86B36E943080E4919CA8CE08718C3B0930867A98F635EB9EA9200B25906D91B80A47B77324E66AFF2

C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A592D2B

1965

设原始信息

M=0x11111111111122222222222233333333333

完成这么大数字的计算依赖于大数运算库,用perl来运算非常简单:

A) 用d对M进行加密如下:

c=M**d%n :

C:\Tempperl -Mbigint -e " $x=Math::BigInt-bmodpow(0x11111111111122222222222233

333333333, 0x10001, 0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5F

CD15F90B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F0

17F9CCF1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD6

0438941D2ED173CCA50E114705D7E2BC511951);print $x-as_hex"

0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd

45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b

3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91

f1834580c3f6d90898

即用d对M加密后信息为:

c=0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd

45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b

3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91

f1834580c3f6d90898

B) 用e对c进行解密如下:

m=c**e%n :

C:\Tempperl -Mbigint -e " $x=Math::BigInt-bmodpow(0x17b287be418c69ecd7c39227ab

681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd45692b007f3a2f7c5f5aa1d99ef3

866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b3028f9461a3b1533ec0cb4764414

65f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91f1834580c3f6d90898, 0xE760A

3804ACDE1E8E3D7DC0197F9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C29954C5D

86B36E943080E4919CA8CE08718C3B0930867A98F635EB9EA9200B25906D91B80A47B77324E66AFF

2C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A

592D2B1965, 0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90

B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF

1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941

D2ED173CCA50E114705D7E2BC511951);print $x-as_hex"

0x11111111111122222222222233333333333

(我的P4 1.6G的机器上计算了约5秒钟)

得到用e解密后的m=0x11111111111122222222222233333333333 == M

C) RSA通常的实现

RSA简洁幽雅,但计算速度比较慢,通常加密中并不是直接使用RSA 来对所有的信息进行加密,

最常见的情况是随机产生一个对称加密的密钥,然后使用对称加密算法对信息加密,之后用

RSA对刚才的加密密钥进行加密。

最后需要说明的是,当前小于1024位的N已经被证明是不安全的

自己使用中不要使用小于1024位的RSA,最好使用2048位的。

----------------------------------------------------------

一个简单的RSA算法实现JAVA源代码:

filename:RSA.java

/*

* Created on Mar 3, 2005

*

* TODO To change the template for this generated file go to

* Window - Preferences - Java - Code Style - Code Templates

*/

import java.math.BigInteger;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.FileWriter;

import java.io.FileReader;

import java.io.BufferedReader;

import java.util.StringTokenizer;

/**

* @author Steve

*

* TODO To change the template for this generated type comment go to

* Window - Preferences - Java - Code Style - Code Templates

*/

public class RSA {

/**

* BigInteger.ZERO

*/

private static final BigInteger ZERO = BigInteger.ZERO;

/**

* BigInteger.ONE

*/

private static final BigInteger ONE = BigInteger.ONE;

/**

* Pseudo BigInteger.TWO

*/

private static final BigInteger TWO = new BigInteger("2");

private BigInteger myKey;

private BigInteger myMod;

private int blockSize;

public RSA (BigInteger key, BigInteger n, int b) {

myKey = key;

myMod = n;

blockSize = b;

}

public void encodeFile (String filename) {

byte[] bytes = new byte[blockSize / 8 + 1];

byte[] temp;

int tempLen;

InputStream is = null;

FileWriter writer = null;

try {

is = new FileInputStream(filename);

writer = new FileWriter(filename + ".enc");

}

catch (FileNotFoundException e1){

System.out.println("File not found: " + filename);

}

catch (IOException e1){

System.out.println("File not found: " + filename + ".enc");

}

/**

* Write encoded message to 'filename'.enc

*/

try {

while ((tempLen = is.read(bytes, 1, blockSize / 8)) 0) {

for (int i = tempLen + 1; i bytes.length; ++i) {

bytes[i] = 0;

}

writer.write(encodeDecode(new BigInteger(bytes)) + " ");

}

}

catch (IOException e1) {

System.out

求python RSA 算法加密字符串的完整源代码。

import rsa rsaPublickey = int(pubkey, 16) key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥 message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) #拼接明文js加密文件中得到 passwd = rsa.encrypt(message, key) #加密 passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。 return passwd

C++实现RSA加密解密算法

#include iostream

using namespace std;

template class HugeInt

HugeInt Power( const HugeInt x, const HugeInt n, // 求x^n mod p

const HugeInt p )

{

if( n == 0 )

return 1;

HugeInt tmp = Power( ( x * x ) % p, n / 2, p );

if( n % 2 != 0 )

tmp = ( tmp * x ) % p;

return tmp;

}

template class HugeInt

void fullGcd( const HugeInt a, const HugeInt b, //

HugeInt x, HugeInt y )

{

HugeInt x1, y1;

if( b == 0 )

{

x = 1;

y = 0;

}

else

{

fullGcd( b, a % b, x1, y1 );

x = y1;

y = x1 - ( a / b ) * y1;

}

}

template class HugeInt

HugeInt inverse( const HugeInt p, const HugeInt q, // 求d

const HugeInt e )

{

int fyn = ( 1 - p ) * ( 1 - q );

HugeInt x, y;

fullGcd( fyn, e, x, y );

return x 0 ? x : x + e;

}

int main( )

{

cout "Please input the plaintext: " endl;

int m;

cin m;

cout "Please input p,q and e: " endl;

int p, q, e;

cin p q e;

int n = p * q;

int d = inverse( p, q, e );

int C = Power( m, e, n );

cout "The ciphertext is: " C endl;

cout "\n\nPlease input the ciphertext: " endl;

cin C;

cout "\n\nPlease input p, q and d: " endl;

cin p q d;

n = p * q;

m = Power( C, d, n );

cout "The plaintext is: " m endl endl;

system( "pause" );

return 0;

}

这就是RSA加密解密算法

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

//下面程序由520huiqin编写,已在VC++ 6.0下编译通过

#include iostream.h

#include math.h

#include stdio.h

typedef int Elemtype;

Elemtype p,q,e;

Elemtype fn;

Elemtype m,c;

int flag = 0;

typedef void (*Msghandler) (void);

struct MsgMap {

char ch;

Msghandler handler;

};

/* 公钥 */

struct PU {

Elemtype e;

Elemtype n;

} pu;

/* 私钥 */

struct PR {

Elemtype d;

Elemtype n;

} pr;

/* 判定一个数是否为素数 */

bool test_prime(Elemtype m) {

if (m = 1) {

return false;

}

else if (m == 2) {

return true;

}

else {

for(int i=2; i=sqrt(m); i++) {

if((m % i) == 0) {

return false;

break;

}

}

return true;

}

}

/* 将十进制数据转化为二进制数组 */

void switch_to_bit(Elemtype b, Elemtype bin[32]) {

int n = 0;

while( b 0) {

bin[n] = b % 2;

n++;

b /= 2;

}

}

/* 候选菜单,主界面 */

void Init() {

cout"*********************************************"endl;

cout"*** Welcome to use RSA encoder ***"endl;

cout"*** a.about ***"endl;

cout"*** e.encrypt ***"endl;

cout"*** d.decrypt ***"endl;

cout"*** s.setkey ***"endl;

cout"*** q.quit ***"endl;

cout"**********************************by*Terry***"endl;

cout"press a key:"endl;

}

/* 将两个数排序,大的在前面*/

void order(Elemtype in1, Elemtype in2) {

Elemtype a = ( in1 in2 ? in1 : in2);

Elemtype b = ( in1 in2 ? in1 : in2);

in1 = a;

in2 = b;

}

/* 求最大公约数 */

Elemtype gcd(Elemtype a, Elemtype b) {

order(a,b);

int r;

if(b == 0) {

return a;

}

else {

while(true) {

r = a % b;

a = b;

b = r;

if (b == 0) {

return a;

break;

}

}

}

}

/* 用扩展的欧几里得算法求乘法逆元 */

Elemtype extend_euclid(Elemtype m, Elemtype bin) {

order(m,bin);

Elemtype a[3],b[3],t[3];

a[0] = 1, a[1] = 0, a[2] = m;

b[0] = 0, b[1] = 1, b[2] = bin;

if (b[2] == 0) {

return a[2] = gcd(m, bin);

}

if (b[2] ==1) {

return b[2] = gcd(m, bin);

}

while(true) {

if (b[2] ==1) {

return b[1];

break;

}

int q = a[2] / b[2];

for(int i=0; i3; i++) {

t[i] = a[i] - q * b[i];

a[i] = b[i];

b[i] = t[i];

}

}

}

/* 快速模幂算法 */

Elemtype modular_multiplication(Elemtype a, Elemtype b, Elemtype n) {

Elemtype f = 1;

Elemtype bin[32];

switch_to_bit(b,bin);

for(int i=31; i=0; i--) {

f = (f * f) % n;

if(bin[i] == 1) {

f = (f * a) % n;

}

}

return f;

}

/* 产生密钥 */

void produce_key() {

cout"input two primes p and q:";

cinpq;

while (!(test_prime(p)test_prime(q))){

cout"wrong input,please make sure two number are both primes!"endl;

cout"input two primes p and q:";

cinpq;

};

pr.n = p * q;

pu.n = p * q;

fn = (p - 1) * (q - 1);

cout"fn = "fnendl;

cout"input e :";

cine;

while((gcd(fn,e)!=1)) {

cout"e is error,try again!";

cout"input e :";

cine;

}

pr.d = (extend_euclid(fn,e) + fn) % fn;

pu.e = e;

flag = 1;

cout"PR.d: "pr.d" PR.n: "pr.nendl;

cout"PU.e: "pu.e" PU.n: "pu.nendl;

}

/* 加密 */

void encrypt() {

if(flag == 0) {

cout"setkey first:"endl;

produce_key();

}

cout"input m:";

cinm;

c = modular_multiplication(m,pu.e,pu.n);

cout"c is:"cendl;

}

/* 解密 */

void decrypt() {

if(flag == 0) {

cout"setkey first:"endl;

produce_key();

}

cout"input c:";

cinc;

m = modular_multiplication(c,pr.d,pr.n);

cout"m is:"mendl;

}

/* 版权信息 */

void about() {

cout"*********************************************"endl;

cout"*** by Terry ***"endl;

cout"*** copyright 2010,All rights reserved by ***"endl;

cout"*** Terry,technology supported by weizuo !***"endl;

cout"*** If you have any question, please mail ***"endl;

cout"*** to 18679376@qq.com ! ***"endl;

cout"*** Computer of science and engineering ***"endl;

cout"*** XiDian University 2010-4-29 ***"endl;

cout"*********************************************"endl;

coutendlendl;

Init();

}

/* 消息映射 */

MsgMap Messagemap[] = {

{'a',about},

{'s',produce_key},

{'d',decrypt},

{'e',encrypt},

{'q',NULL}

};

/* 主函数,提供循环 */

void main() {

Init();

char d;

while((d = getchar())!='q') {

int i = 0;

while(Messagemap[i].ch) {

if(Messagemap[i].ch == d) {

Messagemap[i].handler();

break;

}

i++;

}

}

}

//欢迎分享,盗窃可耻

求 rsa简单加密算法 C代码,急!

#includeiostream

#includecmath

using namespace std;

void main()

{

int p,q;

cout"请输入两个较大的素数:"endl;

cinpq;

cout"p="p",q="qendl;

int n,o;

n=p*q;

o=(p-1)*(q-1);

cout"n="n",o="oendl;

cout"请从【0,"o-1"】中选择一个与"o"互素的数e:"endl;

int e,i;

float d;

cine;

for(i=1;;i++)

{

d=(float)(o*i+1)/e;

if(d-(int)d==0)

break;

}

cout"e="e",d="dendl;

cout"公开密钥Pk={e,n}={"e","n"}"endl;

cout"秘密密钥Sk={d,n}={"d","n"}"endl;

coutendl;

cout"请输入要加密的正整数(以-1结束):"endl;

int m1[500],m3[500],m4[500];

double m2[500];

int j;

for(j=0;j500;j++)

{

cinm1[j];

if(m1[j]==-1)

break;

m2[j]=pow(m1[j],e);

m4[j]=m2[j]/n;

m3[j]=m2[j]-m4[j]*n;

}

cout"密文为:"endl;

int k;

for(k=0;kj;k++)

coutm3[k]" ";

coutendl;

}

RSA加密算法对字符串加密(C++语言)看见你之前回答过这个问题,可不可以把源代码给我?

我来说几句没代码的吧,另外我是搞JAVA的!

RSA是不对称的加密算法,涉及到一对密钥:公钥和私钥,公钥是公开的,别人想给我发送信息就用公钥进行加密,私钥是自己独有,收到别人发送的密文,就用私钥进行解密。

生成公钥与私钥

选择一对不同的、足够大(是后面的n大于消息数)的素数p、q,计算n=p*q,f(n)=p*q。

找一个与f(n)互质的数e,计算d,让d*e模f(n)=1(打不出同余符号,就是让d*e与1模f(n)结果一样)。

公钥(e,n),私钥(d,n)

设明文为M,

加密:密文=M的e次方 mod n

解密:明文=密文的d次方 mod n

例子:取p=5、q=11。

n=55,f(n)=40,

去e=3

d=27,

公钥(3,55),私钥(27,55)

对字符串 “FLY”加密,先将按A-1,B-2……,z-26将其数字化,得到6,12,25

6的3次方mod55=51,

12的3次方mod55=23,

25的3次方mod55=5,

密文51,23,5

解密:

51的27次方mod55=6,

23的27次方mod55=12

5的27次方mod55=25,

基本思路就这样,不过实现过程会涉及到大数,推荐一个算mod的方法:

(A+B)的n次方对C取模,设A mod C=0,那么(A+B)的n次方mod C=B的n次方mod C,

以上面51的27次方mod55为例:

51的27次方=51的3次方的9次方=132651的9次方,132651=2411*55+46,

那么51的27次方mod55=(2411*55+46)的9次方mod55=46的9次方mod55,

以此类推,上式继续=97336的三次方mod55=41的三次方mod55=6;

关于rsa加密算法源代码和rsa算法加密和解密举例的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/31400.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载