java AESCTR双重加密将密文反转为明文
当我尝试用相同的密钥再次加密密文时,它会生成原始明文
使用的算法是AES和计数器模式键和IV保持不变
这就是算法应该表现的方式吗?如果是,那么密码有什么用呢。ENCRYTMODE将作为密码的第一个参数给出。init()
这是我测试的示例程序
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));
}
}
# 1 楼答案
是的,这是预期的行为。{a1}将分组密码转换成流密码。由于流密码的工作方式是生成密钥流,并将密钥流与明文异或以生成密文:
XOR操作的工作方式是,用一个键
k
对x
进行两次异或运算,结果再次是x
:这就是为什么在CTR模式下,加密和解密对于分组密码是完全相同的操作(无nonce生成并将其放入密文中)
如果你不希望加密和解密算法是相同的,那么你应该使用一种不同的模式,比如CBC,但这类事情没有错
请注意,为了确保CTR模式的安全性,每次加密都必须在同一密钥下使用不同的nonce/IV