当我尝试使用相同的密钥再次加密密文时,它会生成原始明文。
使用的算法 AES , COUNTER MODE 。 键和 IV 保持不变。
这是算法应该表现的方式吗?如果, Cipher.ENCRYTMODE 的用途是什么,它将作为Cipher.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));
}
}
答案 0 :(得分:4)
是的,这是预期的行为。 CTR mode of operation for block ciphers从块密码中生成流密码。由于流密码的工作方式是它们生成密钥流,并使用明文对密钥流进行异或运算以生成密文:
plaintext XOR AES-CTR(nonce, key) = ciphertext
XOR操作的工作方式是,x
与k
项进行两次异常会再次导致x
:
x ^ k ^ k = x
这就是为什么加密和解密与CTR模式下的分组密码完全相同的操作(无法生成nonce并将其放入密文)。
如果您不希望加密和解密算法相同,那么您应该使用不同的模式,例如CBC,但这种事情没有任何问题。
请注意,要使CTR模式安全,您必须在同一密钥下使用不同的nonce / IV进行每次加密。