将ECIES ECP CryptoPP转换为JAVA

时间:2012-09-27 18:57:58

标签: java bouncycastle jce elliptic-curve crypto++

我有一个202字节的密钥,用于解密二进制文件。

StringSource keyStr( key, Z3_KEY_LENGTH, true );
AutoSeededRandomPool rng;
ECIES<ECP>::Decryptor ellipticalEnc( keyStr );
unsigned char *tmpBuffer( new unsigned char[ src.Size() ] );
DecodingResult dr = ellipticalEnc.Decrypt( rng, src.Data(), src.Size(), tmpBuffer );

我尝试使用jsafejce:

PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(key);
KeyFactory factory = KeyFactory.getInstance("EC", "JsafeJCE");
PrivateKey privateKey = factory.generatePrivate(privKeySpec);
Cipher eciesDecrypter = Cipher.getInstance("ECIES/SHA1/HMACSHA1", "JsafeJCE");

Cipher eciesDecrypter = Cipher.getInstance("ECIESwithXOR/SHA1/HMACSHA1", "JsafeJCE");

但是第一个我得到一个块错误,必须除以16,而第二个我得到一个mac检查错误。

有人有任何建议吗?

2 个答案:

答案 0 :(得分:1)

好吧,我真的不知道你在代码中想要做什么。我会尝试回答一些问题。


  

将ECIES ECP CryptoPP转换为JAVA

为了从Crypto ++中获取观点,它与以下一样难以理解:

// Assuming your key was DER Encoded
byte key[Z3_KEY_LENGTH] = ...;

ECIES<ECP>::Decryptor decryptor;
decryptor.BERDecodePublicKey(ArraySource(key, sizeof(key)).Ref(), false, sizeof(key));

const ECPPoint& point = decryptor.GetPublicElement();
const Integer& x = point.x;
const Integer& y = point.y;

如果您的密钥不是DER编码,请参阅Crypto ++ wiki中的Keys and Formats。您还可以在Elliptic Curve Integrated Encryption Scheme上找到维基页面。

Java 7提供了ECPoint class,它采用了X和Y坐标。


> ECIES<ECP>::Decryptor ellipticalEnc( keyStr );
> unsigned char *tmpBuffer( new unsigned char[ src.Size() ] );
> DecodingResult dr = ellipticalEnc.Decrypt( rng, src.Data(), src.Size(), tmpBuffer );

这看起来不太合适,但你没有展示足够的代码。

size_t maxLength = decryptor.MaxPlaintextLength( src.Size() );
unsigned char *tmpBuffer = new unsigned char[ maxLength ];

DecodingResult dr = ellipticalEnc.Decrypt( rng, src.Data(), src.Size(), tmpBuffer );
if( !result.isValidCoding )
    throw runtime_error("failed to decrypt cipher text");

unsigned char *buffer = new unsigned char[ result.messageLength ];
std::cpy(tmpBuffer, buffer, result.messageLength);

答案 1 :(得分:0)

您是否尝试在密钥末尾添加一些空字节,使其长度为208字节?这可能会修复您的块大小错误。