ECC解密对应于Bouncy Castle的ECIES

时间:2014-06-17 17:17:35

标签: java ruby encryption cryptography openssl

我正在尝试使用

解密Ruby中使用ECIES加密的文件
  • BouncyCastle作为JCE提供者
  • ECIES算法
  • P-384命名曲线

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

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

有没有人知道在Ruby中这样做的方法?我最糟糕的情况是简单地从Ruby调用Java解密路由,但这实际上不是我想要的方式。

1 个答案:

答案 0 :(得分:4)

  

ECC解密对应于Bouncy Castle的ECIES

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


  

在Ruby中,我能找到的是OpenSSL :: PKey :: EC实现

OpenSSL 有ECIES实现。它也没有执行Abdalla,Bellare和Rogaway的DHAES。


  

我最糟糕的情况是简单地从Ruby调用Java解密路由,但这实际上不是我想要的方式。

您可能需要使用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();