如何使用16进制编码的java rsa公钥加密算法进行RSA加密

生成私钥:
openssl genrsa -out private.key 2048
生成公钥:
openssl rsa -in privkey.pem -pubout & public.pem
C代码如下所示。
在Linux下的编译:gcc test.c -lcrypto -o test
#include &stdlib.h&
#include &stdio.h&
#include &string.h&
#include &openssl/pem.h&
#include &openssl/rsa.h&
int main()
// 原始明文
char plain[256]=”测试测试,hello123″;
// 用来存放密文
char encrypted[1024];
// 用来存放解密后的明文
char decrypted[1024];
// 公钥和私钥文件
const char* pub_key=”public.pem”;
const char* priv_key=”private.pem”;
// ——————————————————-
// 利用公钥加密明文的过程
// ——————————————————-
// 打开公钥文件
FILE* pub_fp=fopen(pub_key,”r”);
if(pub_fp==NULL){
printf(“failed to open pub_key file %s!\n”, pub_key);
return -1;
// 从文件中读取公钥
RSA* rsa1=PEM_read_RSA_PUBKEY(pub_fp, NULL, NULL, NULL);
if(rsa1==NULL){
printf(“unable to read public key!\n”);
return -1;
if(strlen(plain)&=RSA_size(rsa1)-41){
printf(“failed to encrypt\n”);
return -1;
fclose(pub_fp);
// 用公钥加密
int len=RSA_public_encrypt(strlen(plain), plain, encrypted, rsa1, RSA_PKCS1_PADDING);
if(len==-1 ){
printf(“failed to encrypt\n”);
return -1;
// 输出加密后的密文
FILE* fp=fopen(“out.txt”,”w”);
fwrite(encrypted,len,1,fp);
fclose(fp);
// ——————————————————-
// 利用私钥解密密文的过程
// ——————————————————-
// 打开私钥文件
FILE* priv_fp=fopen(priv_key,”r”);
if(priv_fp==NULL){
printf(“failed to open priv_key file %s!\n”, priv_key);
return -1;
// 从文件中读取私钥
RSA *rsa2 = PEM_read_RSAPrivateKey(priv_fp, NULL, NULL, NULL);
if(rsa2==NULL){
printf(“unable to read private key!\n”);
return -1;
// 用私钥解密
len=RSA_private_decrypt(len, encrypted, decrypted, rsa2, RSA_PKCS1_PADDING);
if(len==-1){
printf(“failed to decrypt!\n”);
return -1;
fclose(priv_fp);
// 输出解密后的明文
decrypted[len]=0;
printf(“%s\n”,decrypted);
转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/
一 知识准备
SM2是国密局推出的一种他们自己说具有自主知识产权的非对称商用密码算法。本身是基于ECC椭圆曲线算法的,所以要讲sm2, 先要弄懂ECC。
完全理解ECC算法需要一定的数学功底,因为涉及到射影平面坐标系,齐次方程求解, 曲线的运算规则等概念。这里不做过多的数学分析(主要是我自己也没有完全整明白)。想要深入了解ECC的我推荐网名为ZMWorm 的大牛在多年前写的&&椭圆曲线ECC加密算法入门介绍&&。此人是早年看雪论坛中的一个版主,对算法和密码学很有研究。
本篇的主旨还是希望能以简单通俗的语言,讲清楚PBOC3.0认证过程中,所用到的SM2的相关概念,包括它的实现,使用等。
1 椭圆曲线到底是什么样的
上面是两个不同椭圆曲线在坐标系中的几何表示, 不过这个坐标系不是二维坐标系,而是射影坐标系。可以用空间思维想像一下(但是注意不是三维坐标系),打个比方,你晚上站在一个路灯前面,地上有你的影子,你本身是在一个二维坐标系(把你想像成一个纸片),和你的影子一起构成一个射影坐标系。
曲线的每一个点, 用三个参量表示, (X,Y,Z)。我们知道在二维坐标系里的每个图形都遵循一个方程,比如直接的二元一次方程是y=kx+b, 圆的方程是(x-a)2+(y-b)2=r2, 椭圆曲线在射影坐标系里也有自己的定义:
Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4XZ2+a6Z3
所有椭圆曲线上的点都满足上述方程,a1,a2,a3,a4,a6是系数,决定曲线的形状和位置。
二维坐标和射影坐标有一个对应关系,即x=X/Z, y=Y/Z, 这样就可以把上面的方程转成普通的二维坐标系方程:
y2+a1xy+a3y= x3+a2x2+a4x+a6
2 离散的椭圆曲线
上面的坐标系都是基于实数的,椭圆曲线看起来都是平滑的,如果我们限制曲线的点都必须是整数,曲线就变成离散的了,如图3所示:
再进一步限制,要求整数必须大于0, 小于某个大整数P, 这样就形成了一个有限域Fp.然后我们在这个有限域里定义一些点与点之间的加减乘除运算规则,比如A点加B点得到C点(记做A+B≡C (mod p)),或者A点乘以n得到K点(记做A×n≡K (mod p))。至于具体规则细节可以不用关心,只要知道有这样的操作即可。
选一条曲线,比如
y2=x3+ax+b
把它定义在Fp上, 要求a,b满足:
4a3+27b2≠0 (mod p)
我们把这样的曲线记为Ep(a,b)
加解密是基于这样的数学难题,K=kG,其中 K,G为Ep(a,b)上的点,k是整数,小于G点(注意区分,不是我们平常说的那个意思)的阶(不用关心什么是点的阶)。给定k和G,计算K很容易;但给定K和G,求k就困难了。这样,G就叫做基点,k是私钥,K是公钥。
最后总结。描述一条Fp上的椭圆曲线,有六个参量:
T=(p,a,b,G,n,h)。
p 、a 、b 用来确定一条椭圆曲线,
n为点G的阶,
h 是椭圆曲线上所有点的个数m与n相除的整数部分)
知识准备阶段知道这么多就可以了。
二 SM2在PBOC认证中的使用
1 签名和验签的原理
前面提到根据系数的不同,ECC曲线可以有很多,SM2使用其中一种,这就表明它的曲线方程,以及前面说到的六个参量都是固定的。根据国密局给出的规范定义如下:
y2=x3+ax+b
p=FFFFFFFE FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF
a=FFFFFFFE FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFC
b=28E9FA9E 9D9F5E344D5A9E4B CF789F5 15AB8F92 DDBCBD41 4D940E93
n=FFFFFFFE FFFFFFFFFFFFFFFF FFFFFFFF C6052B 53BBF409 39D54123
Gx=32C4AE2C 1FFA39C994 8FE30BBF FAC7
Gy=BCF6779C 59BDCEE3 6BA9877C C62AE5
这里容易引起一个误解,会认为参数都固定了,公私钥是不是只能有一对?当然不是,注意前面提到的K=kG的模型,K才是公钥,所以公钥其实是曲线在离散坐标系中,满足条件的一个曲线上的点。可以有很多个。另外, 从这几个参量可以获知PBOC 3.0的公钥长度都是256位。
基于这种离散椭圆曲线原理的SM2算法一般有三种用法,签名验签,加解密, 密钥交换。PBOC 3.0中的脱机数据认证只用到签名验签的功能。终端关心的是如何验签,卡片则要考虑如何实现生成签名。
2 基于openssl实现sm2
这里给出一个基于openssl的sm2实现, 如果不了解openssl,可以先搜索一下相关知识,这里不讲解。openssl已经实现ECC算法接口,也就是核心已经有了,实现sm2其实并不难,关键是理解它里面各种接口如何使用。下面就分析一个终端验签的sm2实现。另外需要说明这里给出的只是代码片段,仅供理解用。
int SM2_Verify(BYTE* Px,BYTE* Py, BYTE* DataIn,DWORD DataLen, BYTE* sigrs)
前两个参数是K的坐标值,也就是公钥。Datain和datalen分别是明文数据和其长度,最后一个参数是待验证的签名。
曲线的参数常量定义如下:
static const char *group_p =“FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF”;
static const char *group_a =“FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC”;
static const char *group_b =&#FA9E9D9F5E344D5A9E4BCF89F515AB8F92DDBCBD414D940E93”;
static const char *group_Gx =&#AE2C1F8FE30BBFFAC7”;
static const char *group_Gy =“BCF6779C59BDCEE36BA002DF32E”;
static const char *group_n = “FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFC6052B53BBF”;
static const char *ENTL_ID =;
#define SM2_KEY_LENGTH 32 //256位曲线
ENTL_ID是pboc规范中指定的用于SM3产生摘要的报文头数据。
strcpy(szBuff, ENTL_ID);
strcat(szBuff,group_a);
strcat(szBuff,group_b);
strcat(szBuff,group_Gx);
strcat(szBuff,group_Gy);
AscToBcd(szDataForDigest,(unsigned char *)szBuff, nLen);
SM3(szDataForDigest,nLen+SM2_KEY_LENGTH*2, digestZA);
memcpy(szDataForDigest,digestZA, ECC_LENGTH);
memcpy(szDataForDigest+ECC_LENGTH,DataIn, DataLen);
SM3(szDataForDigest,DataLen+ECC_LENGTH, digestH);
第一步,对上述数据用sm3做摘要,摘要的结果与数据拼接后再做摘要。&
p = BN_new();
a = BN_new();
b = BN_new();
group = EC_GROUP_new(EC_GFp_mont_method());
BN_hex2bn(&p, group_p))
BN_hex2bn(&a, group_a))
BN_hex2bn(&b, group_b))
这里是把定义的曲线常量转换成大数表式,这样才能使用openssl中的接口。Group是ECC中的曲线组,它是ECC算法的核心,为什么这么说呢? 因为这个group里的所有字段就确定了曲线的所有信息, 后面会看到,这里只是用EC_GROUP_new生成一个空的group, 然后由p,a,b等参数来填充group, 再以这个group为基础去生成曲线上的点。
if (!EC_GROUP_set_curve_GFp(group, p, a, b,ctx))
P = EC_POINT_new(group);
Q = EC_POINT_new(group);
R = EC_POINT_new(group);
if (!P || !Q || !R)
这一段就确定了group的所有信息,并且根据group生成三个曲线上的点(点一定在曲线上,这个很重要)。&
&span style=“white-space:pre”&
&/span&x = BN_new();
y= BN_new();
z= BN_new();
if(!x || !y || !z)
if(!BN_hex2bn(&x, group_Gx))
if(!EC_POINT_set_compressed_coordinates_GFp(group, P, x, 0, ctx))
if(!BN_hex2bn(&z, group_n))
if(!EC_GROUP_set_generator(group, P, z, BN_value_one()))
if(!EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx))
这一段首先是设置n到group, n前面讲过,是曲线的阶。另外就是由G点坐标x,y确定点P,这里我其实也有点不太明白,G点坐标y本来就是已知的,为什么要再通过曲线变换表式生成y,是不是想要对比前面的group信息是否正确?只是为了校验?
if ((eckey = EC_KEY_new()) == NULL)
if(EC_KEY_set_group(eckey, group) == 0)
EC_KEY_set_public_key(eckey, P);
if(!EC_KEY_check_key(eckey))
if(SM2_do_verify(1, digestH, SM2_KEY_LENGTH, signature, sig_len, eckey) != 1)
这段比较好理解,生成公钥eckey,并由eckey最终验签。验签的执行函数sm2_do_verify有点复杂,这里不做过多的解释(其实是我解释不清楚, 哇哈哈),在一个国外的网站上找到一个比较好的描述,拿过来用用。
3 脱机数据认证使用sm2的具体流程
我假设看这篇文章的人对PBOC 2.0中基于RSA国际算法的脱机数据认证流程已经比较了解,相关概念不再过多描述,重点关注二者的差异性。
另外,简单说一下sm3,因为下面会用到。sm3是一个类似hash的杂凑算法,即给定一个输入(一般很长),产生一个固定长度的输出(sm3是32个字节,hash是20个字节)。它有两个特点:
1 不可逆性,即无法由输出推导出输入。
2 不同的输入,产生不同的输出。
下面就拿终端SDA认证卡片来看看sm2如何在pboc中使用的。
首先,发卡行公钥等数据(还包括公钥,算法标识,有效期等信息)被CA私钥签名(注意不是加密)生成发卡行公钥证书,这个证书会个人化到ic卡中。这些数据如下图所示:
签名其实就是对这个表里的数据做一系列运算,最终生成一个64字节的数据,分别由各32字节的r和s拼接而成(r和s只是个符号而已,没有特别意思)。这64字节的签名拼接到图4后面就是发卡行公钥证书。
这里与国际算法的公钥证书就有明显的区别了。国际算法证书是密文的,发卡行公钥用rsa加密。而国密的公钥证书完全是明文。用数据举例,下面这些数据来自pboc3.0的卡片送检指南,就是检测时要求个人化到卡里的数据。
【发卡行公钥】 :
173A31DD681C6F8FE3BA6C354AD3924A4ADFD15EBA1EB1C88DA29B47155F62FCF4CCCD201BD77E81F6A6C66E9CBDA11F
【CA哈希值】(r||s) :
A7FED8F74F119B416FF728BA98EF0A32A36BCCB8D425CA44C68F8E49121D9BFA9484CAEF9B476C5EB576D1A8DD6BC4AABAF
【Tag_90 】(发卡行公钥证书) :
DD681C6F8FE3BA6C354AD3924A4ADFD15EBA1EB1C88DA29B47155F62FCF4CCCD201BD77E86A6C66E9CBDA11FA7FED8F74F119B416FF728BA98EF0A32A36BCCB8D425CA44C68F8E49121D9BFA9484CAEF9B476C5E56D1A8DD6BC4AABAF
可以自己的解析一下,看看是否和上面表格中的数据一致, 并且都是明文。
终端在读记录阶段获取发卡行公钥证书,国际算法需要用rsa公钥解密整个证书,然后验证hash,通过后取出发卡行公钥。而国密算法,终端只要用sm2公钥验64字节的签名,通过后直接取明文发卡行公钥,所以国密的验签的动作其实就相当于国际里的rsa解密和hash对比两个动作。
接着终端进行静态数据签名的验证,情况类似,对于国密,这些数据都是明文形式,后面拼接64字节的sm2签名,这64字节是用发卡行私钥对明文数据签名得到的。终端要做的就是拿刚刚获取的发卡行公钥对这64字节数据验证即可,验证通过就表示SDA通过。
四 PBOC为什么要选择国密
首先从技术角度,实现同样的计算复杂度,ECC的计算量相对RSA较小,所以效率高。RSA现在在不断的增加模长,目前都用到了2048位。并不是说现在一定要用2048位才是安全的,只是它的安全性更高,破解难度更大,这个要综合考虑,位数高也意味着成本高。有些不差钱的大公司比如谷歌就已经未雨绸缪的把2048位用在了它们的gmail邮箱服务中。PBOC3.0 认证中目前只用到1984位,其实也是相对安全的。
不过这个观点目前还存在争议。前段时间在清华大学听了一个关于密码算法的课,清华有个教授认为sm2并不见得比rsa更高级,只是sm2的原理比rsa难理解,所以大部分人认为它会相对安全些。一旦椭圆曲线被大家研究透了,sm2的光环也可能就此褪去。当然这个也是他个人的观点。
另外一个因素,要从国家战略的角度考虑,RSA之前一直被传与美国安全局合作,在算法中加入后门,这种事是宁可信其有的。国密算法咱起码是自己研发的东西,所有的过程细节都一清二楚, 不用担收后门的事情。青青子衿, 悠悠我心, 但为君故, 沉吟至今
HTTP使用RSA公钥加密算法加密明文
  网站想要加密传输数据以防被窃取,最可靠的方式莫过于使用公钥加密算法加密,使用HTTPS协议的网站在整个传输过程中都使用了这个技术,对于未能使用HTTPS的HTTP网站我们也可以自行实现。  功能说明  由于HTTP是直接传输明文数据的,在网络安全越发严峻的今天,未经加密的HTTP方式已经变得岌岌可危,谷歌公司更是直接表明在搜索结果中会优先考虑使用HTTPS加密的网站。  尽管整体趋势是向HTTPS倾斜的,但是由于诸多服务器以及CDN等服务商还没全面兼容HTTPS协议,目前要实现整站切换至HTTPS协议可行性还不高。  同时安全形势又刻不容缓,对此,我们可以自行实现RSA加密私密信息。  算法说明  由于多梦数学不是很好,RSA公钥加密算法的具体实现多梦就不多说了,对算法的实现有兴趣的童鞋可以去看看阮一峰的&RSA算法原理&,下面多梦就说说RSA算法的效果。  RSA算法是非对称加密算法的一种,也叫公钥加密。  和对称加密算法不同的是,对称加密算法是加密和解密都使用同一把钥匙同一种规则,也就是如果你知道怎么加密的,你就知道怎么解密了。所以算法和密钥不能泄露,否则加密就无意义了。  而公钥加密算法则是同时拥有两把钥匙,一个叫公钥,一个叫私钥。这两个钥匙是对应的,使用公钥加密的内容只有使用私钥才能解密,使用私钥加密的内容只有使用公钥才能解密。所以算法和公钥都是可以公开的,只要私钥还是私密的,就是安全的。  实现思路  由于我们是加密HTTP要发送的数据,所以加密过程是要在客户端浏览器完成的,算法和密钥都需要在发送HTTP数据之前就已经存在浏览器中,此时使用对称加密算法已经无意义,因为别人根据你这个加密可以直接解密。  所以我们需要选择非对称性加密,在网页中引入算法和公钥加密,然后发送HTTP数据到服务器,服务器再根据私钥解密。因为私钥是私密的,所以算法和公钥公开也是无法解密,也是安全的。  具体到HTTP请求的加密实现,就是在网页提交表单数据之前使用JavaScript实现公钥加密数据,然后服务器接受到加密数据后,使用PHP或其他服务器语言进行私钥解密。  扩展阅读  使用JavaScript实现OpenSSL RSA加密和解密:  使用PHP实现OpenSSL RSA加密和解密:  来源:投稿,。
  除非注明,文章均为原创,转载请以链接形式标明本文地址
  本文地址:
现在发文的都什么玩意水平如此之差的文章也发上来脑子有病才自己实现这种弱智加密逻辑没有一点抗中间人攻击的能力,跟明文没有区别白瞎了RSA数学不好就不要装B学人家研究加密了,你没那个能力 于
9:01:38 回复他的水平固然不高,你这样喷,连他还不如多梦 于
17:14:59 回复这么厉害,你解给我看看呗。8dFNCCaT9G%2FByWy6LkMB5PKf0OKDmaxKyzmijcnnq%2BE07X%2BFRFk7vUben9uL%2BJgOSvfwAC7D9A50Y3EQKkgofGhZ9LCyAeaxqjo9zIV9w3ns2RlAenKUUIG3tTZlazYhDQW7%2BEonj3QQDi33I78MCmoG%2Btq1aeMVvAv0GJx0PLV1G4%3D
这都什么文章啊, 基本的概念都没搞清楚就敢写, &最可靠的方式莫过于使用公钥加密算法加密,使用HTTPS协议的网站在整个传输过程中都使用了这个技术& HTTPS整个过程都公钥加密你确定?去看看SSL协议有那么麻烦吗? SSL是用到了公钥加密, 可是仅限于连接建立阶段, 用于交换服务器和浏览器间的对称加密算法和密钥. 简单的说, 浏览器和服务器协商好一个对称加密算法(比如RSA), 然后浏览器生成一个一次性的RSA密钥, 将RSA密钥使用服务器的公钥加密后发送给服务器, 然后双方就使用这个密钥用RSA加密传输了.要研究这个, 先把基本概念搞清楚.
当年某国内电子邮箱妄图用JavaScript做RSA加密被MITM攻击/archives/3658.html
HTTPS不止是加密,其实还附带验证身份的功能根证书就是为了这个存在的而HTTP明文交换公钥是很容易被直接替换的以及并不推荐全部用RSA加密,性能实在……都是用RSA商定一个对称加密的密钥然后加密的
毛用都没有!电信级的RSA加密后的密码的破解方法: /archives/3658.html多梦 于
17:20:08 回复要是你用的网络都不安全,那还谈什么安全,HTTPS一样有中间人攻击。
git.oschina。net/352926/Javascript-to-PHP-RSA-Decode-Encode拿走不谢
赞助商广告
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享. 转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议.& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区安全检查中...
请打开游览器的javascript,然后刷新游览器
浏览器安全检查中… chacuo.net.
还剩 5 秒&安全篇-AES/RSA加密机制 - 简书
下载简书移动应用
写了5999字,被10人关注,获得了13个喜欢
安全篇-AES/RSA加密机制
在服务器与终端设备进行HTTP通讯时,常常会被网络抓包、反编译(Android )等技术得到HTTP通讯接口地址和参数。为了确保信息的安全,我们采用AES+RSA组合的方式进行接口参数加密和解密。1.关于RSA加密机制:公钥用于对数据进行加密,私钥对数据进行解密,两者不可逆。公钥和私钥是同时生成的,一一对应。比如:A拥有公钥,B拥有公钥和私钥。A将数据通过公钥进行加密后,发送密文给B,B可以通过私钥和公钥进行解密。2.AES加密也叫对称加密:A用密码对数据进行AES加密后,B用同样的密码对密文进行AES解密。 具体操作方法:1.在终端中采用openssl方式输入密钥的相关属性(公司名、邮箱等),然后在终端当前所在的地址下,生成公钥和私钥共7个文件(7个文件如何使用请看附录的拓展了链接)。2.此时假设Android客户端拥有公钥PublicKey,服务器端拥有公钥PublicKey和私钥PrivateKey。3.安卓发送请求到服务器端:安卓随机生成Byte[]随机密码,假设RandomKey=“123456”,通过AES算法,对Json数据利用进行加密。4.但是此刻服务器并不知道客户端的RandomKey是什么,因此需要同时将Randomkey传给服务器,否则服务器无法通过AES对Json数据进行解密。但是如果直接发送请求,Randomkey就会暴露,所以要对RandomKey进行不可逆的RSA加密。5.安卓将使用Randomkey进行AES加密的Json数据,和使用PublicKey进行RSA加密的RandomKey通过HTTP传送到服务器端。数据请求工作完成。6.服务器端接收到AES加密的Json数据和Rsa加密的RandomKey数据。7.服务器通过私钥PrivateKey对加密后的RandomKey进行Rsa解密。得到安卓生成的原始Randomkey。8.利用原始的RandomKey对加密后的Json数据进行AES对称解密。至此已经得到安卓端发过来的原始Json数据。进行常规的服务器业务操作,然后将返回数据通过安卓端的RandomKey进行AES加密gouhou后,Response返回。9.安卓端接收到Response的数据后,利用之前本地生成的RandomKey直接进行AES解密即可。详细的流程图可以查看下图。
客户端-服务器端HTTPS数据传输流程图
注意事项:1.在实际的开发过程中,发现RSA和AES有不同的密文生成标准,会不兼容IOS。IOS在RSA算法中需要的公钥与JAVA不同。详细的解决方案请查看:/makemelike/articles/3802518.html2.AES加密不可以使用超过128Byte的KEY,因为在jdk1.7以上的版本不支持超过128Byte的KEY。小结:从性能上来测,整个客户端送加密数据开始到解密得到回传的原始数据不超过300ms(Iphone4和Centos Java服务器传输测试)。本方案没有采用TOKEN的方式,或许以后用到。公钥如何更新也需要继续完善。附:具体的JAVA和IOS加密解密Demo迟点整理给出。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
技术资料相关,主要以Android为主,自己收藏的专题!请勿投稿,不一定会收~但欢迎订阅!
· 414人关注
欢迎投稿,稿子有质量要求哦。
有想管理这个专题的私聊我哦 @敖老黑
· 53人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:

我要回帖

更多关于 ios rsa公钥加密 的文章

 

随机推荐