2017-04-10 100 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