我使用的是私有RSA密鑰來加密使用默認Java RSA實現一個隨機的AES密鑰:重新實現RSA解密在Java中
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] cipherBytes = cipher.doFinal(plainText.getBytes());
因爲我們需要一個公共密鑰,無論如何,這是一個方便的方法來僞裝密鑰並確保它已用我們的私鑰加密。解密同樣做:
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] plainBytes = cipher.doFinal(cipherBytes);
這正常工作與Oracle的JDK,但與IBM的失敗,因爲IBM認爲使用加密私鑰是不是一個有效的用例。不幸的是,我必須同時支持兩個JDK,所以我試圖自己重新實現RSA解密。
這是我到目前爲止的代碼:
BigInteger big = new BigInteger(cipherBytes);
big = big.modPow(pub.getPublicExponent(), pub.getModulus());
System.out.println(new String(big.toByteArray()));
它幾乎工作,但似乎有一個填充問題。大多數情況下,我會在原始文本的前面加上一串點狀符號,但有時它只是隨機字節。
不幸的是,我無法確定默認使用哪種填充方案。有誰知道我的代碼中缺少什麼,或者至少可以提供使用哪種算法填充處理的提示?
下面是一個輸入和輸出值的例子,根據要求。我使用了512位密鑰來避免太大的數字。
Public modulus : 8117919732251191237549784557538073836207094968952416063837701691514861428726690140363567956265691836505266266364256892197254736023284927189008247933889303
Public exponent: 65537
Plaintext: teststring
Plaintext as BN: 549665952565679142563431
Ciphertext as BN: 6304229782339071167863563708554898540621778162930150363326921290545577949349781053660336996882823758722402137580193903457839924005473545992074817339077456
"Decrypted" BN: 409173825987017733751648712103449894027080255755383098685411421012016724550584319360408761540738019643860835515945008876151848132891805352276483731047
Resultstring: ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇteststring
爲了解決爲什麼我這樣做了討論:
公鑰是硬編碼到我的軟件。我使用私鑰來加密AES的另一個密鑰。因此,要使用AES實際解碼任何內容,首先需要AES密鑰。要得到這個密鑰,你必須先用公鑰解密它。由於無需嚴格操作就無法修改公鑰,因此只有使用私鑰加密的AES密鑰才能工作。您可能會以某種方式提取公鑰並解密AES密鑰,但這很詳細,只能讓您獲得AES密鑰來解密安全內容。還有一個使用私鑰計算的簽名,該密鑰也使用公鑰進行驗證。所以操縱是不可能的。
所以是的,從技術上說簽名是足夠的,因爲有方法來閱讀內容。但這些都是精心設計的,我不介意是否有人真的把所有的麻煩都拿走了,但我不想讓事情變得簡單。
這不是一個有效的用例。有一件事必須是私人和其他公衆。當然,你可以放棄「私鑰」並保持「公鑰」的私密性,但這很愚蠢。 http://crypto.stackexchange.com/questions/2123/rsa-encryption-with-private-key-and-decryption-with-a-public-key –
PKCS1可能是一個很好的起點http://en.wikipedia .org/wiki/PKCS1爲了理解填充算法,你也可以檢查PKCS5和PKCS7填充標準桿 –
我檢查過PKCS填充,我不認爲它被使用。填充字節是填充字節的數量,因此必須有重複模式。不幸的是,情況並非如此。 – user1916974