I am trying to find the implementations of the source code.
For example, if I initialize the Cipher-object like this:

Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");

我如何才能找到所使用的AES算法和CTR模式的实际实现?

如果我查找Cipher.java的源代码,您会发现getInstance()方法使用了一些服务提供者.我猜这句台词是:

List<Service> services = GetInstance.getServices(cipherServices);

负责将"aes/ctr/NoPadding."与创建的CipherSpi-Object匹配.

但现在我被困住了,我不知道发生了什么.这是怎么回事?我在哪里可以找到AES和CTR的源代码? 它与这个.../sun/crypto/provider文件夹中的课程匹配吗? 这种匹配是如何工作的?我在哪里可以看到什么与什么输入匹配? 我还想弄清楚CTR模式是否使用了某种并行性.

推荐答案

Cipher对象有一个返回Provider实例的方法getProvider(),该实例用于创建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.从那里,您可以查看其他相关类,如AESCipherAESCrypt.

Java相关问答推荐

在Spring Boot中测试时出现SQL语法错误

Java JAR环境(JRE)是否支持模块?

在spring—data中自动发现native—sql查询期间遇到重复的SQL别名[id]

Java模式匹配记录

有关手动创建的包的问题

我无法将附件发送到NetBeans之外

Java记录的不同序列化/反序列化

存根基类的受保护方法

如何从错误通道回复网关,使其不会挂起

第二次按下按钮后,我需要将按钮恢复到其原始状态,以便它可以再次工作

使用UTC时区将startDatetime转换为本地时间

Java中将文本拆分为数字或十进制数字和字符串

如何只修改父类ChroniclerView位置0处的第一个嵌套ChroniclerView(child)元素?

如何读取3个CSV文件并在控制台中按顺序显示?(Java)

为了安全起见,有必要复制一份 list 吗?

为什么我的登录终结点不能被任何请求访问?

如何以事务方式向ibmmq发送消息

如何用Micrometer&;斯普肯

在输入端没有可行的替代方案'; Select *';

@此处不能应用可为null的批注