BouncyCastle C#: 如何实现椭圆曲线加密/解密

4
BouncyCastle包含许多对称加密引擎,以及RSAElGamal加密引擎(非对称引擎)。它还有很多关于如何使用这些引擎执行加密/解密过程的在线资源。然而,BouncyCastle没有提供椭圆曲线引擎(请检查github/bc)。在审查代码后,所有非对称引擎都实现了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),但它并不直接使用公共/私人密钥,而是从两个密钥计算出一个新的对称密钥,然后使用预定义的对称密码来加密明文消息。

我的问题是:

  1. BC是否真的没有像ElGamalEngineRSAEngine那样易于使用的EC Engine
  2. 如果是,如何使用上述函数生成的ECKeyParameters直接实现安全的EC加密/解密过程(如果可能)?

提前感谢。


2
请不要将任意名称格式化为 code - Uwe Keim
1
您可能想阅读有关不同加密算法及其安全性的维基百科文章:https://en.wikipedia.org/wiki/Transport_Layer_Security。其中一种方法是椭圆曲线加密,RFC5289(维基中的参考文献)可以在此处找到:https://tools.ietf.org/html/rfc5289。 - jdweng
4
这与TLS无关,你为什么要提到它? - Maarten Bodewes
1
@jdweng 不,这不是问题,开发人员使用BouncyCastle或OpenSSL,因为这些库支持EC曲线、不同密钥强度的加密算法、哈希和HMac算法等更多功能,而这些功能在Microsoft的Crypto库中没有实现... 关于EC,我对该算法有很好的背景知识,并且在选择它之前已经阅读了很多资料,我相信它是安全的... 再次感谢! - peter bence
1
我并不是说它不安全,只是有更好/更新的方法可以减少黑客攻击的可能性。相信NSA所说的,从维基百科的文章来看是准确的。算法的强度取决于黑客解密所需的时间以及用于破解算法的机器的速度。因此,使用更长的密钥、更快的机器和消除已知威胁都会改变黑客破解所需的时间。 - jdweng
显示剩余5条评论
2个回答

2
“BC”指的是Bouncy Castle密码库。这段文字在讨论Bouncy Castle是否提供类似于“ElGamalEngine”和“RSAEngine”这样易于使用的EC引擎。回答是没有,因为这些引擎不存在。理论上,您可以使用“ElGamal encryption with ECC”,但它有严重的输入限制(需要点而不是普通明文),因此几乎没有用处。此外,直接使用它会导致不安全的方案。这与Bouncy Castle无关。如果您不是密码学家/数学家,那么您不能直接使用通过上述函数生成的ECKeyParameters来实现安全的EC加密/解密过程。您应该使用ECIES。

1
请随意浏览有关EC加密/ElGamal的cryptography site网站,如果那里没有更具体的问题,请随时提问。 - Maarten Bodewes
感谢您的关注,但是您的回答让我失望了。我真的需要实现一个EC引擎,使用ECIES对我来说不好,因为它在内部使用对称密码... 另外,使用ElGamalEngine进行加密的方式,可能不安全... 您能否至少将我重定向到一个好的起点(网站、git存储库、书籍...)开始吗? - peter bence
1
我认为我刚刚已经做到了,也可以随意在聊天室里交流。这是一个编程网站,直接在此处发布实现可能不是最好的选择 - 正如您已经注意到的那样,直接使用ElGamal可能不安全,而安全版本也不适合大多数用例。 - Maarten Bodewes

2
经过一些研究,我发现BouncyCastle有自己的SM2Engine实现了SM2数字签名算法并使用ECKeyParameters(椭圆曲线密钥参数)提供加密/解密能力。 编辑:请注意,SM2尚未被完全确认为安全,至今在英语密码学文献中,除了一些侧信道攻击外,我找不到更多关于SM2签名方案的分析。因此,请自行承担使用责任。
        SM2Engine sm2Engine  = new SM2Engine();
        sm2Engine.init(true, new ParametersWithRandom((ECKeyParameters) publicKey, new SecureRandom()));
        byte[] enc1 = sm2Engine.processBlock(plainText, 0, plainText.length);
        System.out.println("Cipher Text (SM2Engine): " + Hex.toHexString(enc1));
        
        sm2Engine  = new SM2Engine();
        sm2Engine.init(false, (ECKeyParameters) privateKey);
        byte[] dec1 = sm2Engine.processBlock(enc1, 0, enc1.length);
        System.out.println("Plain Text (SM2Engine): " + Hex.toHexString(dec1));

1
你是如何确定使用中国签名算法进行加密是安全的?如果你已经确定了这个事实,能否在回答中指出?如果没有充分的理由,你可能会引导其他人使用不安全的算法。 - Maarten Bodewes
@Maarten-reinstateMonica,SM2在中国似乎被广泛使用,虽然这并不能保证它是安全的,但许多中国密码学家的使用使我感到舒适。无论如何,感谢您的提醒,我将编辑我的答案以提及此事。 - peter bence
嗯,是的,但你在问题中提到了加密/解密,对吧?你如何确定一个签名算法是否安全,无论是中文还是其他语言? - Maarten Bodewes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接