1. 首页 > 科技 >

rsa2048加密 rsa2048加密计算方法

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

get_d_e(int

参考下面代码:

rsa2048加密 rsa2048加密计算方法rsa2048加密 rsa2048加密计算方法


// 还原随机码偏移

tn2=str2num(argv[4]);ry {

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",

new org.bouncycastle.jce.provider.BouncyCastleProvider());

final int KEY_SIZE = 128;// 没什么好说的了,这个值关系到块加密的大小,可以更改,但是不要太大,否则效率会低

keyPairGen.initialize(KEY_SIZE, new SecureRandom());

KeyPair keyPair = keyPairGen.generateKeyPair();

return keyPair;

} catch (Exception e) {

throw new Exception(e.getMessage());

}

rsa和rsa的区别

RSA公钥和私钥是什么?

首先来说,RSA是一种非对称加密算法,它是由三位数学家(Rivest、Sha、Adleman)设计出来的。非对称加密是相对于对称加密而言的。对称加密算法是指加密解密使用的是同一个秘钥,而非对称加密是由两个密钥(公钥、私钥)来进行加密解密的,由此可见非对称加密安全性更高。

公钥顾名思义就是公开的密钥会发放}int rnd(int max) //生成随机数 2~max 用来生成e,给多个持有人,而私钥是私有密码往往只有一个持有人。

公私钥特性

公钥与私钥是成对出现的;

