AES-CTR双重加密将密文反转为明文



当我尝试用相同的密钥再次加密密文时,它会生成原始明文。

使用的算法是AES计数器模式KeyIV保持不变。

这就是算法的行为方式吗?如果,作为Cipher.init()的第一个参数,Cipher.ENCRYTMODE有什么用?

这是我测试的示例程序,

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class EncryptionTest {
    public static void main(String[] args) throws Exception {
        SecretKeySpec key = null;
        IvParameterSpec ivSpec = null;
        byte[] keyBytes = "usethiskeyusethiusethiskeyusethi".getBytes();
        byte[] ivBytes = "usethisIusethisI".getBytes();
        key = new SecretKeySpec(keyBytes, "AES"); //No I18N
        ivSpec = new IvParameterSpec(ivBytes);
        Cipher AesCipher = Cipher.getInstance("AES/CTR/NoPadding");

        byte[] byteText = "Your Plain Text Here".getBytes();
        AesCipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
        byte[] byteCipherText = AesCipher.doFinal(byteText);
        System.out.println("Encrypted : " + new String(byteCipherText));
        AesCipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
        byte[] bytePlainText = AesCipher.doFinal(byteCipherText);
        System.out.println("Double Encrypted : " + new String(bytePlainText));
    }
}

是的,这是预期的行为。分组密码的CTR操作模式使分组密码成为流密码。由于流密码的工作方式是生成密钥流,并将密钥流与明文异或以生成密文:

plaintext XOR AES-CTR(nonce, key) = ciphertext

XOR操作的工作方式是,用密钥kx进行两次异或,结果再次生成x

x ^ k ^ k = x

这就是为什么加密和解密对于CTR模式下的块密码是完全相同的操作(无随机数生成并将其放入密文)的原因。

如果你不希望加密和解密算法相同,那么你应该使用不同的模式,比如CBC,但这种事情没有错。

注意,为了使CTR模式安全,每次加密都必须在同一密钥下使用不同的nonce/IV。

相关内容

  • 没有找到相关文章

最新更新