我正在尝试解密使用 Java 中的 ECIES 加密的 Ruby 文件

  • BouncyCaSTLe 作为 JCE 提供者
  • ECIES 算法
  • P-384 命名曲线

  • 在 Java 中,加密是使用 Cipher.doFinal() 完成的,然后写入文件。一个测试用例实现加密和解密。

    在 Ruby 中,我只能找到 OpenSSL::PKey::EC 实现,但这似乎没有加密或解密,而只有验证和签名。

    有谁知道在 Ruby 中执行此操作的方法?我最糟糕的情况是简单地从 Ruby 调用 Java 解密路由,但这确实不是我想要的方式。

    最佳答案



    ECIES 是 Shoup 的集成加密系统。它不仅仅是简单的 EC 加密和解密。您可以在 A Proposal for an ISO Standard for Public Key Encryption 找到 Shoup 的论文。



    OpenSSL 没有 ECIES 实现。它也没有 Abdalla、Bellare 和 Rogaway 的 DHAES 的实现。



    您可能不得不使用 Java。

    相关(抱歉徘徊在 C++):Crypto++ 也有 ECIES。但是,Bouncy CaSTLe 和 Crypto++ 实现不能开箱即用地互操作。请参阅 Crypto++ 邮件列表上的 Problem with the way gfpcrypt HMAC's the encoding parameters' length in DHAES_MODE

    互操作问题是使用 DHAES_MODE 时作为安全参数散列的标签大小的差异。 Crypto++ 使用 8 个八位字节的标签,而 Bouncy CaSTLe 使用 4 个八位字节的标签。我不记得谁是/是正确的。

    Elliptic Curve Integrated Encryption Scheme 上的 Crypto++ 页面底部,有一个基于 Jessie Wilson 在 cryptopp-ecies-bc.zip 上的评论的可用补丁。下载并应用它,然后使用 ECIES_BC 类而不是 ECIES 类。

    这就是补丁的本质。 BC_COMPAT 是一个模板参数。

    diff --git a/gfpcrypt.h b/gfpcrypt.h
    index 7af993f..18ea104 100644
    --- a/gfpcrypt.h
    +++ b/gfpcrypt.h
    @@ -408,7 +408,9 @@ CRYPTOPP_DLL_TEMPLATE_CLASS DL_PrivateKey_GFP<DL_GroupParameters_DSA>;
     CRYPTOPP_DLL_TEMPLATE_CLASS DL_PrivateKey_WithSignaturePairwiseConsistencyTest<DL_PrivateKey_GFP<DL_GroupParameters_DSA>, DSA2<SHA> >;
    
     //! the XOR encryption method, for use with DL-based cryptosystems
    -template <class MAC, bool DHAES_MODE>
    +// Set BC_COMPAT=true if interop'ing with Bouncy Castle. Thanks to Jesse Wilson and Daniele Perito.
    +//   See https://groups.google.com/d/msg/cryptopp-users/vR8GSL8wxPA/Bf9koUDyZ88J.
    +template <class MAC, bool DHAES_MODE, bool BC_COMPAT = false>
     class DL_EncryptionAlgorithm_Xor : public DL_SymmetricEncryptionAlgorithm
     {
     public:
    @@ -442,9 +444,17 @@ public:
            mac.Update(encodingParameters.begin(), encodingParameters.size());
            if (DHAES_MODE)
            {
    -           byte L[8] = {0,0,0,0};
    -           PutWord(false, BIG_ENDIAN_ORDER, L+4, word32(encodingParameters.size()));
    -           mac.Update(L, 8);
    +           if (BC_COMPAT) {
    +               byte L[4];
    +               PutWord(false, BIG_ENDIAN_ORDER, L, word32(8 * encodingParameters.size()));
    +               mac.Update(L, 4);
    +           }
    +           else
    +           {
    +               byte L[8] = {0,0,0,0};
    +               PutWord(false, BIG_ENDIAN_ORDER, L+4, word32(encodingParameters.size()));
    +               mac.Update(L, 8);
    +           }
            }
            mac.Final(ciphertext + plaintextLength);
        }
    @@ -471,9 +481,17 @@ public:
            mac.Update(encodingParameters.begin(), encodingParameters.size());
            if (DHAES_MODE)
            {
    -           byte L[8] = {0,0,0,0};
    -           PutWord(false, BIG_ENDIAN_ORDER, L+4, word32(encodingParameters.size()));
    -           mac.Update(L, 8);
    +           if (BC_COMPAT) {
    +               byte L[4];
    +               PutWord(false, BIG_ENDIAN_ORDER, L, word32(8 * encodingParameters.size()));
    +               mac.Update(L, 4);
    +           }
    +           else
    +           {
    +               byte L[8] = {0,0,0,0};
    +               PutWord(false, BIG_ENDIAN_ORDER, L+4, word32(encodingParameters.size()));
    +               mac.Update(L, 8);
    +           }
            }
            if (!mac.Verify(ciphertext + plaintextLength))
                return DecodingResult();
    

    关于java - 来自 Bouncy CaSTLe 的 ECIES 对应的 ECC 解密,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24269743/

    10-12 02:30