部分解密应该是可能的,因为前一个块使用了部分密文和密钥。不过,我没有找到任何这样的例子。有帮助吗?
解密代码如下:
//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();
}
是的,有可能。
您需要选择块边界上的“部分”,长度是块大小的倍数,并使用前一个块作为IV。对于AES,块大小为16字节。
如果“部分”包括最后一个块,请指定正确的填充,否则请指定不填充NoPadd
:AES/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中实现)到设备的同步有序文件传输。流式传输文件不是一个选项,因此每个文件块都封装在一条包含其他非加密字段的消息中,这些字段超出了本问题的范围。 其中一个要