私钥文件中包含了公钥数据{printf("Invaild,所以可以基于私钥导出公钥;

密钥越长,越难,所以2048位密钥比1024位密钥要更安全;

公钥和私钥都是密钥,被公开的那个就是公钥,没有被公开的那个就是私钥。

公钥和私钥都可用于加密和解密

公钥和私钥都可以用于加解密作,用公钥加密的数据只能由对应的私钥解密,反之亦然。虽说两者都可用于加密,但是不同场景使用不同的密钥来加密,规则如下:

1、私钥用于签名、公钥用于验签

签名和加密作用不同,签名并不是为了保密,而是为了保证这个签名是由特定的某个人签名的,而不是被其它人伪造的签名,所以私钥的私有性就适合用在签名用途上。

私钥签名后,只能由对应的公钥解密,公钥又是公开的(很多人可持有),所以这些人拿着公钥来解密,解密成功后就能判断出是持有私钥的人做的签名,验证了身份合法性。

2、公钥用于加密、私钥用于解密,这才能起到加密作用

因为公钥是公开的,很多人可以持有result = mod result % _Modulus;公钥。若用私钥加密,那所有持有公钥的人都可以进行解密,这是不安全的!

若用公钥加密,那只能由私钥解密,而私钥是私有不公开的,只能由特定的私钥持有人解密,保证的数据的安全性。

rsa和rsa的区别,首先来说,RSA是一种非对称加密算法,它是由三位数学家(Rivest、Sha、Adleman)设计出来的。非对称加密是相对于对称加密而言的。对称加密算法是指加密解密使用的是同一个秘钥,而非对称加密是由两个密钥(公钥、私钥)来进行加密解密的,由此可见非对称加密安全性更高。

公钥顾名思义就是公开的密钥会发放给多个持有人,而私钥是私有密码往往只有一个持有人。

公钥加密、私钥解密、私钥签名、公钥验签。加密是防止信息泄露,而签名是为了防止信息被篡改。

天威诚信的vTrus SSL证书哪里好?

DigiCert/Symantec、GeoT系统的太慢,用了别人的rust、GlobalSign这三个品牌都是知名的。

DigiCert/Symantec是全球大数字证书品牌,主打安全,加密和安全级别是各大银行、金融投资理财公司的。建设银行、银行、工商银行、交通银行都是使用的DigiCert/Symantec的SSL证书。

GeoTrust是全球第二大数字证书品牌,性价比的数字证书品牌,加密数据安全有保障。知乎就是使用的GeoTrust的证书。

GlobalSiexit(0);gn,也是全球知名的数字证书品牌,国内,给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。京东、淘宝、百度都是使用的他的证书。

下面的密码算法,哪一种是公钥密码算法.a.des b.aes c.idea d.rsa

exit(0);

AES-256和RSA-2048可以,用RSA加密密匙,AES加密数据,因为非对称算法{if((ed)%t==1)加密数据速度实在太慢,所以用非对称算法加密数据根本行不通,但是安全性非常高。

}//可以不用,用sqrt()也可以

中行新网银数字证书是握奇还是文鼎创

printf("Usage:

中银E盾的序列号实际为预植的CA证书编号,其编码规则如下:

}} else {

第1-5位为银行代码:95566(银行);

第6位为厂商代码: 0(握奇二代)、1(恒宝二代)、2(飞天二代)、3(文鼎创二代)、4(握奇音频)、5(飞天音频) 、6(文鼎创音频) intPart;、A(握奇一代)、B(飞天一代)、S为软证书。

第7位为证书代码:A、B为个人CFCA(RSA1024)双证;C、D为个人CFCA( RSA2048)双证;E、F为个人国密双证(SM2双证);Z、Y为企业CFCA(RSA1024)双证;W、X为企业CFCA( RSA2048)双证;U、V为企业国密双证(SM2双证);0-8位个人CFCA单证;9为企业CFCA单证。

第8-15位为证书序列号。

第16位为校验位:通过对前15位的加密计算生产,无规律。

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

=x;

RSA遭受攻击的很多情况是因为算法实现的一些细节上的漏洞所导致的,所以在使用RSA算法构造密码系统时,为保证安全,在生成大素数的基础上,还必须认真仔细选择参数,防止漏洞的形成。根据RSA加解密过程,其主要参数有三个:模数N,加密密钥e,解密密钥d。

}r=pq;

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和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值。因此其长度不能过小。

#include

#include

#include

#include

int str2num(char str) //字符转数字

{int i=0,num=0;

for(i=0;i<(int)strlen(str);i++)

num=num10+str[i]-'0';

return num;

}float CarmSqrt(float x) //求平方根 系统的太慢,用了别人的

{union

{int intPart;

float floatPart;

}convertor;

union

{int intPart;

float floatPart;

}convertor2;

convertor.floatPart = x;

convertor2.floatPart = x;

convertor.intPart = 0x1FBCF800 + (convertor.intPart >> 1);

convertor2.intPart = 0x5f3759df - (convertor2.intPart >> 1);

return 0.5f(convertor.floatPart + (x convertor2.floatPart));

int isPrime(int n) //判断是否为素数

{int i=0,k=2;

for(i=2;i<=k;i++)

{if(n%i==0)

break;

}if(i>k)

return 1;

else

return 0;

{ //取系统时间做随机数种子

int range,n;

int min=2,flag=0;

time_t t;

double j;

range=max-min;

t=time(NULL);

n=rand();

j=((double)n/(double)RAND_MAX);

n=(int)(j(double)range);

n+=min;

return n;

}int co_prime(int a ,int b) // 求互质

{int c;

do

{if(b==1)

return 1;

c=a%b;

a=b;

b=c;

}while(c!=0);

return 0;

}void get_d_e(int p,int q)

{int r,t,e,d,i=2,k=0;

if(isPrime(p)!=1||isPrime(q)!=1)

{printf("Invaild Parameters\nshould be PRIME!\n");

printf("Usage:RSA Prime1 Prime2\n");

e=rnd(t)/10;

while(co_prime(t,e)!=1)

{e=e+1;

}for(d=2;d

break;

}printf("d=%d e=%d r=%d\n",d,e,r);

}void en(int n,int e,int r)

{//加密

}void de(int c,int d,int r)

{//解密

}void main(int argc,char argv[])

{int n1,n2;

if(argc!=3&&argc!=5)

{printf("Invaild Parameters!\n");

printf("RSA -d Ciphertext d r\n");

printf("RSA Prime1 Prime2\n");//错误输出

}else

if(argv[1][0]!='-')

{n1=str2num(argv[1]);

n2=str2num(argv[2]);

get_d_e(n1,n2);

}else

if(argv[1][1]=='e') //加密

{n1=str2num(argv[3]);

}if(argv[1][1]=='d') //解密

{n1=str2num(argv[3]);

}else{

printf("Invaild Parameters!\n");

printf("RSA -d Ciphertext d r\n");

printf("RSA Prime1 Prime2\n");

}}

#include

#include

#include

#include

int str2num(char str) //字符转数字

{int i=0,num=0;

for(i=0;i<(int)strlen(str);i++)

num=num10+str[i]-'0';

return num;

}float CarmSqrt(float x) //求平方根 系统的太慢,用了别人的

{union

{int intPart;

float floatPart;

}convertor;

union

{int intPart;

float floatPart;

}convertor2;

convertor.floatPart = x;

convertor2.floatPart = x;

convertor.intPart = 0x1FBCF800 + (convertor.intPart >> 1);

convertor2.intPart = 0x5f3759df - (convertor2.intPart >> 1);

return 0.5f(convertor.floatPart + (x convertor2.floatPart));

int isPrime(int n) //判断是否为素数

{int i=0,k=2;

for(i=2;i<=k;i++)

{if(n%i==0)

break;

}if(i>k)

return 1;

else

return 0;

{ //取系统时间做随机数种子

int range,n;

int min=2,flag=0;

time_t t;

double j;

range=max-min;

t=time(NULL);

n=rand();

j=((double)n/(double)RAND_MAX);

n=(int)(j(double)range);

n+=min;

return n;

}int co_prime(int a ,int b) // 求互质

{int c;

do

{if(b==1)

return 1;

c=a%b;

a=b;

b=c;

}while(c!=0);

return 0;

}void get_d_e(int p,int q)

{int r,t,e,d,i=2,k=0;

if(isPrime(p)!=1||isPrime(q)!=1)

{printf("Invaild Parameters\nshould be PRIME!\n");

printf("Usage:RSA Prime1 Prime2\n");

e=rnd(t)/10;

while(co_prime(t,e)!=1)

{e=e+1;

}for(d=2;d

break;

}printf("d=%d e=%d r=%d\n",d,e,r);

}void en(int n,int e,int r)

{//加密

}void de(int c,int d,int r)

{//解密

}void main(int argc,char argv[])

{int n1,n2;

if(argc!=3&&argc!=5)

{printf("Invaild Parameters!\n");

printf("RSA -d Ciphertext d r\n");

printf("RSA Prime1 Prime2\n");//错误输出

}else

if(argv[1][0]!='-')

{n1=str2num(argv[1]);

n2=str2num(argv[2]);

get_d_e(n1,n2);

}else

if(argv[1][1]=='e') //加密

{n1=str2num(argv[3]);

}if(argv[1][1]=='d') //解密

{n1=str2num(argv[3]);

}else{

printf("Invaild Parameters!\n");

printf("RSA -d Ciphertext d r\n");

printf("RSA Prime1 Prime2\n");

}

#include

#include

#include

#include

#include

int

str2num(char

str)

//字符转数字

i=0,num=0;

for(i=0;i<(int)strlen(str);i++)

num=num10+str[i]-'0';

num;

}float

CarmSqrt(float

x)

{union

float

floatPart;

}convertor;

union

float

floatPart;

}convertor2;

convertor.floatPart

convertor2.floatPart

convertor.intP#include art

=0x1FBCF800

+(convertor.intPart

>>

1);

convertor2.intPart

=0x5f3759df

-(convertor2.intPart

>>

1);

0.5f(convertor.floatPart

+(x

convertor2.floatPart));

int

isPrime(int

n)

//判断是否为素数

i=0,k=2;

for(i=2;i<=k;i++)

{if(n%i==0)

break;

}if(i>k)

else

0;

}int

rnd(int

max)

//生成随机数

2~max

用来生成e,

{//取系统时间做随机数种子

int

range,n;

int

min=2,flag=0;

time_t

t;

double

j;

range=max-min;

t=time(NULL);

n=rand();

j=((double)n/(double)RAND_MAX);

n=(int)(j(double)range);

n+=min;

n;

}int

co_prime(int

a,int

b)

//

求互质

c;

do

{if(b==1)

c=a%b;

a=b;

b=c;

}while(c!=0);

0;

}void

p,int

q)

r,t,e,d,i=2,k=0;

if(isPrime(p)!=1||isPrime(q)!=1)

Parameters\nshould

be

PRIME!\n");

printf("Usage:RSA

Prime1

Prime2\n");

e=rnd(t)/10;

while(co_prime(t,e)!=1)

{e=e+1;

}for(d=2;d

break;

}printf("d=%d

e=%d

r=%d\n",d,e,r);

}void

en(int

n,int

e,int

r)

{//加密

}void

de(int

c,int

d,int

r)

{//解密

}void

main(int

argc,char

argv[])

n1,n2;

if(argc!=3&&argc!=5)

Parameters!\n");

\nRSA

-e

Express

er\n");

printf("RSA

-d

Ciphertext

dr\n");

printf("RSA

Prime1

Prime2\n");//错误输出

}else

if(argv[1][0]!='-')

{n1=str2num(argv[1]);

n2=str2num(argv[2]);

get_d_e(n1,n2);

}else

if(argv[1][1]=='e')

//加密

{n1=str2num(argv[3]);

}if(argv[1][1]=='d')

//解密

{n1=str2num(argv[3]);

}else{

printf("Invaild

Parameters!\n");

\nRSA

-e

Express

er\n");

printf("RSA

-d

Ciphertext

dr\n");

printf("RSA

Prime1

Prime2\n");

}}

#include

#include

#include

#include

#include

int

str2num(char

str)

//字符转数字

i=0,num=0;

for(i=0;i<(int)strlen(str);i++)

num=num10+str[i]-'0';

num;

}float

CarmSqrt(float

x)

{union

float

floatPart;

}convertor;

union

float

floatPart;

}convertor2;

convertor.floatPart

convertor2.floatPart

convertor.intPart

=0x1FBCF800

+(convertor.intPart

>>

1);

convertor2.intPart

=0x5f3759df

-(convertor2.intPart

>>

1);

0.5f(convertor.floatPart

+(x

convertor2.floatPart));

int

isPrime(int

n)

//判断是否为素数

i=0,k=2;

for(i=2;i<=k;i++)

{if(n%i==0)

break;

}if(i>k)

else

0;

}int

rnd(int

max)

//生成随机数

2~max

用来生成e,

{//取系统时间做随机数种子

int

range,n;

int

min=2,flag=0;

time_t

t;

double

j;

range=max-min;

t=time(NULL);

n=rand();

j=((double)n/(double)RAND_MAX);

n=(int)(j(double)range);

n+=min;

n;

}int

co_prime(int

a,int

b)

//

求互质

c;

do

{if(b==1)

c=a%b;

a=b;

b=c;

}while(c!=0);

0;

}void

p,int

q)

r,t,e,d,i=2,k=0;

if(isPrime(p)!=1||isPrime(q)!=1)

Parameters\nshould

be

PRIME!\n");

printf("Usage:RSA

Prime1

Prime2\n");

e=rnd(t)/10;

while(co_prime(t,e)!=1)

{e=e+1;

}for(d=2;d

break;

}printf("d=%d

e=%d

r=%d\n",d,e,r);

}void

en(int

n,int

e,int

r)

{//加密

}void

de(int

c,int

d,int

r)

{//解密

}void

main(int

argc,char

argv[])

n1,n2;

if(argc!=3&&argc!=5)

Parameters!\n");

\nRSA

-e

Express

er\n");

printf("RSA

-d

Ciphertext

dr\n");

printf("RSA

Prime1

Prime2\n");//错误输出

}else

if(argv[1][0]!='-')

{n1=str2num(argv[1]);

n2=str2num(argv[2]);

get_d_e(n1,n2);

}else

if(argv[1][1]=='e')

//加密

{n1=str2num(argv[3]);

}if(argv[1][1]=='d')

//解密

{n1=str2num(argv[3]);

}else{

printf("Invaild

Parameters!\n");

\nRSA

-e

Express

er\n");

printf("RSA

-d

Ciphertext

dr\n");

printf("RSA

Prime1

Prime2\n");

}

常用理解,RSA, 数字证书

{int

1.RSA算法是目前最可靠的非对称加密算法,加密密钥和解密密钥不同,安全性比较高。

2.RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。实际设计上肯定是更复杂的。

3.目前公开破译的位数是768位,1024应该也已经是不安全的了,现在实际上在Linux上使用sshkey-gen生成的已经默认是2048位

4.数据量大,RSA和其他算法结合使用,一般在用于前期的相互认证和对称加密算法的协商,比如完成前期通信后,协商一个AES的密钥用来加密。

5.安全考虑,使用的时候一定要注意保护好私exit(0);钥。

1.对称加密,DES, AES

2.非对称加密,RSA,ECC(椭圆曲线密码编码学,相比RSA等公钥算法,使用较短的密钥长度而能得到相同程度的安全性,原理记不清了,区块链里比特好像用的是这个)

3.单向散列算法,MD5,SHA1,SHA2,HMAC(HMAC是密钥相关的消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为en(str2num(argv[2]),n1,n2);输出)

加密一般分为对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption)。对称加密又分为分组加密和序列密码。

1.分组密码,也叫块加密(block cyphers),一次加密明文中的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。

2.序列密码,也叫流加密(stream cyphers),一次加密明文中的一个位。是指利用少量的密钥(制乱元素)通过某种复杂的运算(密码算法)产生大量的伪随机位流,用于对明文位流的加密。

分组加密算法中,有ECB,CBC,CFB,OFB这几种算法模式。

非对称加密算法 (RSA、DSA、ECC、DH)

k=(int)CarmSqrt(n);

非对称加密需要两个密钥:公钥(publickey) 和私钥 (privatekey)。公钥和私钥是一对,如果用公钥对数据加密,那么只能用对应的私钥解密。如果用私钥对数据加密,只能用对应的公钥进行解密。t=(p-1)(q-1);因为加密和解密用的是不同的密钥,所以称为非对称加密。

//求平方根

帮我解释一下RSA算法的原理

②p-1和q-1的公因子应很小。

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

srand((unsigned)t);

找两素数p和q

取n=pq

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

取任何一个数e,要求满足e

取de%t==1

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

设消息为数M (M

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

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

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

在对称加密中:

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

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

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

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

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

求得d。

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

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

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

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

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

给你个ja的代码你,希望对你有帮助

package standard.;

i1;mport ja.io.UnsupportedEncodingException;

import ja.URLDecoder;

import ja.URLEncoder;

import ja.util.Random;

public class RSACrypt {

private static int _PrivateKey = 32823; // 私钥

private static int _PublicKey = 20643; // 公钥

private static int _Modulus = 29893; // 模数

// 对数字进行加密解密运算,根据key为公钥或是私钥来判断对数字进行加密或解密作

private static int Crypt(int number, int key) {

int mod;

int i;

int result = 0;

try {

mod = number number % _Modulus;

if (key % 2 == 0) {

result = 1;

for (i = 0; i < key / 2; i++) {

result = number;

for (i = 0; i < key / 2; i++) {

}}

} catch (Exception e) {

}return result;

}// 根据字符位置将字符的ASCII数值进行偏移,并得到密文

public static String Encode(String message) {

int length = message.length(); // 明文的长度

int ascCode; // ASCII码

int cryptCode; // 密码

int rndCode; // 随机码

int index;

String encodeString = ""; // 密文

if (length == 0) {

return null;

}// 产生随机码

Random rnd = new Random();

rndCode = 1 + rnd.nextInt(99);

for (index = 0; index < length; index++) {

// 获取单字符的ASCII码

// 同一字符根据随机码偏移保证每次不同

ascCode += rndCode;

// 同一字符在不同位置保证不同

ascCode += index + 1; // 因索引值与domino不同(domino起始为1),所以此处加1

// 同一字符在字符串长度变化时保证不同

ascCode += length;

ascCode = ascCode % 128;

// 加密为密码

cryptCode = Crypt(ascCode, _PublicKey);

// 将密码转换为4位16进制字符串

encodeString += DecimalToHex(cryptCode, 4);

}// 附上随机码的2位16进制字符串

encodeString += DecimalToHex(rndCode, 2);

return encodeString;

}// 将密文转换为明文,再对明文进行字位偏移,最终得到原文

public static String Decode(String message) {

int length = message.length() - 2; // 剥离随机码后的密文长度

int ascCode; // ASCII码

int cryptCode; // 密码

int rndCode; // 随机码

int index;

String decodeString = ""; // 明文

// 获取随机码的10进制数字

rndCode = HexToDecimal(message.substring(length));

for (index = 0; index < length; index += 4) {

// 将4位16进制字符串转换为10进制密码

cryptCode = HexToDecimal(message.substring(index, index + 4));

// 解密为明码

ascCode = Crypt(cryptCode, _PrivateKey);

ascCode -= rndCode;

// 还原字位偏移

ascCode += (length / 4 % 128 + 1) 128 - (index + 1) / 4 - 1; // 因索引值与domino不同(domino起始为1),所以此处加1

// 还原字符串长度偏移

ascCode += (length / 4 % 128 + 1) 128 - length / 4;

ascCode = ascCode % 128;

// 将ASCII码转换为字符

decodeString += (char) ascCode;

}return decodeString;

}// 10进制数字转16进制字符串

private static String DecimalToHex(int decNumber, int hexWidth) {

String hexString = Integer.toHexString(decNumber);

while (hexString.length() < hexWidth)

hexString = "0" + hexString;

return hexString;

}// 16进制字符串转10进制数字

private static int HexToDecimal(String hexString) {

return Integer.parseInt(hexString, 16);

}public static void main(String[] args) throws UnsupportedEncodingException {

String str = "测试158228&&2008-10-23_15:39:58";

System.out.println(str);

str = URLEncoder.encode(str, "UTF-8");

System.out.println(str);

for (int i = 0; i < 10; i++) {

String r = RSACrypt.Encode(str);

System.out.println(r);

System.out.println(URLDecoder.decode(RSACrypt.Decode(r), "UTF-8"));

}}

}

iOS RSA加密生成公钥私钥

ascCode = (int) message.charAt(index);

该命令生成一个模长 2048 位,名字为 rsa_private_key.pem 、 PKCS1 格式的 RSA 私钥文件.

genrsa return:指定生成算法使用 RSA

-out :后面参数是生成的私钥的文件名

2048 :生成私钥的模长,单位字节(bits)

根据生成的私钥 rsa_private_key.pem 文件,生成公钥 rsa_public_key.pem 文件

生成名字为 rsa_pkcs8_private_key.pem 的私钥文件

Ja 和 Android 用到的密钥:

公钥: rsa_public_key.pem

私钥: rsa_pkcs8_private_key.pem

终端会提示输入、省市、所在地、组织、组织单位、常用名称、邮箱地址等信息,按要求填写(可以随便填写), 输入完对应信息后会提示输入一个密码 :

最终会生成 rsacert.csr 文件

用最开始生成的私钥 rsa_private_key.pem 和 rsacert.csr 证书请求文件生成一个数字证书 rsacert.crt

使用 x509 工具自建CA。由于 x509 无法建立证书请求文件,所以只能使用 openssl req 来生成请求文件,然后使用 x509 来自签署, 也可以用来签署printf("Usage: \nRSA -e Express e r\n");他人的证书请求,即为他人颁发证书。

知识点 :

终端会提示设置密码,该密码是 .p12 私钥的密码(用 private_key.p12 私钥解密时, 要用到该密码, 需要记录下 ), 会提示再次输入检验刚才输入的密码.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 12345678@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息