我正在尝试将一些信息从 1 个 Web 应用程序发送到 Android 应用程序,但是这些信息必须在 Web 应用程序中加密存储。 为此,我尝试使用对称 key 来加密 Web 应用程序中的数据,并使用相同的 key 在应用程序中对其进行解密。
以下是我在服务器上生成加密数据的代码:
String key = "someData";
SecretKeySpec sks = null;
try {
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed("exSeed".getBytes());
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(128, sr);
sks = new SecretKeySpec((kg.generateKey()).getEncoded(), "AES");
} catch (Exception e) {
}
byte[] encodedBytes = null;
try {
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.ENCRYPT_MODE, sks);
encodedBytes = c.doFinal(key.getBytes());
} catch (Exception e) {
}
jTextField5.setText(Base64.encode(encodedBytes));
以下是我在应用程序中读取数据的代码:
SecretKeySpec sks = null;
try {
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed("exSeed".getBytes());
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(128, sr);
sks = new SecretKeySpec((kg.generateKey()).getEncoded(), "AES");
} catch (Exception e) {
Log.e(TAG, "AES secret key spec error");
}
byte[] decodedBytes = null;
try {
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.DECRYPT_MODE, sks);
decodedBytes = c.doFinal(key);
} catch (Exception e) {
Log.e(TAG, "AES decryption error");
}
String decoded = new String(decodedBytes);
现在我遇到的问题是,解码时出现以下异常:javax.crypto.BadPaddingException:填充 block 损坏
我怀疑这是因为 secureRandom 不会在常规应用程序和 Android 应用程序中生成相同的数字(尽管具有相同的种子)。但是,我没有看到使用另一种方法来使用 secureRandom 或不使用它的方法。
任何帮助实现此功能的帮助都将受到极大的赞赏,任何有关这种加密方法的安全性的评论也将受到极大的赞赏。
最佳答案
问题是 SecureRandom,它没有使用相同的随机数生成器,而且我后来发现无论如何都不应该将其用于这些目的。相反,我使用了 MessageDigest,效果非常好。
关于java - 在android上解码加密信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20045235/