慕碼人8056858
2019-10-29 14:25:34
我想用Java生成RSA-SHA256簽名,但無(wú)法在控制臺(tái)上生成與OpenSSL相同的簽名。這是我對(duì)OpenSSL所做的工作(在本教程之后):生成密鑰對(duì):openssl genrsa -out private.pem 1024提取公鑰:openssl rsa -in private.pem -out public.pem -outform PEM -pubout創(chuàng)建數(shù)據(jù)哈希:echo 'data to sign' > data.txtopenssl dgst -sha256 < data.txt > hash生成的哈希文件從(stdin)=我手動(dòng)刪除的文件開始(首先忘了提起它,謝謝mata)。簽名哈希:openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > signature為了在Java中重現(xiàn)結(jié)果,我首先將私鑰從PEM轉(zhuǎn)換為DER:openssl pkcs8 -topk8 -inform PEM -outform DER -in private.pem -nocrypt > private.der現(xiàn)在,我編寫了這個(gè)Java類來(lái)生成相同的簽名:public class RSATest { public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException { byte[] encodedPrivateKey = readFile("private.der"); byte[] content = readFile("data.txt"); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encodedPrivateKey); RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory .generatePrivate(keySpec); Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(content); byte[] signatureBytes = signature.sign(); FileOutputStream fos = new FileOutputStream("signature-java"); fos.write(signatureBytes); fos.close(); } private static byte[] readFile(String filename) throws IOException { File file = new File(filename); BufferedInputStream bis = new BufferedInputStream(new FileInputStream( file)); byte[] bytes = new byte[(int) file.length()]; bis.read(bytes); bis.close(); return bytes; }}不幸的是結(jié)果并不相同,所以我想我一定做錯(cuò)了什么,但我不知道該怎么辦。你們中的某人可以幫助我找到錯(cuò)誤嗎?
3 回答

四季花海
TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
在第一種情況下,您采用任意摘要并對(duì)其進(jìn)行簽名,在此過(guò)程中將丟失使用sha256創(chuàng)建的摘要的信息,因此生成的簽名將不/不能包含該信息,而第二種情況下的ASN1數(shù)據(jù)簽名表明確實(shí)如此。因此,只有在驗(yàn)證者確切知道摘要是如何產(chǎn)生的情況下,才可以驗(yàn)證第一個(gè)簽名,因此它不是真正無(wú)效,而是不完整(較低級(jí)別)的輸出。

瀟瀟雨雨
TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
你又是對(duì)的。使用您的命令,簽名與Java生成的簽名相同。但是另一個(gè)問(wèn)題出現(xiàn)在我身上。我的舊(不正確)簽名已使用命令成功驗(yàn)證,該命令openssl rsautl -verify -inkey public.pem -keyform PEM -pubin -in signature > verified
不再起作用。
添加回答
舉報(bào)
0/150
提交
取消