【发布时间】:2014-11-29 08:47:35
【问题描述】:
所以,我正在使用 TcpClient 和 TcpListener 类创建一个简单的“网络聊天”。我希望发送的所有数据都被加密,并且我正在使用 AES 加密。所以首先我必须确保来自服务器的 AES 密钥安全地发送到客户端。我正在尝试通过使用 RSA 加密 AES 密钥然后将其发送到客户端并在那里再次使用 RSA 解密它来实现这一点。
首先我在服务器上创建了一个 RSACryptoServiceProvider 并提取了公钥。我将公钥发送给客户端,并在那里创建了 RSACryptoServiceProvider 并导入了该密钥。当我调用 Decrpyt 方法时,我得到一个键不存在异常。这是我的代码:
服务器:
这是向客户端发送公钥。
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
string privateXml = rsa.ToXmlString(true);
string publicXml = rsa.ToXmlString(false);
Byte[] pubKey = Encoding.UTF8.GetBytes(publicXml);
clientStream.Write(pubKey, 0, pubKey.Length);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); // simetrično kriptiranje
byte[] aesKey = aes.Key;
byte[] encryptedRSA = rsa.Encrypt(aesKey, false);
clientStream.Write(encryptedRSA, 0, encryptedRSA.Length);
客户:
Byte[] serverPublicKey = new Byte[1024];
Int32 bytes1 = stream.Read(serverPublicKey, 0, serverPublicKey.Length);
string serverKey = Encoding.UTF8.GetString(serverPublicKey, 0, bytes1);
serverKey = serverKey.Replace("\0", "");
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(serverKey);
Byte[] bytes2 = new Byte[128];
String aesKey = null;
stream.Read(bytes2, 0, bytes2.Length);
byte[] decryptedKey = rsa.Decrypt(bytes2, false);
【问题讨论】:
-
与您的问题无关:如何将公钥发送给客户端?如果不是,我建议生成一个密钥对,将公钥嵌入到客户端代码中,将私钥嵌入到服务器代码(或配置)中。
标签: c# cryptography rsa rsacryptoserviceprovider aescryptoserviceprovider