我正在尝试找到源代码的实现。
例如,如果我像这样初始化密码对象:
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
如何找到所使用的 AES 算法和 CTR 模式的实际实现?
如果我查找 Cipher.java 的源代码,您可以看到 getInstance() 方法使用了一些服务提供者。我猜这行是:
List<Service> services = GetInstance.getServices(cipherServices);
负责将“AES/CTR/NoPadding”与创建的 CipherSpi 对象进行匹配。
但现在我被困住了,我不知道发生了什么。这是如何运作的?在哪里可以找到 AES 和 CTR 的源代码? 它与此 .../sun/crypto/provider 文件夹中的类匹配吗? 这种匹配是如何进行的?我在哪里可以看到与什么输入相匹配的内容? 我还想弄清楚 CTR 模式是否使用某种并行性。
您的问题没有直接答案,因为这取决于您当前使用的 JDK 等。
直接引用 Java 17 的 Java Cryptography Architecture 文档
java.security.Provider 是所有安全提供程序的基类。每个 CSP [加密安全提供程序] 都包含此类的一个实例,其中包含提供程序的名称并列出它实现的所有安全服务/算法。当需要特定算法的实例时,JCA 框架会查询提供者的数据库,如果找到合适的匹配项,则会创建该实例。
提供者包含一个包(或一组包),为所宣传的加密算法提供具体的实现。默认情况下,每个 JDK 安装都会安装和配置一个或多个提供程序。可以静态或动态地添加额外的提供者。客户端可以配置其运行时环境来指定提供者偏好顺序。优先顺序是在没有请求特定提供商时搜索提供商以获取所请求服务的顺序。
因此,根据您的设置,它可以是 JDK 为
AES/CTR/NoPadding
提供的任何算法。
您可以通过提供您想要的提供商来控制您使用的提供商
Cipher.getInstance("AES/CTR/NoPadding", "Provider");
Cipher
对象有一个方法getProvider()
来返回Provider
实例,该实例用于创建Cipher
对象。此类有多种方法来获取有关提供者本身的信息(例如名称)。您可以使用此信息来“逆向工程”哪个类或包正在实现该密码。请参阅以下示例:
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
System.out.println(cipher);
System.out.println(cipher.getClass());
Provider provider = cipher.getProvider();
System.out.println(provider);
System.out.println(provider.getName());
System.out.println(provider.getInfo());
System.out.println(provider.getClass());
这可以生成这样的输出(使用 openjdk 版本“1.8.0_362”):
javax.crypto.Cipher@7440e464
class javax.crypto.Cipher
SunJCE version 1.8
SunJCE
SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
class com.sun.crypto.provider.SunJCE
您可以检查 JDK 或任何已安装的提供程序 JAR(如 BouncyCastle)以获取实现类。对于 OpenJDK,该类的实现位于 https://github.com/openjdk/jdk/blob/b3cc0c84316dd59f406a6fa23fcaf3d029910843/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java。从那里您可以检查其他相关课程,例如
AESCipher
或 AESCrypt
。