java pkcs8格式的私钥_RSA加密解密中pkcs1与pkcs8格式私钥互相转换
net,ios中rsa加解密使用的是pkcs1,而java使用的是pkcs8
如果是按1024取模(通常都是1024),pkcs1格式的私钥长度应该是812。如果是pkcs8的格式的密钥长度为861。
我这边使用的是Win64OpenSSL_Light-1_1_0g.exe
PKCS1私钥生成:
OpenSSL> genrsa -out pkcs1_private.pem 1024Generating RSAprivate key, 1024 bit longmodulus
.........++++++.............................++++++e is65537 (0x10001)
内容:
-----BEGIN RSA PRIVATE KEY-----MIICWwIBAAKBgQCYMTaH4NMw5fQsgx3pv8xaAxhOdtUz/m5nfl9XHtGboXNzUzx/ehh8c3RgpGcig83JXOYOXafmx3OS28Ed3e2fmC5Yo5RD6DRHnBCid28EjQ5PgCTd
dNqDvcXU3YMH4sO1qNBx5MQpk92Kt/NdquIJmzhgpjP15MO5CFHcU90ZvQIDAQAB
AoGANlvdjkrPI/f+bqemV4caBkx0shHftOJ7rJuGkid/1oakJdzlDuMdO9ZBCwOt
krZhGjsEML1i6xryPNIg9/n8lSdQqIUW61HXYwKUK5xQWz/MstWbbIx3t5driQFR
Fv53NLdemeF/0AJiD5COO1fkoM+1By2LlI0ths8cQLcOpgECQQDIc46yV1N5IuS0
MYD0LgggaJ08WF0PrwjXgs+DRp3+ZE5WTs1JDkBQM9E598xbmy7AAFtdtR3L5CH8
5Qh+KfwJAkEAwl4MuRMdIjiHiw1YoIUliy6t3XPvxeOEiG/P15adKrxI5A5QylM0
TtbZT3YZurdy3nrJ75LxuU9cSYKzxtVFFQJAMboJElD7kjeHyPPm66xns7KAHzJE
k9l2NhBrbkOcejlj/aE65/6zEbJpGxpQBgGvTU5JXCvMIoKLs/MVckb0EQJASze+ULkW4zFhMuy9SZF9T/mGi1bciYZcubgbhODifbFTu/3WQhYk/gWjH18i4eEwcOyv
zSjepsoRetk73UyXaQJAOfr3Gg1dGvoLiwZ3fXoDVupahnKg73SAd72+24qQs2AT
16T8FKop259xisLu+WSUTfSUhao5qOpZJ/PTwFRlzw==
-----END RSA PRIVATE KEY-----
PKCS1私钥转换为PKCS8(该格式一般Java调用)
OpenSSL> pkcs8 -topk8 -inform PEM -in pkcs1_private.pem -outform pem -nocrypt -out pkcs8_private.pem
内容:
-----BEGIN PRIVATE KEY-----MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJgxNofg0zDl9CyD
Hem/zFoDGE521TP+bmd+X1ce0Zuhc3NTPH96GHxzdGCkZyKDzclc5g5dp+bHc5Lb
wR3d7Z+YLlijlEPoNEecEKJ3bwSNDk+AJN102oO9xdTdgwfiw7Wo0HHkxCmT3Yq3
812q4gmbOGCmM/Xkw7kIUdxT3Rm9AgMBAAECgYA2W92OSs8j9/5up6ZXhxoGTHSy
Ed+04nusm4aSJ3/WhqQl3OUO4x071kELA62StmEaOwQwvWLrGvI80iD3+fyVJ1Co
hRbrUddjApQrnFBbP8yy1ZtsjHe3l2uJAVEW/nc0t16Z4X/QAmIPkI47V+Sgz7UH
LYuUjS2GzxxAtw6mAQJBAMhzjrJXU3ki5LQxgPQuCCBonTxYXQ+vCNeCz4NGnf5k
TlZOzUkOQFAz0Tn3zFubLsAAW121HcvkIfzlCH4p/AkCQQDCXgy5Ex0iOIeLDVig
hSWLLq3dc+/F44SIb8/Xlp0qvEjkDlDKUzRO1tlPdhm6t3LeesnvkvG5T1xJgrPG
1UUVAkAxugkSUPuSN4fI8+brrGezsoAfMkST2XY2EGtuQ5x6OWP9oTrn/rMRsmkb
GlAGAa9NTklcK8wigouz8xVyRvQRAkBLN75QuRbjMWEy7L1JkX1P+YaLVtyJhly5
uBuE4OJ9sVO7/dZCFiT+BaMfXyLh4TBw7K/NKN6myhF62TvdTJdpAkA5+vcaDV0a+guLBnd9egNW6lqGcqDvdIB3vb7bipCzYBPXpPwUqinbn3GKwu75ZJRN9JSFqjmo
6lkn89PAVGXP-----END PRIVATE KEY-----
生成公钥:
PKCS1的私钥生成公钥:
OpenSSL> rsa -in pkcs1_private.pem -pubout -out pkcs1_public.pem
writing RSA key
内容:
-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYMTaH4NMw5fQsgx3pv8xaAxhO
dtUz/m5nfl9XHtGboXNzUzx/ehh8c3RgpGcig83JXOYOXafmx3OS28Ed3e2fmC5Y
o5RD6DRHnBCid28EjQ5PgCTddNqDvcXU3YMH4sO1qNBx5MQpk92Kt/NdquIJmzhg
pjP15MO5CFHcU90ZvQIDAQAB-----END PUBLIC KEY-----
PKCS8的私钥生成公钥:
OpenSSL> rsa -in pkcs8_private.pem -pubout -out pkcs8_public.pem
writing RSA key
内容:
-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYMTaH4NMw5fQsgx3pv8xaAxhO
dtUz/m5nfl9XHtGboXNzUzx/ehh8c3RgpGcig83JXOYOXafmx3OS28Ed3e2fmC5Y
o5RD6DRHnBCid28EjQ5PgCTddNqDvcXU3YMH4sO1qNBx5MQpk92Kt/NdquIJmzhg
pjP15MO5CFHcU90ZvQIDAQAB-----END PUBLIC KEY-----
结果发现两个公钥都是一样的。
上面的转换都没有私钥密码
注意:
使用rsa进行加密的时候,如果报不正常长度,那么就要进行分段加解密。
RSA加解密:
1024位的证书,加密时最大支持117个字节,解密时为128;
2048位的证书,加密时最大支持245个字节,解密时为256。
加密时支持的最大字节数:证书位数/8 -11(比如:2048位的证书,支持的最大加密字节数:2048/8 - 11 = 245)
.NET中的RSA加密算法为了提高安全性,在待加密数据前要添加一些随机数,因此,使用.NET中的RSA加密算法一次最多加密117字节数据(多于117字节需要拆分成多段分别加密再连接起来),经过加密后得到一个长度为128字节的加密数据。
RSA实际可加密的明文长度最大也是1024bits,但问题就来了:如果小于这个长度怎么办?就需要进行padding,因为如果没有padding,用户无法区分解密后内容的真实长度,字符串之类的内容问题还不大,以0作为结束符,
但对二进制数据就很难理解,因为不确定后面的0是内容还是内容结束符。只要用到padding,那么就要占用实际的明文长度,于是才有117字节的说法。
我们一般使用的padding标准有NoPPadding、OAEPPadding、PKCS1Padding等,其中PKCS#1建议的padding就占用了11个字节。
如果大于这个长度怎么办?很多算法的padding往往是在后边的,但PKCS的padding则是在前面的,此为有意设计,有意的把第一个字节置0以确保m的值小于n。
这样,128字节(1024bits)-减去11字节正好是117字节,但对于RSA加密来讲,padding也是参与加密的,所以,依然按照1024bits去理解,但实际的明文只有117字节了。
在对接中使用流程:
一共有两组四个密钥:A的公钥(PUB_A),A的私钥(PRI_A);B的公钥(PUB_B),B的私钥(PRI_B)。
公钥一般用来加密,私钥用来签名。
通常公钥是公开出去的,但是私钥只能自己私密持有。
公钥和私钥唯一对应,用某个公钥签名过得内容只能用对应的私钥才能解签验证;同样用某个私钥加密的内容只能用对应的公钥才能解密。
这时A向B发送信息的整个签名和加密的过程如下:1、A先用自己的私钥(PRI_A)对信息(一般是信息的摘要)进行签名。2、A接着使用B的公钥(PUB_B)对信息内容和签名信息进行加密。
这样当B接收到A的信息后,获取信息内容的步骤如下:1、用自己的私钥(PRI_B)解密A用B的公钥(PUB_B)加密的内容;2、得到解密后的明文后用A的公钥(PUB_A)解签A用A自己的私钥(PRI_A)的签名。
从而整个过程就保证了开始说的端到端的唯一确认。A的签名只有A的公钥才能解签,这样B就能确认这个信息是A发来的;A的加密只有B的私钥才能解密,这样A就能确认这份信息只能被B读取。
但是在我的使用过程中,发现只能公钥加密,私钥解密,反之则不可以,私钥可以用来加签,对应的公钥可以用来验签。(应该是我哪里没搞懂,所以在不能私钥加密,公钥解密)
现在一般对接就是
1.用对方的私钥对消息进行加签生成sign,再将消息message跟sign使用对方的公钥进行加密
2.对方接收到数据以后,先用自己的私钥进行解密,再用私钥对解密出来的message进行加签,与传递过来的sign进行对比
RSA只是一个加密的算法,加签需要先对内容进行HASH然后再加密,比如SHA1WithRSA就是一个常用的RSA加签算法。
java pkcs8格式的私钥_RSA加密解密中pkcs1与pkcs8格式私钥互相转换相关推荐
- java rsa加密 加签_RSA加密解密与加签验签
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...
- java rsa 117_java实现RSA非对称加密解密
之前写过一篇java实现AES对称加密解密 在对密码加密传输的场景下 RSA非对称加密解密可能会更加适合. 原理就是后台生成一对公钥和私钥,公钥给前端用来加密,后台用私钥去解密,保证了传输过程中就算被 ...
- oracle加密可以跟java一致吗,在GBase 8s上使用java udr实现Oracle兼容的加密解密功能...
最近碰到客户从Oracle迁移到GBase 8s使用到字段加密解密功能,使用到了Utl_raw.cast_to_varchar2.Utl_raw.cast_to_raw.Utl_encode.base ...
- java rsa 验_Java使用RSA加密解密签名及校验
RSA加密解密类: package com.ihep; import java.io.BufferedReader; import java.io.BufferedWriter; import jav ...
- python rsa加密解密_RSA加密解密(python版)
RSA的算法涉及三个参数,n.e.d. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质: ...
- java rsa签名_Java使用RSA加密解密签名及校验
由于项目要用到非对称加密解密签名校验什么的,于是参考<Java加密解密的艺术>写一个RSA进行加密解密签名及校验的Demo,代码很简单,特此分享! 一.项目截图 代码下载后,导入到ecli ...
- JAVA与PHP之间进行aes加密解密
aes加密解密过程 用户数据应经过加密再传输,此文档为aes128加密(cbc模式)的说明 摘要算法为SHA-512 加密: 生成16位iv向量,使用该iv以及密钥加密原文 将加密后的真实密文与iv拼 ...
- python加密解密开源库_RSA加密解密(python版)
RSA的算法涉及三个参数,n.e.d. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质: ...
- openssl gmssl SM2 公私钥生成 加密解密命令
openssl 从 1.1.1 开始支持 sm2.gmssl 基于openssl 添加了对国密的支持. 检测 openssl 是否支持 SM2 openssl ecparam -list_curves ...
最新文章
- 20135234mqy 实验四
- 领歌LeangooV6.5.3:支持评论编辑,看板动态跳转
- 使用TensorFlow实现余弦距离/欧氏距离(Euclideandistance)以及Attention矩阵的计算
- 移动端实现PDF文件阅读的方法
- 采访与书评 —— 《BDD In Action》
- java 请求url 返回数据_java后台发起get请求获取响应数据|chu
- .net core 正则表达式 获取 等号后面的值_Python3 正则表达式
- 财务人毕业三年薪资翻了三倍,学会数据分析竟然这么吃香
- FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分
- android 画圆角背景颜色,android圆角矩形有背景颜色
- poj 1325 Machine Schedule 匈牙利二分匹配 基础
- mysql replace 只替换第一个_MySQL:replace函数的几种实用场景
- 2019.03.10_2.3 -2.6
- 基于matlab的声音个数识别
- 产品经理学习笔记-简约设计(1)
- 诺基亚808 PureView
- 二进制安装PLG日志服务
- android x86小白安装教程,电脑上安装Android 10小白教程,大屏Android用起来
- Powerbuilder10.5 中使用CRC16检验法
- 递推递归练习 H - 三国佚事——巴蜀之危
热门文章
- 【UVM基础】uvm_resource_db 使用介绍
- 岚山区教师招聘计算机试题,2019年山东省日照市岚山区中小学语文教师招聘/编制考试历年真题试卷及答案解析...
- Excel每页都打印表头
- 龙门标局:注册地理标志证明商标有什么作用
- 【程序员必修数学课】-基础思想篇-二进制-原码反码补码的数学论证
- mysql b 树 字符串索引_Mysql从入门到入神之(四)B+树索引
- 智能交通 路侧智能感知 应用层数据格式
- 阅读笔记--神经网络与深度学习(邱锡鹏)
- python pandas dataframe 不显示索引_Python DataFrame 设置输出不显示index(索引)值的方法...
- 数据库大表如何优化?