我有一些客户端/服务器应用程序。它的工作正确。我想在其中添加加密技术。我找到了Crypto ++库,并使用它做了一些简单的项目:用于DES编码和用于RSA编码。它包含两个类:EncoderDes
和EncoderRSA
:
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;
}
但不确定它是否正确。
如何解决这个问题?
答案 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。
快速推动正确的方向:使用Save
和Load
;并且不使用DEREncode
或BERDecode
。 Save
和Load
对主题公钥信息进行操作,除了密钥外,还包括算法标识符。这通常会对您有所帮助,因为密钥类型是公钥的一部分。