我使用Gwt-crypto得到了一些非常奇怪的错误。当我尝试从首选项加载playerId时,我会执行以下操作:
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 :(得分:0)
byte[] key = generator.decodeKey("jdkreur74832904ufke3382r2o3ijf9w");
此方法需要HEX字符串作为输入。所以你的密钥似乎对我无效。 (除非你在这里用无效垃圾替换它)因此它会导致加密和解密失败。
3DES还要求密钥长度在1-24个字节之间。如果它更长,它可能会导致问题。
并且,InvalidCipherTextException:pad块损坏:大多数加密方案在末尾添加一些随机/半随机字节,因此长度是算法的合适数字的倍数(如16或32)。如果你以某种方式得到这个错误,这可能意味着,加密文本的最后一部分丢失或损坏。
<强>更新强>
以下是TripleDesGenerator,Hex和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
由于您已使用同步方法解决了问题,因此我认为您的初始问题是由于某些线程问题。但据我所知,上述问题仍然存在。