【问题标题】:Build up a cipher instance manually without getInstance在没有 getInstance 的情况下手动构建密码实例
【发布时间】:2021-10-13 09:27:12
【问题描述】:

我似乎没有找到“手动”构建密码实例的方法。每个教程和资源都有相同的方式通过 Cipher.getInstance

Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5Padding");

我要做的是手动构建 Cipher 实例,方法是为它提供我的决定的分组密码、它的模式以及我自己的类的填充方案,希望通过接口具有正确的方法。

因此,作为一个示例,尝试执行以下操作:

Cipher cipher = Cipher(new AESEngine());
...give cipher instance custom class which provides padding scheme
...

上面是虚构的,用来解释我在追求什么。

这样做是为了学习。

【问题讨论】:

  • 不清楚你的问题是什么。 JCA 不会按您希望的方式工作;你在问什么替代方案?
  • 我的回答有什么遗漏吗,Ruohonleikkuri?请注意,您应该始终至少为您在 StackOverflow 上使用的语言提供一个标签,否则您将获得更少的视图、赞成票和答案 - 也不会自动突出显示代码,但这并不重要。
  • 什么都没有。你的回答很有道理。我会在接下来的几周内尝试 CipherSpi 方法,届时我将再次有时间。然后我回到这里,甚至可能有一个完整的代码示例需要审查。感谢您的标签提示。

标签: java encryption cryptography jce


【解决方案1】:

你是因为看错了课程。为此,您需要实现CipherSpi - 一个服务提供者接口 - 然后是implementProvider 以及正确的Service。您的 SPI 应该依次使用分组密码的软件或硬件实现。

Cipher 已明确设计 要求getInstance,否则您可以绕过提供者签名和作为(或曾经是)JDK 一部分的有限加密。但是,在 Android 和 OpenJDK 上,您不再需要签署提供程序。

除此之外,您还剩下带有反射等的非常丑陋的黑客,以绕过Cipher 构成的障碍。您必须自己查找这些内容;正如最新的运行时所示,真的不再需要了。


如果您认为这太复杂了,并且您可以使用与 Cipher 不兼容的纯软件实现,您可以查看 Bouncy Castle "lightweight API"

Bouncy Castle 也以相同的方式实现了提供程序,但由于代码的大小,它作为示例可能过于复杂。当然,您也可以出于自己的目的决定将您的代码集成到 BC 中。

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 2016-01-03
    • 2010-11-20
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多