导航:首页 > 源码编译 > rsa提供编译码的代码

rsa提供编译码的代码

发布时间:2024-01-09 14:39:50

❶ 求RSA算法的源代码(c语言)

这个是我帮个朋友写的,写的时候发现其实这个没那么复杂,不过,时间复杂度要高于那些成型了的,为人所熟知的rsa算法的其他语言实现.
#include
int
candp(int
a,int
b,int
c)
{
int
r=1;
b=b+1;
while(b!=1)
{
r=r*a;
r=r%c;
b--;
}
printf("%d",r);
return
r;
}
void
main()
{
int
p,q,e,d,m,n,t,c,r;
char
s;
{printf("input
the
p:\n");
scanf("%d\n",&p);
printf("input
the
q:\n");
scanf("%d%d\n",&p);
n=p*q;
printf("so,the
n
is
%3d\n",n);
t=(p-1)*(q-1);
printf("so,the
t
is
%3d\n",t);
printf("please
intput
the
e:\n");
scanf("%d",&e);
if(e<1||e>t)
{printf("e
is
error,please
input
again;");
scanf("%d",&e);}
d=1;
while
(((e*d)%t)!=1)
d++;
printf("then
caculate
out
that
the
d
is
%5d",d);
printf("if
you
want
to
konw
the
cipher
please
input
1;\n
if
you
want
to
konw
the
plain
please
input
2;\n");
scanf("%d",&r);
if(r==1)
{
printf("input
the
m
:"
);/*输入要加密的明文数字*/
scanf("%d\n",&m);
c=candp(m,e,n);
printf("so
,the
cipher
is
%4d",c);}
if(r==2)
{
printf("input
the
c
:"
);/*输入要解密的密文数字*/
scanf("%d\n",&c);
m=candp(c,d,n);
printf("so
,the
cipher
is
%4d\n",m);
printf("do
you
want
to
use
this
programe:yes
or
no");
scanf("%s",&s);
}while(s=='y');
}
}

java RSA算法实现256位密钥怎么做

【下载实例】本文介绍RSA2加密与解密,RSA2是RSA的加强版本,在密钥长度上采用2048, RSA2比RSA更安全,更可靠, 本人的另一篇文章RSA已经发表,有想了解的可以点开下面的RSA文章

❸ rsa算法中p,q,n,e,d一般大小都为多少啊

RSA遭受攻击的很多情况是因为算法实现的一些细节上的漏洞所导致的,所以在使用RSA算法构造密码系统时,为保证安全,在生成大素数的基础上,还必须认真仔细选择参数,防止漏洞的形成。根据RSA加解密过程,其主要参数有三个:模数N,加密密钥e,解密密钥d。
3.4.1 模数N的确定
虽然迄今人们无法证明,破解RSA系统等于对N因子分解,但一般相信RSA系统的安全性等同于因子分解,即:若能分解因子N,即能攻破RSA系统,若能攻破RSA系统,即能分解因子Ⅳ。因此,在使用RSA系统时,对于模数N的选择非常重要。在RSA算法中,通过产生的两个大素数p和q相乘得到模数N,而后分别通过对它们的数学运算得到密钥对。由此,分解模数N得到p和q是最显然的攻击方法,当然也是最困难的方法,如果模数N被分解,攻击者利用得到的P和q便可计算出,进而通过公开密钥e由解密密钥d,则RSA体制立刻被攻破。相当一部分的对RSA的攻击就是试图分解模数N,选择合适的N是实现RSA算法并防止漏洞的重要环节。一般地,模数N的确定可以遵循以下几个原则:
①p和q之差要大。
当p和q相差很小时,在已知n的情况下,可假定二者的平均值为,然后利用,若等式右边可开方,则得到及,即N被分解。
②p-1和q-1的最大公因子应很小。
③p和q必须为强素数。
一素数p如果满足:
条件一:存在两个大素数,,使得|p-1且|p+1;
条件二:存在四个大素数,,,使得。则此素数为强素数。其中,,,称为3级的素数,,称为2级的素数,p则称为1级的素数,很明显地,任何素数均为3级的素数。只有两个强素数的积所构成的N,其因子分解才是较难的数学问题。
④p和q应大到使得因子分解N为计算上不可能。
RSA的安全性依赖于大数的因子分解,若能因子分解模数N,则RSA即被攻破,因此模数N必须足够大直至因子分解N在计算上不可行。因子分解问题为密码学最基本的难题之一,如今,因子分解的算法已有长足的进步,但仍不足以说明RSA可破解。为保证安全性,实际应用中所选择的素数P和拿至少应该为300位以上的二进制数,相应的模数N将是600位以上的二进制数。
目前,SET(Secure Electronic Transaction)协议中要求CA采用2048比特长的密钥,其他实体使用1024比特的密钥。随着计算能力的提高和分布式运算的发展,安全密钥的长度将是动态增长的。
Jadith Moore给出了使用RSA时有关模数的一些限制:
①若给定模数的一个加/解密密钥指数对已知,攻击者就能分解这个模数。
②若给定模数的一个加/解密密钥指数对已知,攻击者无需分解模数Ⅳ就可以计算出别的加/解密密钥指数对。
③在通信网络中,利用RSA的协议不应该使用公共模数。
④消息应该用随机数填充以避免对加密指数的攻击。
3.4.2 e的选取原则
在RSA算法中,e和互质的条件容易满足,如果选择较小的e,则加、解密的速度加快,也便于存储,但会导致安全问题。
一般地,e的选取有如下原则:
①e不能够太小。在RSA系统中,每人的公开密钥P只要满足即可,也即e可以任意选择,为了减少加密运算时间,很多人采用尽可能小的e值,如3。但是已经证明低指数将会导致安全问题,故此,一般选择e为16位的素数,可以有效防止攻击,又有较快速度。
②e应选择使其在的阶为最大。即存在i,使得,
可以有效抗击攻击。
3.4.3 d的选取原则
一般地,私密密钥d要大于。在许多应用场合,常希望使用位数较短的密钥以降低解密或签名的时间。例如IC卡应用中,IC卡CPU的计算能力远低于计算机主机。长度较短的d可以减少IC卡的解密或签名时间,而让较复杂的加密或验证预算(e长度较长)由快速的计算机主机运行。一个直接的问题就是:解密密钥d的长度减少是否会造成安全性的降低?很明显地,若d的长度太
小,则可以利用已知明文M加密后得,再直接猜测d,求出是否等于M。若是,则猜测J下确,否则继续猜测。若d的长度过小,则猜测的空间变小,猜中的可能性加大,已有证明当时,可以由连分式算法在多项式时间内求出d值。因此其长度不能过小。

❹ 求正确的RSA加密解密算法C语言的,多谢。

//rsa.h
#include<stdio.h>
#defineMAX_NUM63001
#defineMAX_PRIME251

//!返回代码
#defineOK100
#defineERROR_NOEACHPRIME101
#defineERROR_NOPUBLICKEY102
#defineERROR_GENERROR103

unsignedintMakePrivatedKeyd(unsignedintuiP,unsignedintuiQ);
unsignedintGetPrivateKeyd(unsignedintiWhich);
unsignedintMakePairkey(unsignedintuiP,unsignedintuiQ,unsignedintuiD);
unsignedintGetPairKey(unsignedint&d,unsignedint&e);
voidrsa_encrypt(intn,inte,char*mw,intiLength,int*&cw);
voidrsa_decrypt(intn,intd,int*&cw,intcLength,char*mw);
voidoutputkey();

//rsa.c
#include"rsa.h"
//!保存私钥d集合
structpKeyset
{
unsignedintset[MAX_NUM];
unsignedintsize;
}pset;

//!保存公、私钥对
structpPairkey
{
unsignedintd;
unsignedinte;
unsignedintn;
}pairkey;

//名称:isPrime
//功能:判断两个数是否互质
//参数:m:数a;n:数b
//返回:m、n互质返回true;否则返回false

boolisPrime(unsignedintm,unsignedintn)
{
unsignedinti=0;
boolFlag=true;

if(m<2||n<2)
returnfalse;

unsignedinttem=(m>n)?n:m;
for(i=2;i<=tem&&Flag;i++)
{
boolmFlag=true;
boolnFlag=true;
if(m%i==0)
mFlag=false;
if(n%i==0)
nFlag=false;
if(!mFlag&&!nFlag)
Flag=false;
}
if(Flag)
returntrue;
else
returnfalse;
}

//名称:MakePrivatedKeyd
//功能:由素数Q、Q生成私钥d
//参数:uiP:素数P;uiQ:素数Q
//返回:私钥d

unsignedintMakePrivatedKeyd(unsignedintuiP,unsignedintuiQ)
{
unsignedinti=0;

//!得到所有与z互质的数(私钥d的集合)
unsignedintz=(uiP-1)*(uiQ-1);
pset.size=0;
for(i=0;i<z;i++)
{
if(isPrime(i,z))
{
pset.set[pset.size++]=i;
}
}

returnpset.size;
}

//名称:MakePairKey
//功能:生成RSA公、私钥对
//参数:uiP:素数P;uiQ:素数Q;uiD:私钥d
//返回:错误代码

unsignedintMakePairkey(unsignedintuiP,unsignedintuiQ,unsignedintuiD)
{
boolbFlag=true;
unsignedinti=0,e;
unsignedintz=(uiP-1)*(uiQ-1);
unsignedintd=pset.set[uiD];
//d=uiD;

if(!isPrime(z,d))
returnERROR_NOEACHPRIME;

for(i=2;i<z;i++)
{
if((i*d)%z==1)
{
e=i;
bFlag=false;
}
}
if(bFlag)
returnERROR_NOPUBLICKEY;

if((d*e)%z!=1)
ERROR_GENERROR;

pairkey.d=d;
pairkey.e=e;
pairkey.n=uiP*uiQ;
returnOK;
}

//名称:GetPairKey
//功能:对外提供接口,获得公、私钥对
//参数:uiP:素数P;uiQ:素数Q;uiD:私钥d
//返回:

unsignedintGetPairKey(unsignedint&d,unsignedint&e)
{
d=pairkey.d;
e=pairkey.e;
returnpairkey.n;
}

//名称:GetPrivateKeyd
//功能:对外提供接口,由用户选择ID得以私钥d
//参数:iWhich:用户选择私钥d的ID
//返回:私钥d值

unsignedintGetPrivateKeyd(unsignedintiWhich)
{
if(pset.size>=iWhich)
returnpset.set[iWhich];
else
return0;
}

//名称:rsa_encrypt
//功能:RSA加密运算
//参数:n:公钥n;e:公钥e;mw:加密明文;iLength:明文长度;cw:密文输出
//返回:无

voidrsa_encrypt(intn,inte,char*mw,intmLength,int*&cw)
{
inti=0,j=0;
__int64temInt=0;

for(i=0;i<mLength;i++)
{
temInt=mw[i];
if(e!=0)
{
for(j=1;j<e;j++)
{
temInt=(temInt*mw[i])%n;
}
}
else
{
temInt=1;
}

cw[i]=(int)temInt;
}
}

//名称:rsa_decrypt
//功能:RSA解密运算
//参数:n:私钥n;d:私钥d;cw:密文;cLength:密文长度;mw:明文输出
//返回:无

voidrsa_decrypt(intn,intd,int*&cw,intcLength,char*mw)
{
inti=0,j=-1;
__int64temInt=0;

for(i=0;i<cLength/4;++i)
{
mw[i]=0;
temInt=cw[i];

if(d!=0)
{
for(j=1;j<d;j++)
{
temInt=(__int64)(temInt*cw[i])%n;
}
}
else
{
temInt=1;
}

mw[i]=(char)temInt;
}
}
voidoutputkey()
{
printf("PublicKey(e,n):(%d,%d) ",pairkey.e,pairkey.n);
printf("PrivateKey(d,n):(%d,%d) ",pairkey.d,pairkey.n);
}

//main.c
//工程:RSA
//功能:RSA加、解密文件
//作者:jlcss|ExpNIS


#include<stdio.h>
#include<afxwin.h>
#include<math.h>
#include"rsa.h"

#defineDECRYPT_FILE"RSA加密密文.txt"
#defineENCRYPT_FILE"RSA解密明文.txt"
//!约束文件最大2M
#defineMAX_FILE1024*1024*2

//名称:usage
//功能:帮助信息
//参数:应用程序名称
//返回:提示信息

voidUsage(constchar*appname)
{
printf(" usage:rsa-k素数P素数Q ");
printf(" usage:rsa-e明文文件公钥e公钥n ");
printf(" usage:rsa-d密文文件私钥d私钥n ");
}

//名称:IsNumber
//功能:判断数字字符数组
//参数:strNumber:字符数组
//返回:数字字组数组返回true,否则返回false;

boolIsNumber(constchar*strNumber)
{
unsignedinti;

if(!strNumber)
returnfalse;

for(i=0;i<strlen(strNumber);i++)
{
if(strNumber[i]<'0'||strNumber[i]>'9')
returnfalse;
}

returntrue;
}

//名称:IsPrimeNumber
//功能:判断素数
//参数:num:输入整数
//返回:素数返回true,否则返回false;

boolIsPrimeNumber(unsignedintnum)
{
unsignedinti;
if(num<=1)
returnfalse;

unsignedintsqr=(unsignedint)sqrt((double)num);
for(i=2;i<=sqr;i++)
{
if(num%i==0)
returnfalse;
}

returntrue;
}

//名称:FileIn
//功能:读取磁盘文件到内存
//参数:strFile:文件名称;inBuff:指向文件内容缓冲区
//返回:实际读取内容大小(字节)

intFileIn(constchar*strFile,unsignedchar*&inBuff)
{
intiFileLen=0,iBuffLen=0;

//!打开密文文件
CFilefile(strFile,CFile::modeRead);
iFileLen=(int)file.GetLength();
if(iFileLen>MAX_FILE)
{
printf("文件长度不能大于%dM,! ",MAX_FILE/(1024*1024));
gotoout;
}
iBuffLen=iFileLen;

inBuff=newunsignedchar[iBuffLen];
if(!inBuff)
gotoout;

ZeroMemory(inBuff,iBuffLen);

file.Read(inBuff,iFileLen);
file.Close();

out:
returniBuffLen;
}

//名称:FileOut
//功能:加/解密结果输出到当前目录磁盘文件中
//参数:strOut指向输出字符缓冲区,输出大小len,strFile为输出文件
//返回:无

voidFileOut(constvoid*strOut,intlen,constchar*strFile)
{
//!输出到文件
CFileoutfile(strFile,CFile::modeCreate|CFile::modeWrite);
outfile.Write(strOut,len);
outfile.Close();
}

//名称:CheckParse
//功能:校验应用程序入口参数
//参数:argc等于main主函数argc参数,argv指向main主函数argv参数
//返回:若参数合法返回true,否则返回false
//备注:简单的入口参数校验

boolCheckParse(intargc,char**argv)
{
boolbRes=false;

if(argc!=4&&argc!=5)
gotoout;

if(argc==4&&argv[1][1]=='k')
{
//!生成公、私钥对
if(!IsNumber(argv[2])||
!IsNumber(argv[3])||
atoi(argv[2])>MAX_PRIME||
atoi(argv[3])>MAX_PRIME)
gotoout;
}
elseif((argc==5)&&(argv[1][1]=='e'||argv[1][1]=='d'))
{
//!加密、解密操作
if(!IsNumber(argv[3])||
!IsNumber(argv[4])||
atoi(argv[3])>MAX_NUM||
atoi(argv[4])>MAX_NUM)
gotoout;
}
else
Usage(*argv);
bRes=true;

out:
returnbRes;
}

//名称:kOption1
//功能:程序k选项操作:由素数P、Q生成私钥d集合
//参数:uiP:程序入口参数P;uiQ:程序入口参数Q
//返回:执行正确返回生成私钥数目,否则返回0

unsignedintkOption1(unsignedintuiP,unsignedintuiQ)
{
unsignedintuiRes=0;

if(!IsPrimeNumber(uiP))
{
printf("P输入错误,P必须为(0,%d]素数",MAX_PRIME);
returnuiRes;
}
if(!IsPrimeNumber(uiQ))
{
printf("Q输入错误,Q必须为(0,%d]素数",MAX_PRIME);
returnuiRes;
}
if(uiP==uiQ)
{
printf("素数P与素数Q相同,很容易根据公钥n开平方得出素数P和Q,这种加密不安全,请更换素数! ");
returnuiRes;
}
printf("正在生成私钥d集合...... ");
uiRes=MakePrivatedKeyd(uiP,uiQ);

returnuiRes;
}

//!程序主函数
intmain(intargc,char**argv)
{
unsignedintp,q,d,n,e;//twoprimep&q,publickey(n,e),privatekey(n,d)
CheckParse(argc,argv);

d=4828;//uid
if(argc==4)
{
p=atoi(argv[2]);
q=atoi(argv[3]);
MakePrivatedKeyd(p,q);
MakePairkey(p,q,d);
outputkey();
}
elseif(argc==5)
{
charFileName[20];
strcpy(FileName,argv[2]);
intlen;
if(argv[1][1]=='e')
{
unsignedchar*inBuffer=(unsignedchar*)malloc(MAX_FILE);//输入缓冲区
int*cw=(int*)malloc(MAX_FILE);
len=FileIn(FileName,inBuffer);
e=atoi(argv[3]);
n=atoi(argv[4]);
rsa_encrypt(n,e,(char*)inBuffer,len,cw);
FileOut(cw,4*len,DECRYPT_FILE);
}
elseif(argv[1][1]=='d')
{
char*Buffer=(char*)malloc(MAX_FILE);//输入缓冲区
int*cw=(int*)malloc(MAX_FILE);
len=FileIn(FileName,(unsignedchar*&)cw);
d=atoi(argv[3]);
n=atoi(argv[4]);
rsa_decrypt(n,d,cw,len,Buffer);
FileOut(Buffer,len/4,ENCRYPT_FILE);
}
}

return0;
}

❺ “青锋爱分享”Springboot+python之RSA加解密方案(RSA深入)二

本篇文章要结合上一节文章一起看。

青锋爱分享-RSA-Springboot+Python整合

码云搜索: 青锋 会有惊喜哦哦。

通过python生成的公钥私钥 格式PKCS1 。

生成pem格式如下:

私钥头(-----BEGIN RSA PRIVATE KEY-----)

私钥尾(-----END RSA PRIVATE KEY-----)

我需要将此私钥转换为DER编码的PKCS8未加密格式,以便与java服务器代码一起使用,特别是PKCS8EncodedKeySpec。我已经试过使用rsa和pkcs8命令的OpenSSL,如果有更简单的办法,没有特别需要使用openssl。

RSA私钥格式PKCS1和PKCS8相互转换

RSA公钥格式PKCS1和PKCS8相互转换

以下转换基于openssl命令的操作;

执行:openssl genrsa -out private.pem 1024

-----BEGIN RSA PRIVATE KEY-----

MIICXQIBAAKBgQDlLm5++/wwSfq5KfY

H8q1AO/

Uo4OMcmoSz3IAp/7//ewIDAQAB

AoGBAJkMdvF+i9Kzc6YqMC0rfQJ3Zs+vFOtsbmQVAMnQ8JWBCJ1O8d/c60wRQgyb

lFCyO7VXOmoIJqX/Jr2aER8bFtG+

lOdOay7TkE45X/Wc7K9iZs2uuB7sylIvK/HVxxit6FGePa4RAkEA9e+VoAbxBv78

HyxRcStW+

n0UxgT55MPXWGdMRXUUOCNnMilaw/

HvK0IW3zpOgf/+/W565ROI/fjkR1qCD

rZJeHgqMWDlIUuR9+BdBAkAI8+

puQxMonRWTN+

-----END RSA PRIVATE KEY-----


执行:openssl pkcs8 -topk8 -inform PEM -in private.pem -outform pem -nocrypt -out pkcs8.pem


-----BEGIN PRIVATE KEY-----

+n

yHOOfV+XbBPsC7aWblIS3Pqv7/DBJ+/T

uaDSVA4K8Tmx22YC8PZ7HfAJ5/yVaaB2HmpSjg4xyahLPcgCn/v8WcxqDUh6VJ92

/

Q3fic/

+

nt0qVQJAOmMZ67caK+YHZ0M3Rp3adQgF+

//6OHlRQIElgect4wb

CbtfXWu9AfXNbTlXH39bnrlE4j9+

Yt1Zx5df0+

HLU0VEwSQa7rvmY=

-----END PRIVATE KEY-----


执行:openssl rsa -in pkcs8.pem -out pkcs1.pem


-----BEGIN RSA PRIVATE KEY-----

MIICXQIBAAKBgQDlLm5++/wwSfq5KfY

H8q1AO/

Uo4OMcmoSz3IAp/7//ewIDAQAB

AoGBAJkMdvF+i9Kzc6YqMC0rfQJ3Zs+vFOtsbmQVAMnQ8JWBCJ1O8d/c60wRQgyb

lFCyO7VXOmoIJqX/Jr2aER8bFtG+

lOdOay7TkE45X/Wc7K9iZs2uuB7sylIvK/HVxxit6FGePa4RAkEA9e+VoAbxBv78

HyxRcStW+

n0UxgT55MPXWGdMRXUUOCNnMilaw/

HvK0IW3zpOgf/+/W565ROI/fjkR1qCD

rZJeHgqMWDlIUuR9+BdBAkAI8+

puQxMonRWTN+

-----END RSA PRIVATE KEY-----


可以看出结果和1是一致的;

执行:openssl rsa -in private.pem -pubout -out public.pem


-----BEGIN PUBLIC KEY-----

+Kosybacfp8hzjn1fl2wT

7Au2lm5SEtz6r+/wwSfq5KfYH8q1AO/

/7/FnMag1IelSfdronPBDxazp6

NUmQZITsYK6CsEl/ewIDAQAB

-----END PUBLIC KEY-----


5. 从pkcs8私钥中生成pkcs8公钥
执行:openssl rsa -in pkcs8.pem -pubout -out public_pkcs8.pem


-----BEGIN PUBLIC KEY-----

+Kosybacfp8hzjn1fl2wT

7Au2lm5SEtz6r+/wwSfq5KfYH8q1AO/

/7/FnMag1IelSfdronPBDxazp6

NUmQZITsYK6CsEl/ewIDAQAB

-----END PUBLIC KEY-----


可以看出结果和4是一样的;

执行:openssl rsa -pubin -in public.pem -RSAPublicKey_out


-----BEGIN RSA PUBLIC KEY-----

MIGJAoGBAOUubn4qizJtpx+nyHOOfV+XbBPsC7aWblIS3Pqv7/DBJ+rkp9gfyrUA

78L3YjASmmU1uupiY5dC7o/TuaDSVA4K8Tmx22YC8PZ7HfAJ5/yVaaB2HmpSjg4x

yahLPcgCn/=

-----END RSA PUBLIC KEY-----



openssl rsa -pubin -in public_pkcs8.pem -RSAPublicKey_out


-----BEGIN RSA PUBLIC KEY-----

MIGJAoGBAOUubn4qizJtpx+nyHOOfV+XbBPsC7aWblIS3Pqv7/DBJ+rkp9gfyrUA

78L3YjASmmU1uupiY5dC7o/TuaDSVA4K8Tmx22YC8PZ7HfAJ5/yVaaB2HmpSjg4x

yahLPcgCn/=

-----END RSA PUBLIC KEY-----


可以看出转换的结果是一致的;

执行:openssl rsa -RSAPublicKey_in -in pub_pkcs1.pem -pubout


-----BEGIN PUBLIC KEY-----

+Kosybacfp8hzjn1fl2wT

7Au2lm5SEtz6r+/wwSfq5KfYH8q1AO/

/7/FnMag1IelSfdronPBDxazp6

NUmQZITsYK6CsEl/ewIDAQAB

-----END PUBLIC KEY-----


可以看到和上面4,5的结果是一致的;

最后一点:
iOS上用的是pkcs8格式的公钥
openssl用的是pkcs1格式的公钥
知道私钥以后是可以导出公钥的,所以私钥一定要保证安全
知道公钥不可以导出私钥


解决方案针对是window电脑。

配置:SystemRoot/ System32 环境变量。

1、邮件我的电脑-选择下【属性】。

2、选择高级系统设置

3、选择【高级】-【环境变量】

4、双击打开path,进行编辑

5、 接着我们在这名字后面加【;System32】就可以了。

安装 Win64 OpenSSL,地址: http://slproweb.com/procts/Win32OpenSSL.html

下载后根据提示一步一步安装,安装完成后:

双击start.bat 启动

❻ 如何实现用javascript实现rsa加解密

用javascript实现rsa加解密的实现方式是通过PKCS完成的。
1、整个定义的function

function pkcs1pad2(s,n) {
if(n < s.length + 11) { // TODO: fix for utf-8
alert("Message too long for RSA");
return null;
}
var ba = new Array();
var i = s.length - 1;
while(i >= 0 && n > 0) {
var c = s.charCodeAt(i--);
//UTF-8编码为变长字节,使用实际的字节来记录
if(c < 128) { // encode using utf-8
ba[--n] = c;
}
else if((c > 127) && (c < 2048)) {
ba[--n] = (c & 63) | 128;
ba[--n] = (c >> 6) | 192;
}
else {
ba[--n] = (c & 63) | 128;
ba[--n] = ((c >> 6) & 63) | 128;
ba[--n] = (c >> 12) | 224;
}
}
//实际输入拼装结束,将下一位赋值为0标记结束
ba[--n] = 0;
var rng = new SecureRandom();
var x = new Array();
//拼接随机非0字节
while(n > 2) { // random non-zero pad
x[0] = 0;
while(x[0] == 0) rng.nextBytes(x);
ba[--n] = x[0];
}
//这两位做简单的校验
ba[--n] = 2;
ba[--n] = 0;
return new BigInteger(ba);
}
该方法中对UTF-8字符进行了兼容,并且在拼装完实际输入的字符后,还拼装了随机的字节,使用拼装后的字符串去加密。由于每次拼装的结果是随机的,这样每次加密后的密文都不同。
2、调用方法:;
function RSAEncrypt(text) {
var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3);
if(m == null) return null;
var c = this.doPublic(m);
if(c == null) return null;
var h = c.toString(16);
if((h.length & 1) == 0) return h; else return "0" + h;
}

❼ 如何实现用javascript实现rsa加解密

  1. 服务端生成公钥与私钥,保存。

  2. 客户端在请求到登录页面后,随机生成一字符串。

  3. 后此随机字符串作为密钥加密密码,再用从服务端获取到的公钥加密生成的随机字符串

  4. 将此两段密文传入服务端,服务端用私钥解出随机字符串,再用此私钥解出加密的密文。这其中有一个关键是解决服务端的公钥,传入客户端,客户端用此公钥加密字符串后,后又能在服务端用私钥解出。

步骤:

  1. 服务端的RSAJava实现:

    /**
    *
    */
    packagecom.sunsoft.struts.util;

    importjava.io.ByteArrayOutputStream;
    importjava.io.FileInputStream;
    importjava.io.FileOutputStream;
    importjava.io.ObjectInputStream;
    importjava.io.ObjectOutputStream;
    importjava.math.BigInteger;
    importjava.security.KeyFactory;
    importjava.security.KeyPair;
    importjava.security.KeyPairGenerator;
    importjava.security.NoSuchAlgorithmException;
    importjava.security.PrivateKey;
    importjava.security.PublicKey;
    importjava.security.SecureRandom;
    importjava.security.interfaces.RSAPrivateKey;
    importjava.security.interfaces.RSAPublicKey;
    importjava.security.spec.InvalidKeySpecException;
    importjava.security.spec.RSAPrivateKeySpec;
    importjava.security.spec.RSAPublicKeySpec;

    importjavax.crypto.Cipher;/**
    *RSA工具类。提供加密,解密,生成密钥对等方法。
    *需要到
    下载bcprov-jdk14-123.jar。
    *
    */
    publicclassRSAUtil{
    /**
    **生成密钥对*
    *
    *@returnKeyPair*
    *@throwsEncryptException
    */
    ()throwsException{
    try{
    KeyPairGeneratorkeyPairGen=KeyPairGenerator.getInstance("RSA",
    neworg.bouncycastle.jce.provider.BouncyCastleProvider());
    finalintKEY_SIZE=1024;//没什么好说的了,这个值关系到块加密的大小,可以更改,但是不要太大,否则效率会低
    keyPairGen.initialize(KEY_SIZE,newSecureRandom());
    KeyPairkeyPair=keyPairGen.generateKeyPair();
    saveKeyPair(keyPair);
    returnkeyPair;
    }catch(Exceptione){
    thrownewException(e.getMessage());
    }
    }

    publicstaticKeyPairgetKeyPair()throwsException{
    FileInputStreamfis=newFileInputStream("C:/RSAKey.txt");
    ObjectInputStreamoos=newObjectInputStream(fis);
    KeyPairkp=(KeyPair)oos.readObject();
    oos.close();
    fis.close();
    returnkp;
    }

    publicstaticvoidsaveKeyPair(KeyPairkp)throwsException{

    FileOutputStreamfos=newFileOutputStream("C:/RSAKey.txt");
    ObjectOutputStreamoos=newObjectOutputStream(fos);
    //生成密钥
    oos.writeObject(kp);
    oos.close();
    fos.close();
    }

    /**
    **生成公钥*
    *
    *@parammolus*
    *@parampublicExponent*
    *@returnRSAPublicKey*
    *@throwsException
    */
    (byte[]molus,
    byte[]publicExponent)throwsException{
    KeyFactorykeyFac=null;
    try{
    keyFac=KeyFactory.getInstance("RSA",
    neworg.bouncycastle.jce.provider.BouncyCastleProvider());
    }catch(NoSuchAlgorithmExceptionex){
    thrownewException(ex.getMessage());
    }

    RSAPublicKeySpecpubKeySpec=newRSAPublicKeySpec(newBigInteger(
    molus),newBigInteger(publicExponent));
    try{
    return(RSAPublicKey)keyFac.generatePublic(pubKeySpec);
    }catch(InvalidKeySpecExceptionex){
    thrownewException(ex.getMessage());
    }
    }

    /**
    **生成私钥*
    *
    *@parammolus*
    *@paramprivateExponent*
    *@returnRSAPrivateKey*
    *@throwsException
    */
    (byte[]molus,
    byte[]privateExponent)throwsException{
    KeyFactorykeyFac=null;
    try{
    keyFac=KeyFactory.getInstance("RSA",
    neworg.bouncycastle.jce.provider.BouncyCastleProvider());
    }catch(NoSuchAlgorithmExceptionex){
    thrownewException(ex.getMessage());
    }

    RSAPrivateKeySpecpriKeySpec=newRSAPrivateKeySpec(newBigInteger(
    molus),newBigInteger(privateExponent));
    try{
    return(RSAPrivateKey)keyFac.generatePrivate(priKeySpec);
    }catch(InvalidKeySpecExceptionex){
    thrownewException(ex.getMessage());
    }
    }

    /**
    **加密*
    *
    *@paramkey
    *加密的密钥*
    *@paramdata
    *待加密的明文数据*
    *@return加密后的数据*
    *@throwsException
    */
    publicstaticbyte[]encrypt(PublicKeypk,byte[]data)throwsException{
    try{
    Ciphercipher=Cipher.getInstance("RSA",
    neworg.bouncycastle.jce.provider.BouncyCastleProvider());
    cipher.init(Cipher.ENCRYPT_MODE,pk);
    intblockSize=cipher.getBlockSize();//获得加密块大小,如:加密前数据为128个byte,而key_size=1024
    //加密块大小为127
    //byte,加密后为128个byte;因此共有2个加密块,第一个127
    //byte第二个为1个byte
    intoutputSize=cipher.getOutputSize(data.length);//获得加密块加密后块大小
    intleavedSize=data.length%blockSize;
    intblocksSize=leavedSize!=0?data.length/blockSize+1
    :data.length/blockSize;
    byte[]raw=newbyte[outputSize*blocksSize];
    inti=0;
    while(data.length-i*blockSize>0){
    if(data.length-i*blockSize>blockSize)
    cipher.doFinal(data,i*blockSize,blockSize,raw,i
    *outputSize);
    else
    cipher.doFinal(data,i*blockSize,data.length-i
    *blockSize,raw,i*outputSize);
    //这里面doUpdate方法不可用,查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到
    //ByteArrayOutputStream中,而最后doFinal的时候才将所有的byte[]进行加密,可是到了此时加密块大小很可能已经超出了
    //OutputSize所以只好用dofinal方法。

    i++;
    }
    returnraw;
    }catch(Exceptione){
    thrownewException(e.getMessage());
    }
    }

    /**
    **解密*
    *
    *@paramkey
    *解密的密钥*
    *@paramraw
    *已经加密的数据*
    *@return解密后的明文*
    *@throwsException
    */
    publicstaticbyte[]decrypt(PrivateKeypk,byte[]raw)throwsException{
    try{
    Ciphercipher=Cipher.getInstance("RSA",
    neworg.bouncycastle.jce.provider.BouncyCastleProvider());
    cipher.init(cipher.DECRYPT_MODE,pk);
    intblockSize=cipher.getBlockSize();
    ByteArrayOutputStreambout=newByteArrayOutputStream(64);
    intj=0;

    while(raw.length-j*blockSize>0){
    bout.write(cipher.doFinal(raw,j*blockSize,blockSize));
    j++;
    }
    returnbout.toByteArray();
    }catch(Exceptione){
    thrownewException(e.getMessage());
    }
    }

    /**
    ***
    *
    *@paramargs*
    *@throwsException
    */
    publicstaticvoidmain(String[]args)throwsException{
    RSAPublicKeyrsap=(RSAPublicKey)RSAUtil.generateKeyPair().getPublic();
    Stringtest="helloworld";
    byte[]en_test=encrypt(getKeyPair().getPublic(),test.getBytes());
    byte[]de_test=decrypt(getKeyPair().getPrivate(),en_test);
    System.out.println(newString(de_test));
    }
    }
  2. 测试页面IndexAction.java:

    /*
    *GeneratedbyMyEclipseStruts
    *Templatepath:templates/java/JavaClass.vtl
    */
    packagecom.sunsoft.struts.action;

    importjava.security.interfaces.RSAPrivateKey;
    importjava.security.interfaces.RSAPublicKey;

    importjavax.servlet.http.HttpServletRequest;
    importjavax.servlet.http.HttpServletResponse;

    importorg.apache.struts.action.Action;
    importorg.apache.struts.action.ActionForm;
    importorg.apache.struts.action.ActionForward;
    importorg.apache.struts.action.ActionMapping;

    importcom.sunsoft.struts.util.RSAUtil;

    /**
    *MyEclipseStruts
    *Creationdate:06-28-2008
    *
    *XDocletdefinition:
    *@struts.actionvalidate="true"
    */
    {
    /*
    *GeneratedMethods
    */

    /**
    *Methodexecute
    *@parammapping
    *@paramform
    *@paramrequest
    *@paramresponse
    *@returnActionForward
    */
    publicActionForwardexecute(ActionMappingmapping,ActionFormform,
    HttpServletRequestrequest,HttpServletResponseresponse)throwsException{

    RSAPublicKeyrsap=(RSAPublicKey)RSAUtil.getKeyPair().getPublic();
    Stringmole=rsap.getMolus().toString(16);
    Stringempoent=rsap.getPublicExponent().toString(16);
    System.out.println("mole");
    System.out.println(mole);
    System.out.println("empoent");
    System.out.println(empoent);
    request.setAttribute("m",mole);
    request.setAttribute("e",empoent);
    returnmapping.findForward("login");
    }
    }

    通过此action进入登录页面,并传入公钥的Molus 与PublicExponent的hex编码形式。

阅读全文

与rsa提供编译码的代码相关的资料

热点内容
windows程序设计核心编程 浏览:444
任我充app怎么开发票 浏览:330
人工智能与编程语言 浏览:406
linux网络编程服务器 浏览:800
海尔32cw空调压缩机电容多大 浏览:747
分区加密了该怎么办 浏览:103
索尼延时拍摄app怎么导入 浏览:226
冰箱冷冻坏了压缩机一直响 浏览:807
windows服务器如何组建raid0 浏览:180
橡胶压缩空气管 浏览:556
如果出现编译错误如何解决 浏览:924
程序员饰品 浏览:430
什么叫网站服务器站点 浏览:686
java转义字符双引号 浏览:779
网上考场的app怎么看真假 浏览:644
四层电梯的plc编程 浏览:899
程序员的职场 浏览:662
圆形平面怎么编程 浏览:67
python开源代码下载 浏览:661
如何连接局域网宽带连接服务器地址 浏览:171