鍍金池/ 問答/Java  網(wǎng)絡(luò)安全/ 使用Openssl生成的RSA密鑰,在java代碼中加解密報(bào)錯(cuò)

使用Openssl生成的RSA密鑰,在java代碼中加解密報(bào)錯(cuò)

不要回答了,我自己剛問完就發(fā)現(xiàn)問題了,在java代碼里生成公鑰時(shí),在填寫公鑰指數(shù)時(shí),應(yīng)該填寫十六進(jìn)制,我填成十進(jìn)制了。。。。最近一直睡眠不足,這種小問題,半天才發(fā)現(xiàn)


OS: Mac OS 10.12.6
OpenSSL version: 0.9.8zh 14 Jan 2016
Java: jdk1.8.0_131.jdk


1.我使用“genrsa -out key.pem 1024”指令,生成出一把普通的RSA密鑰對(duì),長度為1024;

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDBLACwdLLJUaB+DtAQS1khxmeoi4wg7LXg7oFW4XUCDZDa4wGS
xwPXyscYnPdc3AnTfUjmFrQnX2AOuTKC1l8VSZhFJsuKpILGQB0meForfJyTsv30
TvR/HKDzh4Fk2kN/QpxU9wxirMsBAoAHP4v73rQK+VqtStjLyMr/A+D39wIDAQAB
AoGAA3FVUc/Cn/PkeFqrOp8dJ4zxq/9QsAWH+EpH49SA0ViMjFofXQ5O8zmZ8sZZ
Yj5Jros9EVy2OT1p6NlEHTDU4PRPue8pcZCNpQVyOiAOpuQhkrQbfJT27LbjyWSO
e4vQ2bmpMrmrksjkERaC1I8a1D+ArtcWEG4FFK5nePHWqAECQQDoM2Qe91u9pMut
ZBPdt6WtW5k6nlCj7d+VVcbrFMP4zR4rs70w/RoZlsvB5ySFzGYSCVoaoJmc/0wn
aNB5gdO3AkEA1PiNHCEstfHMToEOmLYKdbo4WTVn8+axirDPmrK+L2cjK08VZD2m
SA7zz4Ts0m4xV9wmZmtHYv97XBbtYGB9wQJAOFlAUsN0X/E9/DXtHEEU050G8lK4
/w8a0wKd4y6G4DnmuHRF1T2Wt98AU23kTxPrMTVTyGJw5MiPkoC9Fr+KwQJAcjLN
R9YqKW39BeOCNjT3KuWuLXfLxCdh8GKbD/LktHpzi1eeut+r+Fu8NPysGLJp1xj/
pk/EObuRJHJO2y0igQJBAKiLNfAKXK3fhVtlrHU8dohq1VAD3IrXXm/2QR42fn9g
VzNu21R53cqioa1Sna0+F3oOLfjZN3557ckOv0cZeL0=
-----END RSA PRIVATE KEY-----

2.再用“rsa -in key.pem -text -out key.txt”,來獲取實(shí)際數(shù)據(jù);

Private-Key: (1024 bit)
modulus:
    00:c1:2c:00:b0:74:b2:c9:51:a0:7e:0e:d0:10:4b:
    59:21:c6:67:a8:8b:8c:20:ec:b5:e0:ee:81:56:e1:
    75:02:0d:90:da:e3:01:92:c7:03:d7:ca:c7:18:9c:
    f7:5c:dc:09:d3:7d:48:e6:16:b4:27:5f:60:0e:b9:
    32:82:d6:5f:15:49:98:45:26:cb:8a:a4:82:c6:40:
    1d:26:78:5a:2b:7c:9c:93:b2:fd:f4:4e:f4:7f:1c:
    a0:f3:87:81:64:da:43:7f:42:9c:54:f7:0c:62:ac:
    cb:01:02:80:07:3f:8b:fb:de:b4:0a:f9:5a:ad:4a:
    d8:cb:c8:ca:ff:03:e0:f7:f7
publicExponent: 65537 (0x10001)
privateExponent:
    03:71:55:51:cf:c2:9f:f3:e4:78:5a:ab:3a:9f:1d:
    27:8c:f1:ab:ff:50:b0:05:87:f8:4a:47:e3:d4:80:
    d1:58:8c:8c:5a:1f:5d:0e:4e:f3:39:99:f2:c6:59:
    62:3e:49:ae:8b:3d:11:5c:b6:39:3d:69:e8:d9:44:
    1d:30:d4:e0:f4:4f:b9:ef:29:71:90:8d:a5:05:72:
    3a:20:0e:a6:e4:21:92:b4:1b:7c:94:f6:ec:b6:e3:
    c9:64:8e:7b:8b:d0:d9:b9:a9:32:b9:ab:92:c8:e4:
    11:16:82:d4:8f:1a:d4:3f:80:ae:d7:16:10:6e:05:
    14:ae:67:78:f1:d6:a8:01

3.也就是說:

N: 00C12C00B074B2C951A07E0ED0104B5921C667A88B8C20ECB5E0EE8156E175020D90DAE30192C703D7CAC7189CF75CDC09D37D48E616B4275F600EB93282D65F1549984526CB8AA482C6401D26785A2B7C9C93B2FDF44EF47F1CA0F3878164DA437F429C54F70C62ACCB010280073F8BFBDEB40AF95AAD4AD8CBC8CAFF03E0F7F7
E: 65537
D: 03715551CFC29FF3E4785AAB3A9F1D278CF1ABFF50B00587F84A47E3D480D1588C8C5A1F5D0E4EF33999F2C659623E49AE8B3D115CB6393D69E8D9441D30D4E0F44FB9EF2971908DA505723A200EA6E42192B41B7C94F6ECB6E3C9648E7B8BD0D9B9A932B9AB92C8E4111682D48F1AD43F80AED716106E0514AE6778F1D6A801

4.在Java代碼中,我先通過上面的Modulus和Exponent來生成RSA公私鑰。然后使用RSA、ECB、OAEPwithSHA256andMGF1Padding的方式對(duì)16字節(jié)的數(shù)據(jù)進(jìn)行加密。最后對(duì)結(jié)果再用相同的方式解密??墒墙饷軙r(shí)報(bào)出異常,異常內(nèi)容:javax.crypto.BadPaddingException: Decryption error。
4-1.我自己用其他軟件來生成密鑰對(duì),帶入Java代碼中運(yùn)算,就沒有出現(xiàn)這個(gè)問題,原始數(shù)據(jù)和加密解密后數(shù)據(jù)也匹配。
4-2.我在Java代碼中,使用KeyPair keyPair = keyPairGenerator.generateKeyPair()這個(gè)方式,通過Java來生成密鑰對(duì),再做運(yùn)算,也不會(huì)出錯(cuò),原始數(shù)據(jù)和加密解密后數(shù)據(jù)也匹配。
4-3.我又在Openssl中生成2048的密鑰,還是出問題,報(bào)同樣的異常。


麻煩有經(jīng)驗(yàn)的人能幫我分析一下問題大概有可能出在哪,多謝。

回答
編輯回答
柒槿年

一般來說,私鑰不只有d和n這兩個(gè)參數(shù),而是由n、e、d、p、q、dP、dQ、qInv這8個(gè)參數(shù)構(gòu)成,參閱RSAPrivateCrtKeySpec

2017年6月8日 01:23