Java:摆脱 `Cipher.init()` 开销

2024-02-25

我需要提高以下方法的性能:

private byte[] decrypt(final byte[] encrypted, final Key key) throws ... {
    this.cipher.init(Cipher.DECRYPT_MODE, key);
    return this.cipher.doFinal(encrypted);
}

The cipher对象(“AES/ECB/NoPadding”)在构造函数中初始化,以便可以重用。欧洲央行自使用以来encrypted数组将始终仅包含 16 个字节的数据(即 1 个数据块)。使用 128 位密钥。

该方法被调用数百万次来解密 16 字节块,每次都使用不同的密钥。例如。该方法的调用方式如下:

final List<Key> keys = List with millions of keys
final byte[] data = new byte[] { ... 16 bytes of data go here ...}

for (final Key key : keys) {
    final byte[] encrypted = decrypt(data, key);

    // Do something with encrypted
}

The Cipher.init()占用了大部分时间decrypt方法,因为数据太小了。 IE。超过 1200 万次调用,Cipher.init()平均需要 3 微秒,而Cipher.doFinal()平均耗时

  • 什么需要这么长时间Cipher.init()?
  • 有什么办法可以只使用 Java 来加速这段代码吗?例如,利用这样的事实,我将始终只解密单个数据块?
  • 使用 C/C++ 实现并使用 JNI 调用它会更快吗?如果是这样,有没有成熟的图书馆?

我使用 JDK 1.8.0_73 并且我的处理器支持 AES-NI。


为什么 Cipher.init() 需要这么长时间?

在初始化期间,用户提供的密钥数据被扩展为加密和解密例程使用的会话密钥。

有什么办法可以只使用 Java 来加速这段代码吗?例如,利用这样的事实,我将始终只解密单个数据块?

是的,但这需要重写 AES 算法的基本部分。您可以在 JDK 源中找到它AES加密.java http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/0f6de62683a2/src/share/classes/com/sun/crypto/provider/AESCrypt.java.

或者,您可以存储预初始化密码列表而不是密钥。

使用 C/C++ 实现并使用 JNI 调用它会更快吗?如果是这样,有没有成熟的图书馆?

最有可能的是,是的。libcrypto这是 OpenSSL 的一部分,会有所帮助。这是一个例子 https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:摆脱 `Cipher.init()` 开销 的相关文章

  • 需要在没有wsdl的情况下调用soap ws

    我是网络服务的新手 这个网络服务是由 siebel 提供的 我需要调用一项网络服务 我的客户向我提供了以下详细信息 这是 SOAP 对于产品 请使用它作为端点 Request
  • removeall 和removeif 的用例

    我找到了这个 fun main val list MutableList
  • 在以下情况下强制 EditText 失去焦点:按下某些键盘按键以及当用户单击活动中的其他内容时

    我知道这个问题之前已经以多种不同的方式提出过 但即使我已经查看了许多有关 EditText 焦点的其他相关问题 我还没有找到我的解决方案 这是我想要实现的目标 当用户完成编辑 EditText 后 我 希望它失去焦点 当用户点击 EditT
  • Java制作一条有向线并使其移动

    我想画一条有向线并让它移动 我能够绘制一条有向线并移动该线 但当我移动该线时箭头会移位 这是我的绘画方法 Line2D Double line new Line2D Double startX startY endX endY g2d dr
  • Java 中的 dcevm 真正热插拔 vs JRebel/LiveRebel 稳定性

    I just 已安装 http blog jetbrains com idea 2013 07 get true hot swap in java with dcevm and intellij idea DCEVM http dcevm
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • 以编程方式从 java 代码中查找 java.exe 的绝对路径

    如果我有一个由用户启动的 java jar 或类文件 假设在环境变量中设置了 java 路径 那么我如何从代码中找出 java exe javaw exe 的绝对路径文件正在启动 就像在 ubuntu 上一样 我们可以运行 which ja
  • 使用 API 将文件上传到 Google 云端硬盘并出现错误 403

    我想将 zip 文件上传到 Google 云端硬盘 我使用 Java 快速入门 https developers google com drive v3 web quickstart java https developers google
  • Android 许可证测试响应 - 从来不工作

    我一直在开发一个 Android 应用程序 该应用程序已发布到 Google Play 对于下一次更新 versionCode 3 我的客户希望包含 LVL 许可方案 我做的第一件事是设置来自许可服务器的静态测试响应 我将测试响应设置为LI
  • 用于 Eclipse Galileo 的 Java“clone()”方法生成器

    java最好的工具是什么clone Eclipse Galileo 中的方法生成可从存储库中获取吗 是什么原因阻止 Eclipse 开发人员将此工具包含在标准版本中 实施起来非常困难clone 正确的 这样做被认为不是一个好的做法 Bloc
  • Java 8 流中的 JUnit 断言

    假设我将三个对象保存到数据库中并将数据库生成的 ID 设置为其中 我不知道从方法返回的对象的顺序saveToDb 但我想测试这些生成的 ID 是否存在 我如何在流中做到这一点 我想做这样的事情 List
  • Java IO 性能问题

    我在用 PrintWriter out new PrintWriter new BufferedWriter new FileWriter test txt 1024 1024 500 写入大文件 约 2GB 写入需要26秒 但是 当我用
  • 将 UUID 存储为 base64 字符串

    我一直在尝试使用 UUID 作为数据库键 我希望占用尽可能少的字节数 同时仍然保持 UUID 表示形式的可读性 我认为我已经使用 base64 将其减少到 22 个字节 并删除了一些尾随的 这些 对于我的目的来说似乎没有必要存储 这种方法有
  • Android设备到PC的socket连接

    我面临着建立从 Android 设备到 PC 的特定端口的套接字连接的问题 例如8080 我只想创建一个套接字 它将连接到特定端口并在该端口上写入一些数据流 我为此目的编写了一些代码 但代码给了我一个例外 TCP Error java ne
  • 如何使用 ArchUnitTest 检查泛型中的依赖关系?

    我们有一条规则 包 foo 不应该依赖于包 bar noClasses that resideInAPackage com foo should dependOnClassesThat resideInAPackage com bar ch
  • 用 Java 解析 RFC 2822 电子邮件地址

    许多人不知道 电子邮件地址需要一个库来解析 简单的正则表达式 例如 还不够 电子邮件地址甚至可以包含评论 其中可以包含诸如 破坏简单的正则表达式 有一个Node js 库 https github com baudehlo node add
  • 如何使用 Apache POI API 将图像添加到 pptx 中添加的图像占位符?

    我已经预定义了带有文本和图像占位符的 pptx 模板 我如何从模板访问和修改这些占位符 我可以使用 POI pptx API 直接将图像和文本添加到幻灯片中 但如何将其添加到模板的占位符中 请参阅链接以了解如何添加占位符来创建固定模板 ht
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • SAML 服务提供商 Spring Security

    当使用预先配置的服务提供者元数据时 在 Spring Security 中 是否应该有 2 个用于扩展元数据委托的 bean 定义 一份用于 IDP 元数据 一份用于 SP 元数据
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans

随机推荐