我应该如何使AES在Java中任意长度的字符串上工作?

时间:2018-06-28 19:54:42

标签: java aes

过去2个小时,我一直在阅读AES,这是到目前为止我要展示的内容:

static String decrypt(byte[] encrypted){
    try{
        Key aesKey = new SecretKeySpec(System.getenv("CRYPTO_KEY").getBytes(), "AES");
        // The key is 32 bytes long.
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, aesKey);
        return new String(cipher.doFinal(encrypted));
    } catch(Exception e){
        System.out.println("decrypt() failed.");
        e.printStackTrace();
        return null;
    }
}

static byte[] encrypt(String plaintext){
    try{
        Key aesKey = new SecretKeySpec(System.getenv("CRYPTO_KEY").getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, aesKey);
        return cipher.doFinal(plaintext.getBytes());
    } catch(Exception e){
        System.out.println("encrypt() failed.");
        e.printStackTrace();
        return null;
    }
}

我知道AES对每个16字节的块进行操作,但是我认为不能保证我的输入字符串为16字节或更小。是否有一种简单的方法可以使该密码在任意长度的字符串上工作?还是我只需要将输入分成16个字节的块并手动运行每个块?

1 个答案:

答案 0 :(得分:2)

“ AES / CBC / PKCS5Padding”允许任意长度的数据。问题代码应正确处理任意长度的数据。

是的,AES是一种基于块的密码,但这并不意味着更高的层无法使用它来处理任意长度的数据。在这种情况下,Cipher是一个更高级别的实现。

首先,实现需要对底层分组密码进行多次调用,以处理传递给它的全部数据。

第二个填充(例如PKCS#7)(很多时候错误地称为PKCS#5)将填充字节添加到最后一个块,以使数据达到块大小的倍数。

在同一层中,这些较高的层可以实现几种模式,例如CBC,ECB,CTS,CTR等。CTS和CTR是使用其他方法处理任意数据长度而不添加填充的示例模式。