RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制 。在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK 。
正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要 。
RSA算法是一个广泛使用的公钥算法。其密钥包括公钥和私钥。它能用于数字签名、身份认证以及密钥交换。RSA密钥长度一般使用1024位或者更高。RSA密钥信息主要包括:
n:模数
e:公钥指数
d:私钥指数
p:最初的大素数
q:最初的大素数
其中,公钥为n和e;私钥为n和d。
本文假设你已经安装好了OpenSSL,并且持有一份111的源码。
RSA相关的头文件在rsah中、源文件在crypto/rsa目录中。
这个结构定义了RSA内部数据信息。主要字段含义:
version —— 版本。
meth —— RSA运算抽象方法集合。
n,e,d,p,q,dmp1,dmq1,iqmp —— 密钥相关的大数。
这个结构定义了RSA内部各种运算抽象方法集合。主要字段含义:
name —— 名称描述。
rsa_pub_enc —— 公钥加密方法。
rsa_pub_dec —— 公钥解密方法。
rsa_priv_enc —— 私钥加密方法。
rsa_priv_dec —— 公钥解密方法。
rsa_sign —— 签名方法。
rsa_verify —— 验签方法。
rsa_keygen —— 生成密钥对方法。
在111中,大多数的数据结构已经不再向使用者开放,从封装的角度来看,这是更合理的。如果你在头文件中找不到结构定义,不妨去源码中搜一搜。
RSA RSA_new(void);
生成一个RSA密钥结构,采用默认的rsa_pkcs1_ossl_meth方法。
void RSA_free(RSA r);
释放RSA结构。
RSA RSA_generate_key(int bits, unsigned long e, void (callback) (int, int, void ), void cb_arg);
生成RSA密钥(旧版本)。
bits为密钥位数,e为公钥指数。
callback为密钥生成过程中的干预回调函数,通常传入NULL。cb_arg为回调参数。
成功返回RSA指针,失败返回NULL。
int RSA_generate_key_ex(RSA rsa, int bits, BIGNUM e, BN_GENCB cb);
生成RSA密钥(新版本)。
rsa为RSA对象指针。bits为密钥位置,e为公钥指数的大数形式指针。cb为干预回调函数,通常传入NULL。
成功返回1,失败返回0。
关于公钥指数e,主要有两个取值:
# define RSA_3 0x3L
# define RSA_F4 0x10001L
RSA RSAPublicKey_dup(RSA rsa);
复制RSA公钥部分。
成功返回RSA指针,失败返回NULL。
RSA RSAPrivateKey_dup(RSA rsa);
复制RSA私钥部分。
成功返回RSA指针,失败返回NULL。
int RSA_bits(const RSA rsa);
获取RSA密钥位数。
int RSA_size(const RSA rsa);
获取RSA密钥长度。
int RSA_check_key(const RSA );
int RSA_check_key_ex(const RSA , BN_GENCB cb);
检查RSA的有效性,必须为完整的密钥对。
成功返回1,失败返回0。
int RSA_print(BIO bp, const RSA r, int offset);
int RSA_print_fp(FILE fp, const RSA r, int offset);
将RSA信息输出到bp/fp中,off为输出信息在bp/fp中的偏移量,比如是屏幕bp/fp,则表示打印信息的位置离左边屏幕边缘的距离。
int RSA_public_encrypt(int flen, const unsigned char from,
unsigned char to, RSA rsa, int padding);
RSA公钥加密。
成功返回密文的长度,失败返回-1。
int RSA_public_decrypt(int flen, const unsigned char from,
unsigned char to, RSA rsa, int padding);
RSA公钥解密。
成功返回明文的长度,失败返回-1。
int RSA_private_encrypt(int flen, const unsigned char from,
unsigned char to, RSA rsa, int padding);
RSA私钥加密。
成功返回密文的长度,失败返回-1。
int RSA_private_decrypt(int flen, const unsigned char from,
unsigned char to, RSA rsa, int padding);
RSA私钥解密。
成功返回明文的长度,失败返回-1。
关于padding填充方式,取值:
其中PKCS1填充大小为11字节,所以加密明文长度必须不大于(密钥大小-11字节)。
# define RSA_PKCS1_PADDING_SIZE 11
int RSA_sign(int type, const unsigned char m, unsigned int m_length,
unsigned char sigret, unsigned int siglen, RSA rsa);
对数据m生成RSA签名,生成的签名长度与key的长度相同,如512位密钥生成64字节签名。
type指定摘要算法的NID,如NID_sha1。
成功返回1,失败返回0。
int RSA_verify(int type, const unsigned char m, unsigned int m_length,
const unsigned char sigbuf, unsigned int siglen, RSA rsa);
对数据m验证RSA签名。
type指定摘要算法的NID,如NID_sha1。
成功返回1,失败返回0。
以下函数在x509h中定义:
int i2d_RSAPrivateKey_bio(BIO bp, RSA rsa)
{
return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
}
将RSA公钥转换为DER编码,并写入到bp抽象IO中。
成功返回1,失败返回0。
RSA d2i_RSAPrivateKey_bio(BIO bp, RSA rsa)
{
return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
}
从bp抽象IO中读取DER编码,并转换为rsa结构私钥。
成功返回有效指定,失败返回NULL。
int i2d_RSAPublicKey_bio(BIO bp, RSA rsa)
{
return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
}
将RSA公钥转换为DER编码,并写入到bp抽象IO中。
成功返回1,失败返回0。
RSA d2i_RSAPublicKey_bio(BIO bp, RSA rsa)
{
return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
}
从bp抽象IO中读取DER编码,并转换为rsa结构公钥。
成功返回有效指定,失败返回NULL。
下面这个例子演示了RSA密钥对的生成、公私钥的复制、公钥加密和私钥解密的用法。
输出:
下面这个例子演示了公私钥的分开保存、读取,以及使用公私钥加解密。
输出:
RSA_generate_key_ex() ret:1
i2d_RSAPrivateKey_bio() ret:1
i2d_RSAPublicKey_bio() ret:1
copy' private key size:64
copy' public key size:64
RSA_public_encrypt() ret:64
RSA_private_decrypt() ret:10
text:[1234567890]
下面这个例子演示了签名的生成和验证 *** 作。
输出:
ret:1
RSA_sign() ret:1
sign 64
4ec0af099c49646b72fda88a4fb11e8deb3898da9c3f611a5f25f05d9d005631858239bbb732cd5060dbc975363fc1b9cdfdc5a04554115a916f06f98163189f
RSA_verify() ret:1
1、查看keystore文件内容:
要查看证书keystore中的信息,请运行以下命令:
keytool -list -v -keystore [enter keystore name] -storepass [enter keystore password]
如下:
zr@zr-PC:~/workspace$ keytool -list -v -keystore my_keystore -storepass 123456
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: zr
创建日期: 2014-10-14
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=zeng run, L=Beijing
发布者: CN=zeng run, L=Beijing
序列号: 58ec916d
有效期开始日期: Tue Oct 14 16:19:26 CST 2014, 截止日期: Sat Oct 08 16:19:26 CST 2039
证书指纹:
MD5: C4:73:2F:59:F5:CA:76:C1:10:59:98:E8:F9:23:9E:9E
SHA1: 16:90:E7:D3:E8:ED:9D:E0:5E:47:9A:3B:D4:D4:8E:D0:40:AF:BD:23
SHA256: FF:0F:AF:A5:FA:8F:A8:25:8D:8D:E7:17:08:71:46:CD:60:F1:44:F0:88:81:6F:3E:7B:61:AC:8F:B0:7D:17:CC
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 252914 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E6 61 76 EB C6 99 7D 4B F6 B5 75 AD E1 FA 63 E5 avKuc
0010: 3C D4 BC 5F <_
]
]
参考如下内容:
查看三方应用或是系统应用签名
用winrar打开待查看的apk,将其中META-INF文件夹解压出来,得到其中的CERTRSA文件,通过命令keytoolexe命令查看证书信息
可以查看签名的MD5、SHA1、SHA256值及签名算法
keytool -printcert -file META-INF/CERTRSA
这里边涉及到几个概念。其实我们无法从私钥中获得公钥的!就象我们无法通过公钥获得私钥一样!但事实上保存私钥的文件并不单单保存了私钥,它非本身是保存的有公钥的!也就是说如果一个证书文件只含有公钥时,那就是只有公钥,如果含有私有时一定会含有公钥——并不是你想象的只有一个私钥。
现在来说一下RSA机制,我们知道,RSA基于两个大素数之积,所以,一个正常的容器内包含有几个基本的参数的(RSAParameters类):
d /dp/dq/Expoent/InverseQ/Modulus/p/q
如果是保存私钥时,这几个参数会全部存在,但如果只是一个公钥文件的话,只有n/e(Modulus和Exponent)两个参数是存在的。
所以一般我们使用是否含有私钥作为文件或容量的参数,从另一个角度上来说,一定是存在公钥的,但是否存在私钥做为一个参数。
当然这个内容与具体的语言没有关系——所有的RSA都是这样规定的。
小米手机上如何下载RSA?好多网友说使用手机下载文件,但又找不到下载的文件在中哪里,那么小米手机下载保存在哪里呢?如何找到小米手机下载的文件呢?下面就来看一下如何管理小米手机默认的下载路径吧。
工具原料小米手机
方法/步骤分步阅读
1
/6
在小米手机上找到“下载管理”的图标,点击后打开下载管理
2
/6
在下载管理的主界面,点击右上角的“更多”按钮。
3
/6
这时会打开管理的下拉菜单,在d出菜单中选择“设置”菜单项。
4
/6
这时会打开下载管理的设置页面,点击“新建下载存储目录”菜单项。
5
/6
接下来选择要会d出“选择路径”窗口,在这里拖动手机屏幕,找到要保存的文件夹即可
6
/6
设置完成后,点击最下面的“确定”按钮。这样以后小米手机下载的所有文件都会保存到该文件夹下面,有需要直接到该文件夹下就可以找到了。
注意事项
此经验文章中的图文皆由 lqlxhua 独立编撰,并首发于百度经验,如要转载,请留出处。
有帮助,点投票。要细品,可收藏。要继续,请关注。如成功,请点赞。有疑问,请留评。
使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能登录远程Linux主机。
ssh-keygen 创建公钥和密钥。
ssh-copy-id 把本地主机的公钥复制到远程主机的authorized_keys文件上。
ssh-copy-id 也会给远程主机的用户主目录(home)和~/ssh, 和~/ssh/authorized_keys设置合适的权限 。
步骤1: 用 ssh-key-gen 在本地主机上创建公钥和密钥
ligh@local-host$ ssh-keygen -t rsa
Enter file in which to save the key (/home/jsmith/ssh/id_rsa):[Enter key]
Enter passphrase (empty for no passphrase): [Press enter key]
Enter same passphrase again: [Pess enter key]
Your identification has been saved in /home/jsmith/ssh/id_rsa
Your public key has been saved in /home/jsmith/ssh/id_rsapub
The key fingerprint is: 33:b3:fe:af:95:95:18:11:31:d5:de:96:2f:f2:35:f9
ligh@local-host
步骤2: 用 ssh-copy-id 把公钥复制到远程主机上
ligh@local-host$ ssh-copy-id -i ~/ssh/id_rsapub root@19216803
ligh@remote-host‘s password:
Now try logging into the machine, with ―ssh remote-host‘‖, and check in:
ssh/authorized_keys to make sure we haven‘t added extra keys that you weren‘t expecting
[注: ssh-copy-id 把密钥追加到远程主机的 ssh/authorized_key 上]
步骤3: 直接登录远程主机
ligh@local-host$ ssh remote-host
Last login: Sun Nov 16 17:22:33 2008 from 19216812
[注: SSH 不会询问密码]
ligh@remote-host$
[注: 你现在已经登录到了远程主机上
以上就是关于OpenSSL之RSA用法全部的内容,包括:OpenSSL之RSA用法、如何使用keytool查看CERT.RSA文件和keystore文件内容、如何获取android 签名信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)