使用Base64的AES会为同一纯文本生成不同的加密结果吗?

这是一个名为test()的示例虚拟代码,我运行了100K次,我得到了相同纯文本的不同加密消息(显然,我得到的解密是原始纯文本)。

我想这背后的原因是避免频率; 但是为什么一个解密会有多少加密呢? 不应该是一比一吗?

public static void test() { String plainMessage = "I'm gonna bid 100 USD on this project"; String password = "A99922000001000004581F0F0CCD0000"; Set set = new HashSet(); for (int x=0; x"+set.size()); //just to make sure they are all unique } 

加密

  public static String encryptMessage(final String plainMessage, final String symKeyHex) { final byte[] symKeyData = DatatypeConverter.parseHexBinary(symKeyHex); final byte[] encodedMessage = plainMessage.getBytes(Charset.forName("UTF-8")); try { final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); final int blockSize = cipher.getBlockSize(); // create the key final SecretKeySpec symKey = new SecretKeySpec(symKeyData, "AES"); // generate random IV using block size (possibly create a method for // this) final byte[] ivData = new byte[blockSize]; final SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG"); rnd.nextBytes(ivData); final IvParameterSpec iv = new IvParameterSpec(ivData); cipher.init(Cipher.ENCRYPT_MODE, symKey, iv); final byte[] encryptedMessage = cipher.doFinal(encodedMessage); // concatenate IV and encrypted message final byte[] ivAndEncryptedMessage = new byte[ivData.length + encryptedMessage.length]; System.arraycopy(ivData, 0, ivAndEncryptedMessage, 0, blockSize); System.arraycopy(encryptedMessage, 0, ivAndEncryptedMessage, blockSize, encryptedMessage.length); final String ivAndEncryptedMessageBase64 = DatatypeConverter.printBase64Binary(ivAndEncryptedMessage); return ivAndEncryptedMessageBase64; }catch (InvalidKeyException e) { throw new IllegalArgumentException("key argument does not contain a valid AES key"); }catch (GeneralSecurityException e) { throw new IllegalStateException("Unexpected exception during encryption", e); } } 

为评论添加一些清晰度:

iv初始化 向量类似于用于加密数据的第二密钥

由于每次使用随机iv (这很好),每次都会得到不同的加密文本 。 第二个密钥实际上包含在加密文本中 ,因此您无需单独传递它。

只使用iv不能破解加密 (这就是为什么你可以将它与加密文本一起传递),但是通过使用它,你可以多次使用相同的密码发送相同的纯文本 (使用不同的ivs)并获得完全不同的加密值