我加密在網絡服務器鳳凰城的一些數據:的Java解密RSA加密的數據ArrayIndexOutOfBoundsException異常:太多的數據,RSA塊
private_key = ExPublicKey.load!("private.pem")
token = %{username: user.username, mobile_phone: user.mobile_phone, email: user.email}
payload = Poison.encode!(token)
{:ok, signature} = ExPublicKey.encrypt_private(payload, private_key)
和解密它的Java(實際上安卓)客戶端如下:
try {
byte[] keyBytes = Base64.decode(Constants.RSA_PUBLIC_KEY.getBytes(), Base64.DEFAULT);
X509EncodedKeySpec encodedKeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(encodedKeySpec) ;
Cipher cipher = Cipher.getInstance("RSA") ;
cipher.init(Cipher.DECRYPT_MODE, publicKey) ;
//
Log.e(DEBUG_TAG, jwt) ; // received token
String payload = new String(Base64.decode(jwt, Base64.DEFAULT), "UTF-8") ; // java does UTF16, elixir does UTF8
Log.e(DEBUG_TAG, payload) ; // base64 decoded token
byte[] cipherText = cipher.doFinal(payload.getBytes("UTF-8")) ; // decrypt
String token = new String(Base64.decode(cipherText, Base64.URL_SAFE), "UTF-8") ; // cipher text is urlencoded
Log.e(DEBUG_TAG, token) ;
return null ;
} catch (Exception e) {
e.printStackTrace();
}
上有鳳凰一側沒有異常,但試圖解密關於java導致異常的標記:
java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block
at com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineDoFinal(CipherSpi.java:459)
at javax.crypto.Cipher.doFinal(Cipher.java:1502
如果輸入對於RSA模數過大,它應該導致網絡服務器出錯。所以我想知道什麼是錯誤的。
更新:好像有一個問題與庫。通過簽署一些數據的SHA256摘要產生的輸出返回344字節,而對於所使用的密鑰長度,其輸出應該是256字節。恢復使用Erlang的public_key
模塊,現在工作正常。
1.什麼是數據和密鑰大小?數據長度必須小於密鑰大小。 2.除非您使用非對稱加密(RSA),否則可以使用AES來處理您需要的任何大小的數據。 – zaph
在我看來,你沒有加密任何東西。用私鑰「加密」稱爲*簽名*和用公鑰解密,並比較結果稱爲*驗證*。你想達到什麼目標?通常,散列是有符號的,而不是實際的數據。 –
我最初計劃使用RSA密鑰進行加密(而不是簽名),以避免管理AES密鑰的麻煩。但這裏的問題在於此。即使只將2048位私鑰應用於SHA256數據散列,Java端仍然會以相同的異常失敗。 – DarthPaghius