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

我只能解密Java中使用AES/CBC加密的文件的一部分吗?

卞俊哲
2023-03-14

部分解密应该是可能的,因为前一个块使用了部分密文和密钥。不过,我没有找到任何这样的例子。有帮助吗?

解密代码如下:

    //skip the IV (ivSize is 16 here) - IV was pretended to the stream during encryption
    data.skip(ivSize);
    //skip n blocks
    int n = 2;
    System.out.println("skipped: " + data.skip(n*16));

    byte[] iv = new byte[ivSize];
    //use next 16 bytes as IV
    data.read(iv);

    // Hashing key.
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    digest.update(encryptionKey.getBytes(StandardCharsets.UTF_8));
    byte[] keyBytes = new byte[16];
    System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);

    Cipher cipher;
    try {
        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(iv);
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
    } catch (GeneralSecurityException e) {
        throw new IOException(e);
    }

    CipherInputStream cis = new CipherInputStream(data, cipher);
    try {
        ByteStreams.copy(ByteStreams.limit(cis, limit), output);
    } catch (IOException exception) {
        // starting with java 8 the JVM wraps an IOException around a GeneralSecurityException
        // it should be safe to swallow a GeneralSecurityException
        if (!(exception.getCause() instanceof GeneralSecurityException)) {
            throw exception;
        }
        log.warning(exception.getMessage());
    } finally {
        cis.close();
    }

共有1个答案

白浩荡
2023-03-14

是的,有可能。

您需要选择块边界上的“部分”,长度是块大小的倍数,并使用前一个块作为IV。对于AES,块大小为16字节。

如果“部分”包括最后一个块,请指定正确的填充,否则请指定不填充NoPaddAES/CBC/NoPadd在本例中。这将消除填充错误。只有最后一个块有/正在填充。

密码必须使用正确的填充选项进行实例化,具体取决于它是否是整个加密数据的最后一个块。

请参阅:PKCS#7填充(有时错误地称为PKCS#5),这是最常见的填充。

 类似资料:
  • 我使用以下命令加密了一个文件 openssl rand 32>test.key openssl enc-aes-256-cbc-iter 10000-pbkdf2-salt-输入test.txt-输出test.txt.enc-通过文件:test.key 我的代码 我得到的错误 我引用了以下链接 尝试使用时,仍然得到错误

  • 几天来,我一直试图用java解密一个用OpenSSL加密的消息。使用以下命令对邮件进行了加密: openssl enc-e-aes-256-cbc-kfile$file.key-in toto-out toto.enc。 文件file.key包含256位的对称密钥。命令中没有指定salt,但文件以salted__开头。下面是我编写的类,试图解密文件,但即使删除文件的16个字符也无法得到任何东西,即

  • 我有一个使用AES CBC加密的文件。我只知道密码有6个字符长,可能有10个字符。这个密码被散列为128位密钥。 但是,由于128位密钥解密需要很长时间,我如何解密此文件?

  • 我只想用这3种模式测试openSSL中的AES:128192和256密钥长度,但我解密的文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如1024字节)时,我的程序显示。。。我的意见总是一样的,但这并不重要,至少现在是这样。代码如下: 编辑: 当我将输出大小更改为而不是时,我得到了结果: 那么,是否有可能存在Outpus大小和IV大小的问题?它们应该有什么尺寸(AES-CB

  • 问题内容: PHP加密功能 当我尝试使用下面的函数在Java中解密此结果时,我得到的只是“ Test @ string”,而我则是“ @@BKxnfÈ〜¯Ô’M”。有什么想法我错了吗?谢谢 问题答案: 编辑:从Java 8开始,Java现在包括可接受的Base64类。 这条线 看起来错了。而是使用apache commons编解码器类或Harder base64 类。同样,mcrypt使用的默认填

  • 首先,这是我在这里的第一个问题,我希望我能让你对这个问题有一个清晰的认识,也能帮助其他可能面临类似挑战的人!问题的标题也是最短的TL;我能得到的医生:-) 所以为了给你一点背景知识,我基本上设计了一个协议,需要通过TCP从服务器(在Node.js中实现)到设备的同步有序文件传输。流式传输文件不是一个选项,因此每个文件块都封装在一条包含其他非加密字段的消息中,这些字段超出了本问题的范围。 其中一个要