我没有代码不工作的问题,但它令人困惑,我不知道为什么即使我使用 16 字节长的字符串(所以不需要填充)我有奇怪的短输出 cG+etVq+7l+RfJS27jCtwg== (没有填充,但在加密之前它是 16 字节长)
对比
cG+etVq+7l+RfJS27jCtwskFauqkVxpbMJGODZoZe5c=(使用 PKCS5Padding,但字符串是相同的) 那么为什么?
public class AES {
private static SecretKeySpec secretKey;
private static byte[] key;
public static void setKey(String myKey)
{
key = myKey.getBytes("UTF-8");
secretKey = new SecretKeySpec(key, "AES");
}
public static String encrypt(String strToEncrypt, String secret)
{
try
{
setKey(secret);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
}
catch (Exception e)
{
System.out.println("Error while encrypting: " + e.toString());
}
return null;
}
public static String decrypt(String strToDecrypt, String secret)
{
try
{
setKey(secret);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
}
catch (Exception e)
{
System.out.println("Error while decrypting: " + e.toString());
}
return null;
}
public static SecretKeySpec getSecretKey() {
return secretKey;
}
public static void setSecretKey(SecretKeySpec secretKey) {
AES.secretKey = secretKey;
}
public static byte[] getKey() {
return key;
}
public static void setKey(byte[] key) {
AES.key = key;
}
}
使用PKCS5Padding
,则始终添加填充。没有不需要填充的字符串。一个 16 字节的字符串将产生一个 32 字节的输出(下一个 16 的倍数)。
参见Wikipedia 上的Padding例如:
如果原始数据是 N 字节的整数倍,则添加值为 N 的额外字节块。这是必要的,以便解密算法可以确定地确定最后一个块的最后一个字节是指示添加的填充字节数的填充字节还是明文消息的一部分。
考虑一个明文消息,它是 N 字节的整数倍,明文的最后一个字节是 01。没有附加信息,解密算法将无法确定最后一个字节是明文字节还是填充字节。但是,通过在 01 明文字节后为每个值 N 添加 N 个字节,解密算法始终可以将最后一个字节视为填充字节,并从密文的末尾剥离适当数量的填充字节;表示要根据最后一个字节的值剥离的字节数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句