通过套接字发送公钥的安全方法

Dag*_*gob 6 cryptography rsa crypto++

通过套接字将 RSA::PublicKey 发送给另一个用户的安全方法是什么?我想将密钥导出到 ByteQueue 并将字节数组发送给用户,在那里他可以再次构造公钥。

或者这是否会泄漏可能被滥用的信息?

//Generate keys
AutoSeededRandomPool rng;

InvertibleRSAFunction params;
params.GenerateRandomWithKeySize(rng, 3072);

//Create
RSA::PublicKey publicKey(params);

//Save
ByteQueue queue;
publicKey.Save(queue);

byte publicKeyBuffer[1000];
size_t size = queue.Get((byte*)&publicKeyBuffer, sizeof(publicKeyBuffer));

//Load
RSA::PublicKey loadkey;
ByteQueue queue2;
queue2.Put2((byte *)&publicKeyBuffer, size, 0, true);

loadkey.Load(queue2);
Run Code Online (Sandbox Code Playgroud)

jww*_*jww 5

通过套接字将 RSA::PublicKey 发送给另一个用户的安全方法是什么?

是的,如果不考虑隐私,您可以发送纯文本。接收它的人需要验证公钥,这意味着他们需要确保它是您的真实密钥,而不是冒名顶替者的密钥。

验证公钥是密钥分发问题,也是密码学中的一个棘手难题。如果可以解决密钥分发问题,那么很多隐私问题就会迎刃而解。

有两种方法可以尝试解决密钥分发问题:信任根和信任网络。信任根用于具有公共和私有 CA 的 PKI;而信任网络被 PGP 和朋友使用。

使用 PKI 和公共 CA 在 Internet 上以不同程度的成功“解决”了密钥分发。例如,请参阅 RFC 5280、Internet X.509 Public Key Infrastructure Certificate 和 Certificate Revocation List (CRL) Profile,了解其应该如何工作;并查看 Peter Gutmann 的Engineering Security,了解它在实践中是如何失败的(有时以惊人的方式)。

对于不使用“信任根”或 PKI 的对等应用程序,最新趋势是 (1) 使用带有初始消息的短身份验证字符串 (SAS),以及 (2) 将所有后续会话与过去的会话联系起来(基本上从第一个会话形成一个链)。在初始消息期间,接收者使用语音通过读回像公钥指纹这样的小摘要(语音是一种很好的身份验证机制)来验证来自发送者的公钥密钥。

如果您的点对点应用程序无法使用 SAS 来验证公钥,那么您应该采用 Trust-On-First-Use (TOFU) 策略并练习密钥连续性。Gutmann 在他的《工程安全》一书中详细介绍了安全多样化策略。


将密钥导出到 ByteQueue 并发送字节数组

这只是一个演示级别的细节。您可以按照自己喜欢的任何方式对其进行编码,包括原始、十六进制、Base32 或 Base64。真正的威胁是确保您的对等方收到您发送的公钥(如ntoskrnl 所指出的)。


另请注意,隐私可能是一个问题,就像在受压迫国家中持不同政见者一样。持不同政见者和压迫性政权并不是唯一的用例,它也可能是认证和认可 (C&A) 的一个问题。

我曾经在美国联邦审计失败,因为我泄露了一个电子邮件地址。在这种情况下,电子邮件地址与密钥一起位于用户证书中。(证书所做的只是通过“权威”签名将公钥绑定到身份)。