当前位置: 首页 > 知识库问答 >
问题:

1块(16字节)的Java AES-128加密返回2块(32字节)作为输出

闻人和泽
2023-03-14

我使用下面的AES-128加密代码对一个16字节的块进行编码,但是编码值的长度给出了两个32字节的块。我是不是漏掉了什么?


    plainEnc = AES.encrypt("thisisapassword!");


    import java.security.*;
    import java.security.spec.InvalidKeySpecException;
    import javax.crypto.*;
    import sun.misc.*;

    public class AES {

         private static final String ALGO = "AES";
         private static final byte[] keyValue = 
            new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't',
    'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };

    public static String encrypt(String Data) throws Exception {
            System.out.println("string length: " + (Data.getBytes()).length); //length = 16
            Key key = generateKey();
            Cipher chiper = Cipher.getInstance(ALGO);
            chiper.init(Cipher.ENCRYPT_MODE, key);
            byte[] encVal = chiper.doFinal(Data.getBytes());
            System.out.println("output length: " + encVal.length); //length = 32
            String encryptedValue = new BASE64Encoder().encode(encVal);
            return encryptedValue;
        }

        public static String decrypt(String encryptedData) throws Exception {
            Key key = generateKey();
            Cipher chiper = Cipher.getInstance(ALGO);
            chiper.init(Cipher.DECRYPT_MODE, key);
            byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
            byte[] decValue = chiper.doFinal(decordedValue);
            String decryptedValue = new String(decValue);
            return decryptedValue;
        }
        private static Key generateKey() throws Exception {
            Key key = new SecretKeySpec(keyValue, ALGO);
            return key;
    }

}

共有1个答案

费星晖
2023-03-14

cipher.getInstance(“aes”)返回使用PKCS#5填充的密码。这种填充在所有情况下都是添加的--当明文已经是块大小的倍数时,就会添加一整块填充。

cipher.getInstance()调用中显式指定您的意图,以避免依赖默认值,从而可能导致混淆:

Cipher.getInstance("AES/ECB/NoPadding");

你还会看到你使用的是ECB模式,这几乎在任何情况下都是一个糟糕的选择。

 类似资料:
  • 这应该是一个简单的问题,但我无法从openssl文档中找到任何示例或答案。 我想加密128位,应该适合一个加密块。 所以我调用,然后呢? 我是否调用(加密 128 位块)和(即使没有更多要加密的内容)? 还是只有?还是只有?

  • 以下示例有什么问题? 问题是解密字符串的第一部分是无意义的。不过,其余的都很好,我明白了...

  • 我在Java中使用AES加密/解密时遇到了一个非常奇怪的问题。如果我加密/解密的字符串小于16字节,则密码可以正常工作,但如果我向密码提供大于16字节的任何内容,则会出现错误“给定最终块未正确填充”。我构建了一些小代码作为示例: 当byte[]消息为“Hello”时,加密/解密工作正常,但当我将其更改为“hellomybabyhellomydright”时,它抛出异常。有人知道我做错了什么吗?

  • 问题内容: 如果我有一个字节变量: 为什么以下工作: …但这不是吗? 编译器第一理解为第二吗? [编辑] 我知道演员,但我想提请您注意 我认为它们是平等的,那么为什么编译器会有所不同呢?之间有什么区别 问题答案: 因为是的等效项,而的类型被提升为(JLS§5.6.2二进制数值提升),因此,如果不进行显式转换,则不能将其结果分配给它。 根据JLS,§15.26.2复合赋值运算符: 形式为E1 op

  • 使用sizeof()打印变量的大小 为什么sizeof()返回int的大小,而不是短int,即2个字节?