检索javax.crypto.Cipher
的实例时,您可以请求特定的提供商或让系统选择一个:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding" /*, here may be Provider parameter*/);
保证是否省略provider参数将始终有效,并且在一个系统上加密的消息可以在另一个系统上解密? 或者,换句话说,提供商A只负责实施和提供商A加密的文本吗?
答案 0 :(得分:2)
您正在使用standard algorithm names,因此代码将始终有效。如果具有比标准提供者更高优先级的其他提供程序实现相同的算法,则选择此提供程序。但提供商在这里并不重要。
如果参数 IV (初始化向量)相同,则CBC mode中使用PKCS#5填充的AES加密仅产生相同的结果。
您可以将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)解密结果。这就是加密标准的重点。
答案 1 :(得分:0)
在Oracle的Java Cryptography Architecture (JCA) Reference Guide中说:
实现互操作性意味着各种实现都可以 彼此合作,互相使用钥匙,或互相核实 签名。例如,这意味着同样的情况 算法,一个提供者生成的密钥可以使用 另一个,并且由一个提供者生成的签名是可验证的 另一个
因此不同提供商的结果应匹配。
仍然像@Artjom B.提到的错误可能会发生。