ja RSA算法实现256位密钥怎么做
get_d_e(int参考下面代码:
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 =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"); } 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这几种算法模式。 非对称加密需要两个密钥:公钥(publickey) 和私钥 (privatekey)。公钥和私钥是一对,如果用公钥对数据加密,那么只能用对应的私钥解密。如果用私钥对数据加密,只能用对应的公钥进行解密。t=(p-1)(q-1);因为加密和解密用的是不同的密钥,所以称为非对称加密。 RSA算法非常简单,概述如下: 找两素数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")); }} } 该命令生成一个模长 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 举报,一经查实,本站将立刻删除。常用理解,RSA, 数字证书
{int非对称加密算法 (RSA、DSA、ECC、DH)
k=(int)CarmSqrt(n);帮我解释一下RSA算法的原理
②p-1和q-1的公因子应很小。iOS RSA加密生成公钥私钥
ascCode = (int) message.charAt(index);