使用 AES/ECB/NoPadding 与 PKCS5Padding 进行加密

中国的膳宿条件

我没有代码不工作的问题,但它令人困惑,我不知道为什么即使我使用 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;
}

}

fgb

使用PKCS5Padding,则始终添加填充。没有不需要填充的字符串。一个 16 字节的字符串将产生一个 32 字节的输出(下一个 16 的倍数)。

参见Wikipedia 上的Padding例如:

如果原始数据是 N 字节的整数倍,则添加值为 N 的额外字节块。这是必要的,以便解密算法可以确定地确定最后一个块的最后一个字节是指示添加的填充字节数的填充字节还是明文消息的一部分。

考虑一个明文消息,它是 N 字节的整数倍,明文的最后一个字节是 01。没有附加信息,解密算法将无法确定最后一个字节是明文字节还是填充字节。但是,通过在 01 明文字节后为每个值 N 添加 N 个字节,解密算法始终可以将最后一个字节视为填充字节,并从密文的末尾剥离适当数量的填充字节;表示要根据最后一个字节的值剥离的字节数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法复制从Java到PHP中使用AES / ECB / PKCS5Padding加密方法

AES / CBC / PKCS5PADDING IV - 解密中的NodeJS(在Java中加密的)

使用NodeJS进行RSA PKCS#1加密

即使使用填充AES / CBC / PKCS5Padding,CipherInputStream / CipherOutputStream的最后一个块也不完整

从Java转换为C#-使用PKCS5Padding解密CBC-AES-256

从Java AES / CBC / PKCS5Padding进行C#加密/解密

如何使用AES / CBC / PKCS5Padding生成用于加密和解密的AES密钥

在PHP中复制Java的AES / CBC / PKCS5Padding加密

使用md5消息摘要和DESede / CBC / PKCS5Padding将用于3DES加密的Java代码转换为python

所有类型的Android设备均可使用AES / CBC / PKCS5Padding加密解密算法和SHA-1哈希算法吗

Java使用aes256 / CBC / PKCS7Padding加密文件

使用NodeJS进行对称加密

使用SwiftyRSA进行RSA加密

使用Blowfish / CBC / PKCS5Padding加密和解密数据

在使用PKCS7Padding解密已经加密的数据时,可以使用PKCS5Padding填充算法吗?

使用CryptoJS解码(Base64)和解密(AES / CBC / PKCS5PADDING)-React

C#中的Java AES / CBC / PKCS5Padding

如何在dart中使用AES CBC 256位和PKCS5Padding进行加密和解密以及如何检索参数

从ColdFusion加密解密NodeJS中的AES / CBC / PKCS5Padding

在Dart中解密AES / CBC / PKCS5Padding加密

用Java加密/解密“ AES / ECB / PKCS5Padding”

使用Caesar密码进行加密

如何使用Objective-c实现AES PKCS5Padding

Ruby中的Coldfusion“ AES / CBC / PKCS5Padding”解密

使用AES进行视频加密

使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

在目标 c 中,如何使用 md5 作为密钥进行 AES256 加密?

使用 AES/CBC/PKCS7Padding 加密/解密

解密 AES/GCM/PKCS5Padding iOS Swift