javax.crypto.Cipher可以为不同的提供者返回不同的结果吗?

时间:2015-01-15 14:36:02

标签: java encryption

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

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

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

2 个答案:

答案 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.提到的错误可能会发生。