BouncyCastle包含许多对称加密引擎,以及RSA和ElGamal加密引擎(非对称引擎)。它还有很多关于如何使用这些引擎执行加密/解密过程的在线资源。然而,BouncyCastle没有提供椭圆曲线引擎(请检查github/bc)。在审查代码后,所有非对称引擎都实现了
这有点令人困惑,因为BouncyCastle提供了生成基于预定义和众所周知的曲线的不同密钥强度的EC密钥对的能力,例如下面的示例:
AsymmetricBlockCipher
接口,但其中没有一个是EC引擎。这有点令人困惑,因为BouncyCastle提供了生成基于预定义和众所周知的曲线的不同密钥强度的EC密钥对的能力,例如下面的示例:
public static AsymmetricCipherKeyPair GenerateKeys(int keySize)
{
DerObjectIdentifier oid;
switch (keySize)
{
case 192:
oid = X9ObjectIdentifiers.Prime192v1;
break;
case 224:
oid = SecObjectIdentifiers.SecP224r1;
break;
case 128:
oid = SecObjectIdentifiers.SecP128r1;
break;
case 239:
oid = X9ObjectIdentifiers.Prime239v1;
break;
case 256:
oid = X9ObjectIdentifiers.Prime256v1;
break;
case 384:
oid = SecObjectIdentifiers.SecP384r1;
break;
case 521:
oid = SecObjectIdentifiers.SecP521r1;
break;
default:
throw new InvalidParameterException("unknown key size.");
}
ECKeyPairGenerator gen = new ECKeyPairGenerator();
SecureRandom secureRandom = new SecureRandom();
X9ECParameters ecps = CustomNamedCurves.GetByOid(oid);
ECDomainParameters ecDomainParameters = new ECDomainParameters(ecps.Curve, ecps.G, ecps.N, ecps.H, ecps.GetSeed());
ECKeyGenerationParameters ecKeyGenerationParameters = new ECKeyGenerationParameters(ecDomainParameters, secureRandom);
gen.Init(ecKeyGenerationParameters);
return gen.GenerateKeyPair();
}
有一些引擎,例如IESEngine
,在加密/解密过程中提供了一个公共/私人EC协议
(例如ECDHBasicAgreement
),但它并不直接使用公共/私人密钥,而是从两个密钥计算出一个新的对称密钥,然后使用预定义的对称密码来加密明文消息。
我的问题是:
- BC是否真的没有像
ElGamalEngine
和RSAEngine
那样易于使用的EC Engine
? - 如果是,如何使用上述函数生成的
ECKeyParameters
直接实现安全的EC加密/解密过程(如果可能)?
提前感谢。
code
。 - Uwe Keim