损坏的数据 AES C#
corrupted data AES C#
请注意,我知道这是重复的,但答案对我没有帮助。
所以我试图建立一个 AES 和 RSA 加密连接,这样我就可以加密非常大的东西,但是在用 AES 解密一些东西时,我在数据的开头遇到了垃圾,这是我的代码 (是的,我尝试对 IV 进行硬编码):
RSA rsa = RSA.Create();
rsa.KeySize = 1024;
Aes aes = Aes.Create();
aes.IV = Encoding.UTF8.GetBytes("1234567890123456");
byte[] sendBytes = null;
byte[] buffer = new byte[1024];
TcpClient client = new TcpClient();
client.Connect(new IPEndPoint(IPAddress.Loopback, 900));
NetworkStream ns = client.GetStream();
ns.Write(Encoding.UTF8.GetBytes(rsa.ToXmlString(false) + "$"), 0, (rsa.ToXmlString(false) + "$").Length);
ns.Read(buffer, 0, buffer.Length);
MessageBox.Show(Encoding.UTF8.GetString(buffer));
rsa.FromXmlString(Encoding.UTF8.GetString(buffer).Split('$')[0]);
ns.Write(Encoding.UTF8.GetBytes(Convert.ToBase64String(rsa.Encrypt(aes.Key, RSAEncryptionPadding.Pkcs1)) + "$"), 0, (Convert.ToBase64String(rsa.Encrypt(aes.Key, RSAEncryptionPadding.Pkcs1)) + "$").Length);
MessageBox.Show(Convert.ToBase64String(rsa.Encrypt(aes.Key, RSAEncryptionPadding.Pkcs1)));
ICryptoTransform encrypt = aes.CreateEncryptor();
sendBytes = Encoding.UTF8.GetBytes("*" + Convert.ToBase64String(encrypt.TransformFinalBlock(Encoding.UTF8.GetBytes(authResult.AccessToken), 0, authResult.AccessToken.Length)) + "|" + Convert.ToBase64String(aes.IV) + "$");
ns.Write(sendBytes, 0, ("*" + Convert.ToBase64String(encrypt.TransformFinalBlock(Encoding.UTF8.GetBytes(authResult.AccessToken), 0, authResult.AccessToken.Length)) + "|" + Convert.ToBase64String(aes.IV) + "$").Length);
sendBytes = Encoding.UTF8.GetBytes(Convert.ToBase64String(encrypt.TransformFinalBlock(Encoding.UTF8.GetBytes(authResult.Account.Username), 0, authResult.Account.Username.Length)) + "$");
ns.Write(sendBytes, 0, (Convert.ToBase64String(encrypt.TransformFinalBlock(Encoding.UTF8.GetBytes(authResult.Account.Username), 0, authResult.Account.Username.Length)) + "$").Length);
ns.Dispose();
client.Close();
这是服务器:
NetworkStream networkStream = clientSocket.GetStream();
networkStream.Read(bytesFrom);
string dataFromClient = Encoding.UTF8.GetString(bytesFrom).Split("$")[0];
networkStream.Write(Encoding.UTF8.GetBytes(rsa.ToXmlString(false) + "$"));
rsa.FromXmlString(dataFromClient.Split("$")[0]);
int waste;
rsa.ImportRSAPrivateKey(key, out waste);
Console.WriteLine(rsa.KeySize.ToString());
networkStream.Read(bytesFrom);
Console.WriteLine(Encoding.UTF8.GetString(bytesFrom));
aes.Key = rsa.Decrypt(Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("$")[0]), RSAEncryptionPadding.Pkcs1);
ICryptoTransform decrypt = aes.CreateDecryptor();
networkStream.Read(bytesFrom);
aes.IV = Encoding.UTF8.GetBytes("1234567890123456");
dataFromClient = Encoding.UTF8.GetString(decrypt.TransformFinalBlock(Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("|")[0].Split("*")[1]), 0, Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("|")[0].Split("*")[1]).Length));
Console.WriteLine(Encoding.UTF8.GetString(decrypt.TransformFinalBlock(Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("|")[0].Split("*")[1]), 0, Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("|")[0].Split("*")[1]).Length)));
string info = await GetHttpContentWithToken("https://graph.microsoft.com/v1.0/me", dataFromClient);
Console.WriteLine(info);
Root a = JsonConvert.DeserializeObject<Root>(info);
networkStream.Read(bytesFrom);
dataFromClient = Encoding.UTF8.GetString(decrypt.TransformFinalBlock(Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("$")[0]), 0, Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("$")[0]).Length));
(是的,我正在弄乱 Microsoft 帐户,除了密钥交换和 AES 解密代码之外,您可以忽略所有内容。)
仔细一看,我发现我在 IV 之前创建了解密器,哈哈。
请注意,我知道这是重复的,但答案对我没有帮助。
所以我试图建立一个 AES 和 RSA 加密连接,这样我就可以加密非常大的东西,但是在用 AES 解密一些东西时,我在数据的开头遇到了垃圾,这是我的代码 (是的,我尝试对 IV 进行硬编码):
RSA rsa = RSA.Create();
rsa.KeySize = 1024;
Aes aes = Aes.Create();
aes.IV = Encoding.UTF8.GetBytes("1234567890123456");
byte[] sendBytes = null;
byte[] buffer = new byte[1024];
TcpClient client = new TcpClient();
client.Connect(new IPEndPoint(IPAddress.Loopback, 900));
NetworkStream ns = client.GetStream();
ns.Write(Encoding.UTF8.GetBytes(rsa.ToXmlString(false) + "$"), 0, (rsa.ToXmlString(false) + "$").Length);
ns.Read(buffer, 0, buffer.Length);
MessageBox.Show(Encoding.UTF8.GetString(buffer));
rsa.FromXmlString(Encoding.UTF8.GetString(buffer).Split('$')[0]);
ns.Write(Encoding.UTF8.GetBytes(Convert.ToBase64String(rsa.Encrypt(aes.Key, RSAEncryptionPadding.Pkcs1)) + "$"), 0, (Convert.ToBase64String(rsa.Encrypt(aes.Key, RSAEncryptionPadding.Pkcs1)) + "$").Length);
MessageBox.Show(Convert.ToBase64String(rsa.Encrypt(aes.Key, RSAEncryptionPadding.Pkcs1)));
ICryptoTransform encrypt = aes.CreateEncryptor();
sendBytes = Encoding.UTF8.GetBytes("*" + Convert.ToBase64String(encrypt.TransformFinalBlock(Encoding.UTF8.GetBytes(authResult.AccessToken), 0, authResult.AccessToken.Length)) + "|" + Convert.ToBase64String(aes.IV) + "$");
ns.Write(sendBytes, 0, ("*" + Convert.ToBase64String(encrypt.TransformFinalBlock(Encoding.UTF8.GetBytes(authResult.AccessToken), 0, authResult.AccessToken.Length)) + "|" + Convert.ToBase64String(aes.IV) + "$").Length);
sendBytes = Encoding.UTF8.GetBytes(Convert.ToBase64String(encrypt.TransformFinalBlock(Encoding.UTF8.GetBytes(authResult.Account.Username), 0, authResult.Account.Username.Length)) + "$");
ns.Write(sendBytes, 0, (Convert.ToBase64String(encrypt.TransformFinalBlock(Encoding.UTF8.GetBytes(authResult.Account.Username), 0, authResult.Account.Username.Length)) + "$").Length);
ns.Dispose();
client.Close();
这是服务器:
NetworkStream networkStream = clientSocket.GetStream();
networkStream.Read(bytesFrom);
string dataFromClient = Encoding.UTF8.GetString(bytesFrom).Split("$")[0];
networkStream.Write(Encoding.UTF8.GetBytes(rsa.ToXmlString(false) + "$"));
rsa.FromXmlString(dataFromClient.Split("$")[0]);
int waste;
rsa.ImportRSAPrivateKey(key, out waste);
Console.WriteLine(rsa.KeySize.ToString());
networkStream.Read(bytesFrom);
Console.WriteLine(Encoding.UTF8.GetString(bytesFrom));
aes.Key = rsa.Decrypt(Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("$")[0]), RSAEncryptionPadding.Pkcs1);
ICryptoTransform decrypt = aes.CreateDecryptor();
networkStream.Read(bytesFrom);
aes.IV = Encoding.UTF8.GetBytes("1234567890123456");
dataFromClient = Encoding.UTF8.GetString(decrypt.TransformFinalBlock(Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("|")[0].Split("*")[1]), 0, Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("|")[0].Split("*")[1]).Length));
Console.WriteLine(Encoding.UTF8.GetString(decrypt.TransformFinalBlock(Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("|")[0].Split("*")[1]), 0, Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("|")[0].Split("*")[1]).Length)));
string info = await GetHttpContentWithToken("https://graph.microsoft.com/v1.0/me", dataFromClient);
Console.WriteLine(info);
Root a = JsonConvert.DeserializeObject<Root>(info);
networkStream.Read(bytesFrom);
dataFromClient = Encoding.UTF8.GetString(decrypt.TransformFinalBlock(Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("$")[0]), 0, Convert.FromBase64String(Encoding.UTF8.GetString(bytesFrom).Split("$")[0]).Length));
(是的,我正在弄乱 Microsoft 帐户,除了密钥交换和 AES 解密代码之外,您可以忽略所有内容。)
仔细一看,我发现我在 IV 之前创建了解密器,哈哈。