private MenuStrip menuStrip;
private ToolStripMenuItem drawToolStripMenuItem;
private ToolStripMenuItem colorToolStripMenuItem;
private ToolStripMenuItem lineTypeToolStripMenuItem;
private ToolStripMenuItem encryptionToolStripMenuItem;
private ToolStripMenuItem decryptionToolStripMenuItem;
private Color currentColor = Color.Black;
private int currentLineType = 1;
public drawingEncryption()
{
InitializeComponent();
bitmap = new Bitmap(ClientSize.Width, ClientSize.Height);
graphics = Graphics.FromImage(bitmap);
graphics.Clear(Color.White);
}
private void InitializeComponent()
{
menuStrip = new MenuStrip();
drawToolStripMenuItem = new ToolStripMenuItem("绘图");
colorToolStripMenuItem = new ToolStripMenuItem("颜色");
lineTypeToolStripMenuItem = new ToolStripMenuItem("线条类型");
encryptionToolStripMenuItem = new ToolStripMenuItem("加密");
decryptionToolStripMenuItem = new ToolStripMenuItem("解密");
menuStrip.Items.Add(drawToolStripMenuItem);
menuStrip.Items.Add(colorToolStripMenuItem);
menuStrip.Items.Add(lineTypeToolStripMenuItem);
menuStrip.Items.Add(encryptionToolStripMenuItem);
menuStrip.Items.Add(decryptionToolStripMenuItem);
colorToolStripMenuItem.DropDownItems.Add(new ToolStripMenuItem("黑色", null, ColorBlack_Click));
colorToolStripMenuItem.DropDownItems.Add(new ToolStripMenuItem("红色", null, ColorRed_Click));
colorToolStripMenuItem.DropDownItems.Add(new ToolStripMenuItem("蓝色", null, ColorBlue_Click));
lineTypeToolStripMenuItem.DropDownItems.Add(new ToolStripMenuItem("实线", null, LineTypeSolid_Click));
lineTypeToolStripMenuItem.DropDownItems.Add(new ToolStripMenuItem("虚线", null, LineTypeDashed_Click));
encryptionToolStripMenuItem.Click += EncryptionToolStripMenuItem_Click;
decryptionToolStripMenuItem.Click += DecryptionToolStripMenuItem_Click;
this.Controls.Add(menuStrip);
this.Paint += new PaintEventHandler(Form1_Paint);
this.MouseDown += new MouseEventHandler(Form1_MouseDown);
this.MouseMove += new MouseEventHandler(Form1_MouseMove);
this.MouseUp += new MouseEventHandler(Form1_MouseUp);
}
private void ColorBlack_Click(object sender, EventArgs e)
{
currentColor = Color.Black;
}
private void ColorRed_Click(object sender, EventArgs e)
{
currentColor = Color.Red;
}
private void ColorBlue_Click(object sender, EventArgs e)
{
currentColor = Color.Blue;
}
private void LineTypeSolid_Click(object sender, EventArgs e)
{
currentLineType = 1;
}
private void LineTypeDashed_Click(object sender, EventArgs e)
{
currentLineType = 2;
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
lastPoint = e.Location;
isDrawing = true;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (isDrawing)
{
using (Pen pen = new Pen(currentColor, 2))
{
pen.DashStyle = (DashStyle)currentLineType;
graphics.DrawLine(pen, lastPoint, e.Location);
lastPoint = e.Location;
Invalidate();
}
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
isDrawing = false;
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage(bitmap, 0, 0);
}
private void EncryptionToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "加密文件 (*.enc)|*.enc";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
// 生成对称密钥和 IV
Aes aes = Aes.Create();
byte[] key = aes.Key;
byte[] iv = aes.IV;
// 加密绘图数据
byte[] encryptedData = EncryptDrawingData(bitmap, key, iv);
// 生成非对称密钥对
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] publicKey = rsa.ExportRSAPublicKey();
byte[] privateKey = rsa.ExportRSAPrivateKey();
// 加密对称密钥和 IV
byte[] encryptedKeyIV = rsa.Encrypt(key.Concat(iv).ToArray(), false);
// 将加密的信息写入文件
using (FileStream fileStream = new FileStream(saveFileDialog.FileName, FileMode.Create))
{
fileStream.Write(encryptedData, 0, encryptedData.Length);
fileStream.Write(encryptedKeyIV, 0, encryptedKeyIV.Length);
fileStream.Write(publicKey, 0, publicKey.Length);
}
}
catch (Exception ex)
{
MessageBox.Show("加密出错: " + ex.Message);
}
}
}
private void DecryptionToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "加密文件 (*.enc)|*.enc";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
// 读取文件数据
byte[] fileData = File.ReadAllBytes(openFileDialog.FileName);
// 分离出加密的绘图数据、加密的对称密钥和 IV、公钥
byte[] encryptedDrawingData = new byte[fileData.Length - (256 + 16)];
byte[] encryptedKeyIV = new byte[256];
byte[] publicKey = new byte[128];
Array.Copy(fileData, 0, encryptedDrawingData, 0, encryptedDrawingData.Length);
Array.Copy(fileData, encryptedDrawingData.Length, encryptedKeyIV, 0, encryptedKeyIV.Length);
Array.Copy(fileData, encryptedDrawingData.Length + encryptedKeyIV.Length, publicKey, 0, publicKey.Length);
// 使用私钥解密对称密钥和 IV
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportRSAPrivateKey(privateKey);
byte[] decryptedKeyIV = rsa.Decrypt(encryptedKeyIV, false);
// 提取出对称密钥和 IV
byte[] decryptedKey = decryptedKeyIV.Take(128).ToArray();
byte[] decryptedIV = decryptedKeyIV.Skip(128).ToArray();
// 解密绘图数据
byte[] decryptedDrawingData = DecryptDrawingData(encryptedDrawingData, decryptedKey, decryptedIV);
// 重新绘制图像
bitmap = new Bitmap(ClientSize.Width, ClientSize.Height);
graphics = Graphics.FromImage(bitmap);
graphics.Clear(Color.White);
using (MemoryStream memoryStream = new MemoryStream(decryptedDrawingData))
{
Image image = Image.FromStream(memoryStream);
graphics.DrawImage(image, 0, 0);
}
Invalidate();
}
catch (Exception ex)
{
MessageBox.Show("解密出错: " + ex.Message);
}
}
}
private byte[] EncryptDrawingData(Bitmap bitmap, byte[] key, byte[] iv)
{
using (MemoryStream memoryStream = new MemoryStream())
{
bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] drawingData = memoryStream.ToArray();
Aes aes = Aes.Create();
aes.Key = key;
aes.IV = iv;
using (ICryptoTransform encryptor = aes.CreateEncryptor())
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
{
cryptoStream.Write(drawingData, 0, drawingData.Length);
}
return memoryStream.ToArray();
}
}
private byte[] DecryptDrawingData(byte[] encryptedData, byte[] key, byte[] iv)
{
Aes aes = Aes.Create();
aes.Key = key;
aes.IV = iv;
using (ICryptoTransform decryptor = aes.CreateDecryptor())
using (MemoryStream memoryStream = new MemoryStream(encryptedData))
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
{
byte[] dec

怎么修改代码才能实现题目的要求?