eit*_*tch 4 ruby java encryption openssl cryptography
我正在尝试使用Java使用ECIES加密的Ruby中的文件解密
在Java中,加密是使用Cipher.doFinal()完成的,然后写入文件中。一个测试用例实现了加密和解密。
在Ruby中,我能找到的只是OpenSSL :: PKey :: EC实现,但这似乎没有加密或解密,而只有验证和签名。
有人知道在Ruby中执行此操作的方法吗?我最坏的情况是从Ruby调用Java解密路由,但这确实不是我想要的方式。
弹性城堡对应ECIES的ECC解密
ECIES是Shoup的集成加密系统。它不仅仅是简单的EC加密和解密。您可以在ISO公开密钥加密标准提案中找到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> >;
//! 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();
Run Code Online (Sandbox Code Playgroud)