【问题标题】:decode encrypted information on android在android上解码加密信息
【发布时间】: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


【解决方案1】:

问题是 SecureRandom,它没有使用相同的随机数生成器,而且我后来发现无论如何都不应该用于这些目的。相反,我使用了完美运行的 MessageDigest。

【讨论】:

    猜你喜欢
    • 2013-03-19
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2011-07-04
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多