过去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个字节的块并手动运行每个块?
答案 0 :(得分:2)
“ AES / CBC / PKCS5Padding”允许任意长度的数据。问题代码应正确处理任意长度的数据。
是的,AES是一种基于块的密码,但这并不意味着更高的层无法使用它来处理任意长度的数据。在这种情况下,Cipher
是一个更高级别的实现。
首先,实现需要对底层分组密码进行多次调用,以处理传递给它的全部数据。
第二个填充(例如PKCS#7)(很多时候错误地称为PKCS#5)将填充字节添加到最后一个块,以使数据达到块大小的倍数。
在同一层中,这些较高的层可以实现几种模式,例如CBC,ECB,CTS,CTR等。CTS和CTR是使用其他方法处理任意数据长度而不添加填充的示例模式。