0

Google Tink支持“混合加密”——一种用非对称密钥加密对称密钥、用对称密钥加密明文并将两个密文捆绑为一条消息的便捷方法。

但是,似乎它基本上支持两组参数组合:

EciesAeadHkdfPrivateKeyManager.eciesP256HkdfHmacSha256Aes128GcmTemplate();
EciesAeadHkdfPrivateKeyManager.eciesP256HkdfHmacSha256Aes128CtrHmacSha256Template();

在内部,这些映射到例如

  public static final KeyTemplate eciesP256HkdfHmacSha256Aes128GcmTemplate() {
    return createKeyTemplate(
        EllipticCurveType.NIST_P256,
        HashType.SHA256,
        EcPointFormat.UNCOMPRESSED,
        AesGcmKeyManager.aes128GcmTemplate(),
        KeyTemplate.OutputPrefixType.TINK,
        EMPTY_SALT);
  }

AesGcmKeyManager.aes128GcmTemplate()交换例如for似乎相当简单AesGcmKeyManager.aes256GcmTemplate(),除了createKeyTemplate是私有的,并且 THAT 使用包私有方法,并且EciesAeadHkdfPrivateKeyManager是最终的,总体而言,它似乎正在竭尽全力防止我们弄乱这些参数。这有什么原因吗?我应该从 Tink 源代码中重新构建我自己的修改版本和/或只是使用反射来绕过private,还是有隐藏的非正交性让我绊倒并使结果不安全?

4

1 回答 1

2

创建者将“难以误用”作为设计目标,特别是接口“安全保证”的想法。(https://github.com/google/tink/blob/master/docs/SECURITY-USABILITY.md

“例如,如果底层加密模式需要随机数并且如果重复使用随机数是不安全的,那么 Tink 不允许用户传递随机数。”

我可以看到这在这种情况下是如何应用的,但是有一个已弃用的类 ( com.google.crypto.tink.hybrid.HybridKeyTemplates) 可以执行您所描述的操作。它有一个createEciesAeadHkdfKeyTemplate接受所有内部参数的公共方法(https://github.com/google/tink/blob/master/java_src/src/main/java/com/google/crypto/tink/hybrid/HybridKeyTemplates.java# L127 )

于 2021-01-22T06:57:20.763 回答