可以 javax.crypto.Cipher return 不同的提供者得到不同的结果吗?

Can javax.crypto.Cipher return different results for different providers?

检索 javax.crypto.Cipher 的实例时,您可以请求特定的提供者或让系统选择一个:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding" /*, here may be Provider parameter*/);

是否保证省略提供者参数将始终有效,并且在一个系统上加密的消息可以在另一个系统上解密?
或者,换句话说,提供者是否只负责实施,提供者 A 加密的文本总是可以由提供者 B 解密?

Oracle 在 Java Cryptography Architecture (JCA) Reference Guide 中说:

Implementation interoperability means that various implementations can work with each other, use each other's keys, or verify each other's signatures. This would mean, for example, that for the same algorithms, a key generated by one provider would be usable by another, and a signature generated by one provider would be verifiable by another

因此不同提供商的结果应该匹配
仍然是@Artjom B。提到的错误可能会发生。

您正在使用 standard algorithm names,因此代码将始终有效。如果具有比标准提供程序更高优先级的另一个提供程序实现相同的算法,则选择该提供程序。但是供应商在这里并不重要。

如果参数 IV(初始化向量)相同,

AES 加密在 CBC mode 中使用 PKCS#5 填充只会产生相同的结果。

您可以将 IV 传递给 init 方法或让提供程序为您生成随机 IV:

cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv));

cipher.init(Cipher.ENCRYPT_MODE, secretKey); // random IV

您可以通过调用getIV()查询随机IV:

byte[] iv = cipher.getIV();

只要您知道 IV,就可以使用每个实现 AES/CBC/PKCS5Padding 的 JCE 提供程序或什至使用其他编程语言(例如带有 openssl 的 C)来解密结果。这就是加密标准的意义所在。