using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;
namespace GUISimpleTCPClient
{
public partial class GUISimpleTCPClient : Form
{
TcpClient client=null;
NetworkStream stream;
StreamReader reader;
StreamWriter writer;
public GUISimpleTCPClient()
{
InitializeComponent();
}
private void Connect_Click(object sender, EventArgs e)
{
try
{
client=new TcpClient(ipAddress.Text,Convert.ToInt32(port.Text));
listBox1.Items.Add("Connected to Server");
stream = client.GetStream();
reader = new StreamReader(stream);
writer = new StreamWriter(stream);
string msg = reader.ReadLine();
listBox1.Items.Add("Recieved form server:");
listBox1.Items.Add(msg);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void send_Click(object sender, EventArgs e)
{
string msg = M.Text;
SymmetricAlgorithm symmetricAlgorithm = SymmetricAlgorithm.Create();
byte[] data = Encoding.UTF8.GetBytes("password");
symmetricAlgorithm.Key = GetLegalKey("PASSWORD");
symmetricAlgorithm.IV = GetLegalIV();
byte[] cipher = Encrypt(symmetricAlgorithm, data);
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
msg = enc.GetString(cipher);
// System.Text.Encoding encoding=new System.Text.Encoding() ;
System.Text.ASCIIEncoding denc = new System.Text.ASCIIEncoding();
Byte[] dec_data = denc.GetBytes(msg);
string decode = Decrypt(symmetricAlgorithm, dec_data);
try
{
writer.WriteLine(msg);
writer.Flush();
msg = reader.ReadLine();
if (msg.Length!=0)
listBox1.Items.Add(decode);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private static byte[] Encrypt(SymmetricAlgorithm symmetricAlgorithm,
byte[] data)
{
// FileStream outStream = File.OpenWrite(outPath);
ICryptoTransform transform = symmetricAlgorithm.CreateEncryptor();
MemoryStream t = new MemoryStream();
CryptoStream cryptoStream =
new CryptoStream(t, transform, CryptoStreamMode.Write);
Byte[] inFile = data;
// File.ReadAllBytes(inPath);
cryptoStream.Write(data, 0, data.Length);
cryptoStream.FlushFinalBlock();
cryptoStream.Close();
return t.ToArray();
}
private static string Decrypt(SymmetricAlgorithm symmetricAlgorithm,
byte[] cipher)
{
ICryptoTransform transform = symmetricAlgorithm.CreateDecryptor();
// Stream inStream = File.OpenRead(inPath);
MemoryStream inStream = new MemoryStream();
CryptoStream cryptoStream =
new CryptoStream(inStream, transform, CryptoStreamMode.Write);
Byte[] buffer = new Byte[100];
cryptoStream.Write(cipher, 0, cipher.Length);
cryptoStream.FlushFinalBlock();
//Console.WriteLine();
return Encoding.UTF8.GetString(inStream.ToArray());
// int length = cryptoStream.Read(buffer, 0, buffer.Length);
// Stream outStream = File.OpenWrite(outPath);
/* while (length > 0)
{
outStream.Write(buffer, 0, length);
length = cryptoStream.Read(buffer, 0, buffer.Length);
}*/
//inStream.Close();
// outStream.Close();
}
private byte[] GetLegalKey(string Key)
{
SymmetricAlgorithm symmetricAlgorithm = SymmetricAlgorithm.Create();
string sTemp = Key;
symmetricAlgorithm.GenerateKey();
byte[] bytTemp = symmetricAlgorithm.Key;
int KeyLength = bytTemp.Length;
if (sTemp.Length > KeyLength)
sTemp = sTemp.Substring(0, KeyLength);
else if (sTemp.Length < KeyLength)
sTemp = sTemp.PadRight(KeyLength, ' ');
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
private byte[] GetLegalIV()
{
string initialIV = "12345678";
SymmetricAlgorithm symmetricAlgorithm = SymmetricAlgorithm.Create();
// The initial string of IV may be modified with any data you like
string sTemp = initialIV;
symmetricAlgorithm.GenerateIV();
byte[] bytTemp = symmetricAlgorithm.IV;
int IVLength = bytTemp.Length;
if (sTemp.Length > IVLength)
sTemp = sTemp.Substring(0, IVLength);
else if (sTemp.Length < IVLength)
sTemp = sTemp.PadRight(IVLength, ' ');
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
}
}
-4
A
回答
6
這就是問題所在:
byte[] cipher = Encrypt(symmetricAlgorithm, data);
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
msg = enc.GetString(cipher);
永遠,永遠做到這一點。
加密的數據是而不是一個ASCII編碼的字符串,所以不要這樣對待它。改用base64。所以這個片段應該是:
byte[] cipher = Encrypt(symmetricAlgorithm, data);
msg = Convert.ToBase64String(cipher);
和反向應該是:
byte[] dec_data = Convert.FromBase64String(msg);
你永遠不應該對待不透明的二進制數據,就好像它是真的編碼的文本。這就像試圖加載MP3文件,就好像它是JPG一樣。這不是 - 你會失去數據。
+0
我這樣做,但現在有一個新問題: 解密數據的長度是無效的。 – Nik 2011-05-19 11:16:49
+0
@Nahel:嗯,我建議你通過嘗試立即解密字節數組* *來檢查你的加密/解密代碼有什麼問題,而不執行*任何*種類的轉換。 – 2011-05-19 11:56:22
相關問題
- 1. 解密期間「填充無效且無法刪除」
- 2. 填充無效且無法刪除解密值
- 3. CryptoStream錯誤填充無效,無法刪除
- 4. AESManaged加密/解密 - 填充是無效的不能刪除
- 5. 填充無效且無法移除
- 6. 「填充無效,無法刪除」使用AesManaged
- 7. PubNub投擲「CryptographicException:填充無效,無法刪除」
- 8. 「填充無效,無法刪除。」扭曲的錯誤
- 9. 解密流時填充無效
- 10. RijndaelManaged「填充無效且無法刪除」僅在生產中解密時纔會發生
- 11. CryptoStream關閉時出現「填充無效且無法刪除」的衝突
- 12. StreamTransformationFilter:在AES解密中找到無效的PKCS#7塊填充
- 13. ProtectedData.Unprotect方法無法解密
- 14. WordPress的刪除方法無效
- 15. 我無法得到我的RichFaces pickList填充的右側
- 16. 奇怪的填充菜單無序列表 - 無法刪除
- 17. 無法解析FragmentTransaction.add()方法。爲什麼我得到這個錯誤?
- 18. ListView無法填充
- 19. 無法填充ViewModel
- 20. 無法填充ArrayList
- 21. 方法可能無法在例外
- 22. 加密捕獲到異常:填充是無效的不能刪除
- 23. 在android中使用AsyncImageView有一個奇怪的填充我無法刪除
- 24. Firebase.Database.Query無法解析方法'on(?,?)'
- 25. 錯誤:「填充無效且無法移除」使用非對稱算法
- 26. 無法刪除「Info.plist」無法刪除
- 27. 無法解密
- 28. @ModelAttribute註解無法填充豆可變
- 29. Python「值錯誤:無法刪除數組元素」 - 爲什麼我得到這個?
- 30. jQuery on()無法刪除元素
你能縮短這段代碼嗎? – Stecya 2011-05-19 10:37:56
這與您以前的已解決問題沒有什麼不同。如果你有問題要問,請問問題;不要只發布大量的代碼。 http://stackoverflow.com/questions/6052593/padding-is-invalid-and-cannot-be-removed-on-cryptostream-flushfinalblock – LukeH 2011-05-19 10:40:24