【问题标题】:Android AES and init vectorAndroid AES 和初始化向量
【发布时间】:2011-03-18 15:36:21
【问题描述】:

我在 AES 加密和解密方面遇到问题:我可以完全更改我的 IV,但我仍然能够解码我的数据。

public static final byte[] IV = { 65, 1, 2, 23, 4, 5, 6, 7, 32, 21, 10, 11, 12, 13, 84, 45 };
public static final byte[] IV2 = { 65, 1, 2, 23, 45, 54, 61, 81, 32, 21, 10, 121, 12, 13, 84, 45 };
public static final byte[] KEY = { 0, 42, 2, 54, 4, 45, 6, 7, 65, 9, 54, 11, 12, 13, 60, 15 };
public static final byte[] KEY2 = { 0, 42, 2, 54, 43, 45, 16, 17, 65, 9, 54, 11, 12, 13, 60, 15 };
//public static final int BITS = 256;

public static void test()
{
    try
    {
        // encryption
        Cipher c = Cipher.getInstance("AES");
        SecretKeySpec keySpec = new SecretKeySpec(KEY, "AES");
        c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(IV));

        String s = "Secret message";
        byte[] data = s.getBytes();

        byte[] encrypted = c.doFinal(data);

        String encryptedStr = "";
        for (int i = 0; i < encrypted.length; i++)
            encryptedStr += (char) encrypted[i];


        //decryoption
        Cipher d_c = Cipher.getInstance("AES");
        SecretKeySpec d_keySpec = new SecretKeySpec(KEY, "AES");
        d_c.init(Cipher.DECRYPT_MODE, d_keySpec, new IvParameterSpec(IV2));

        byte[] decrypted = d_c.doFinal(encrypted);
        String decryptedStr = "";
        for (int i = 0; i < decrypted.length; i++)
            decryptedStr += (char) decrypted[i];
        Log.d("", decryptedStr);

    }
    catch (Exception ex)
    {
        Log.d("", ex.getMessage());
    }
}

任何想法我做错了什么?如何获得 256 位 AES 加密(仅将密钥更改为 32 字节长数组?)

加密对我来说是一个新话题,所以请新手友好的答案。

【问题讨论】:

    标签: android encryption initialization aes


    【解决方案1】:

    您没有指定密码模式,因此提供商可能默认为电子密码本模式(“ECB”)并完全忽略 IV。您可以通过比较多次运行程序产生的密文来验证这一点;我猜他们都是一样的。

    密码块链接(“CBC”)得到普遍支持和广泛使用,但正确的模式取决于您的应用程序。

    您也没有指定填充,因此提供者选择了默认值。 JCE 所称的“PKCS5Padding”是对称密码的常见选择。

    提供完整的规范,包括算法、模式和填充,而不是指定“AES”作为算法,例如“AES/CBC/PKCS5Padding”。

    您不必在 Cipher 名称中指定 AES 密钥大小;它是根据您用于初始化密码的密钥的大小推断出来的。

    【讨论】:

    • 非常感谢您的快速回答,代码现在完美运行。我对填充有疑问:是否可以获得 16 字节长的填充(用零填充数据)?查看此列表:download.oracle.com/javase/6/docs/technotes/guides/security/… 我发现只有 8 字节长的填充。如果这种填充没有内置函数,我应该如何实现它?只是在加密之前在我的数据末尾添加零吗? (例如:数据 = 13 个字节,所以我在末尾添加了 3 个字节,值为 0)
    • @Donald_W:您可以尝试指定“NoPadding”。一些提供者将此解释为用零填充,但您可能会发现其他提供者拒绝不是偶数块大小的输入。
    • 你能看看我的问题吗?我似乎无法让它工作。 stackoverflow.com/questions/34061675/…
    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 2016-10-18
    • 2021-10-05
    相关资源
    最近更新 更多