2017-04-10 80 views
0

我使用Gwt-crypto得到了一些非常奇怪的錯誤。當我嘗試加載從喜好playerId我做了以下內容:Gwt加密 - 解密導致的奇怪異常耗時過長?

public long loadIdFromPref(){ 
     Preferences preferences = Gdx.app.getPreferences(HelperKeys.Preferences.GAME_PREFS); 
     String secret = decryptString("ab0c441ca9dbd026bbb98a588e7d34d579dd00c326fbd38a"); 
     Long value = Long.parseLong(secret); 
     return value; 
    } 

DecryptString方法:

private String decryptString(String string) 
    { 
     try 
     { 
      string = getEncryptor().decrypt(string); 
     } 
     catch (DataLengthException e) 
     { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) 
     { 
      e.printStackTrace(); 
     } catch (InvalidCipherTextException e) 
     { 
      e.printStackTrace(); 
     } 

     return string; 
    } 

的時候,我碰到下面的錯誤約30%:

java.lang.NumberFormatException: For input string: "53096146ン8}+ン│ ̄" 
at java.lang.Long.parseLong(Long.java:589) 
at java.lang.Long.parseLong(Long.java:631) 
at java.util.TimerThread.mainLoop(Timer.java:555) 
at java.util.TimerThread.run(Timer.java:505) 

事實上,它有時而不是別人會導致我相信解密有時會花費很長時間,代碼在完成之前還會繼續。這可能嗎?我能做些什麼呢?

我得到另一個錯誤約5%的時間,很難重新創建:

InvalidCipherTextException: pad block corrupted 

會在並欣賞的任何信息太多,不知道這意味着什麼。

供參考,在這裏是我如何啓動encryptor

setEncryptor(new TripleDesCipher()); 
ripleDesKeyGenerator generator = new TripleDesKeyGenerator(); 
byte[] key = generator.decodeKey("jdkreur74832904ufke3382r2o3ijf9w"); 
getEncryptor().setKey(key); 

請讓我知道如果你需要更多的信息來幫助。

回答

0
byte[] key = generator.decodeKey("jdkreur74832904ufke3382r2o3ijf9w"); 

該方法需要一個十六進制字符串作爲輸入。所以你的關鍵似乎對我無效。 (除非你在這裏用無效的垃圾代替它)因此它會導致加密和解密失敗。

另外3DES要求密鑰長度在1-24字節之間。如果時間更長,可能會導致問題。

InvalidCipherTextException:pad block已損壞:大多數加密方案在結尾處添加了一些隨機/半隨機字節,因此長度是算法(如16或32)的合適數字的倍數。如果你以某種方式得到這個錯誤,這可能意味着,加密文本的最後部分丟失或損壞。

UPDATE

下面是TripleDesGenerator,十六進制和HexEncoder類的源代碼的鏈接。如果你跟隨他們,你會看到它產生於非六角輸入意想不到的事情: https://github.com/surevine/gwt-crypto/blob/master/src/main/java/com/googlecode/gwt/crypto/client/TripleDesKeyGenerator.java https://github.com/surevine/gwt-crypto/blob/master/src/main/java/com/googlecode/gwt/crypto/bouncycastle/util/encoders/Hex.java https://github.com/surevine/gwt-crypto/blob/master/src/main/java/com/googlecode/gwt/crypto/bouncycastle/util/encoders/HexEncoder.java

既然你已經使用syncronized方法解決您的問題,我認爲您最初的問題是由於某些線程問題。但據我所知,上述問題仍然存在。

+0

我通過使decryptString()同步來修復它。並沒有等待它完成。不需要是HEX值。 –

+0

@Green_qaue請檢查我的更新到答案。 – xycf7