序列化公钥以通过网络发送

时间:2015-09-17 14:55:37

标签: c++ encryption type-conversion client-server crypto++

我有一些客户端/服务器应用程序。它的工作正确。我想在其中添加加密技术。我找到了Crypto ++库,并使用它做了一些简单的项目:用于DES编码和用于RSA编码。它包含两个类:EncoderDesEncoderRSA

class EncoderDES
{
    public:
        EncoderDES();
        std::string encode(std::string plainText);
        std::string decode(std::string cypher);
        std::string toReadable(std::string cypher);
        void doIt();
    private:
        AutoSeededRandomPool prng;
        SecByteBlock key;
        byte iv[];
};

class EncoderRSA
{
    public:
        EncoderRSA();
        void keyGeneration();
        void substitutePublicKey(Integer e, Integer n);
        Integer encode(std::string plainText);
        std::string decode(Integer cypher);
    private:
        AutoSeededRandomPool prng;
        RSA::PublicKey publicKey;
        RSA::PrivateKey privateKey;
};

我认为,Server必须生成DES密钥,并通过RSA将其传递给每个客户端。在这一步中,我有一些问题:  1.如何发送(和如何接收)RSA :: PublicKey?  2.如何发送(以及如何接收)SecByteBlock?

(我无法发送给他们,因为我无法:  1.将RSA :: PublicKey转换为char *  2.将char *转换为RSA :: PublicKey  3.将SecByteBlock转换为字符串。)

我只能将字符串转换为SecByteBlock:

SecByteBlock stringToKey(string decodedKey) {
    SecByteBlock receivedKey(decodedKey.data(), decodedKey.size());
    return receivedKey;
}

但不确定它是否正确。

如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

  

我有一些客户端/服务器应用程序......

在你走到兔子洞的地方太远之前,废弃现有的大部分设计。

要加密客户端和服务器之间的通信,请使用Integrated Encryption Scheme。 Crypto ++有两个。第一个是Elliptic Curve Integrated Encryption Scheme,它在椭圆曲线的场上运行。第二个是 Discrete Logarithm Integrated Encryption Scheme,它在整数字段上运行。

这两种方案都是最先进的,它们将密文(和解密)与另一方的公钥联系起来。纯文本已加密,密文为MAC,因此它提供confidentiality and authenticity。它们还确保您重用安全上下文。集成加密方案是一些最安全的方案,因为它们是IND-CCA2(它是一个非常强大的安全概念)。

您仍需要解决之前问题中的key distribution problem。但是一旦你有了公钥,系统就会起作用。我只能说“大多数”,因为我不知道你在做什么来防止网络级别的插入和重放。

  

我无法发送它们,因为我不能:1。将RSA :: PublicKey转换为char * 2.将char *转换为RSA :: PublicKey 3.将SecByteBlock转换为字符串。

您应该访问Crypto ++ wiki上的Keys and Formats。它向您展示了如何序列化它们。另请参阅Stack Overflow上的Safe way to sending a public key over a socket

快速推动正确的方向:使用SaveLoad;并且使用DEREncodeBERDecodeSaveLoad对主题公钥信息进行操作,除了密钥外,还包括算法标识符。这通常会对您有所帮助,因为密钥类型是公钥的一部分。