我需要在Crypto ++中实现相当于BouncyCastle的 “ECIESwithAES-CBC / NONE / PKCS7Padding” 。
主要原因是我需要在iOS上加密数据并使用Java中的BouncyCastle在后端解密,我们希望使用这些特定的算法/配置。
我对C ++没有任何经验,但这是我迄今为止在Crypto ++中所获得的:
// loaded private key
const unsigned char* privateKey;
size_t keyLength;
AutoSeededRandomPool prng;
ECIES_BC<ECP>::Decryptor decryptor;
decryptor.AccessPrivateKey().Load(StringStore(privateKey, keyLength).Ref());
ECIES_BC<ECP>::Encryptor encryptor(decryptor);
std::string plain("a"); // the message
std::string cipher;
SecByteBlock key(AES::DEFAULT_KEYLENGTH);
prng.GenerateBlock( key, key.size() );
byte iv[ AES::BLOCKSIZE ];
prng.GenerateBlock( iv, sizeof(iv) );
CBC_Mode< AES >::Encryption e;
e.SetKeyWithIV( key, key.size(), iv );
StringSource ss1( plain, true,
new StreamTransformationFilter( e,
new StringSink( cipher ), StreamTransformationFilter::PKCS_PADDING
) // StreamTransformationFilter
); // StringSource
std::string cryptogram;
StringSource ss2 (cipher, true,
new PK_EncryptorFilter(prng, encryptor, new StringSink(cryptogram) ) );
// ... decrypt cryptogram in bouncy castle
这是java部分:
private static final Provider SECURITY_PROVIDER = new BouncyCastleProvider();
public byte[] decryptMessage(byte[] message) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance("EC", SECURITY_PROVIDER);
PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(
IOUtils.toByteArray(getClass().getResourceAsStream("/key.pkcs8")));
PrivateKey privKey = keyFactory.generatePrivate(privSpec);
Cipher cipher = Cipher.getInstance("ECIESwithAES-CBC/NONE/PKCS5Padding", SECURITY_PROVIDER);
cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] result = cipher.doFinal(message);
return result;
}
目前,当我从Crypto ++获取输出并尝试在BouncyCastle中解密时,它会引发异常:
javax.crypto.BadPaddingException: pad block corrupted
at org.bouncycastle.jcajce.provider.asymmetric.ec.IESCipher.engineDoFinal(Unknown Source)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
...
我不确定这是否真的是填充问题,还是我做错了什么?
非常感谢任何建议和帮助 谢谢!
PS:我已经应用了CryptoWiki
中提到的充气城堡补丁