来自Bouncy Castle的ECC解密对应于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++邮件列表上的
使用DHAES_MODE时gfpcrypt HMAC编码参数长度方式的问题。
互操作性问题是使用DHAES_MODE时将哈希为安全参数的标签大小的差异。Crypto++使用8个字节的标签,而Bouncy Castle使用4个字节的标签。我不记得谁是/是正确的。
在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> >;
-template <class MAC, bool DHAES_MODE>
+
+
+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();