【发布时间】:2013-11-18 10:15:39
【问题描述】:
我正在尝试将一些信息从 1 个网络应用程序发送到一个 android 应用程序,但是这些信息必须加密存储在网络应用程序中。 为此,我尝试使用对称密钥加密我的 Web 应用程序中的数据,并使用相同的密钥在应用程序中对其进行解密。
以下是我在服务器上生成加密数据的代码:
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: pad block损坏
我怀疑这是因为 secureRandom 在常规应用程序和 android 应用程序中生成的数字不同(尽管具有相同的种子)。但是,我看不到使用另一种方式来使用 secureRandom 或不使用它的方式。
我们将非常感谢任何有助于实现这项工作的帮助,以及有关这种加密方法的安全性的任何评论。
【问题讨论】:
-
你有没有试过专门设置加密算法(AES)后的方法和填充。在加密和解密中获取一个像这样的 Cipher.getInstance("AES/ECB/PKCS5Padding") 的 Cipher 实例。
-
对不起,我不太明白你的意思,我已经使用了 Cipher.getInstance("AES") 对吧?
-
是的,这就是算法,但有时系统使用不同的默认方法(ECB,CBC)和填充(PKCS5Padding,NoPadding)......所以设置这些可能会解决你的问题......如果不是那么它就是不同的键(它必须是相同的字节)
-
密码 c = Cipher.getInstance("AES");更改为 Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");在加密和解密中,仍然不解码。还检查了随机种子,这是相同的。仍然感觉它与随机性有关,因为当我在同一台机器上编码和解码时(无论是在手机上还是在桌面应用程序中)它确实有效。
-
它也可能是 SecureRandom 类本身。 java.security.SecureRandom 类不实现伪随机数生成器。相反,它使用其他类中的实现,例如 sun.security.provider.SecureRandom 和 sun.security.provider.NativePRNG,具体取决于所使用的操作系统。因此,请尝试在您的加密/解密方法上使用 SUN SHA1PRNG:SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
标签: java android security random