加密技术,源自希腊语“kryptos”,意味着“隐藏”。在计算机领域,加密技术确保了授权用户之间的安全通信。最初,它被军队用于交换机密信息,古代的国王们也使用它来发送秘密信息。现代加密技术旨在实现以下目标:
加密技术主要分为三种类型:
接下来,将通过一个例子来理解对称加密,即如何使用128位密钥将图像编码为密文,然后发送给另一个用户,再使用相同的密钥进行解码。
首先,使用任意字符、数字或符号生成一个密钥,验证其为128位,并将其转换为二进制。
if (keyBoxTxt.Text.Length == 16)
{
keyBinTxt.Text = StringToBinary(keyBoxTxt.Text);
uploadImg.Enabled = true;
}
else
MessageBox.Show("Key size is not appropriate, Please enter 16 characters!");
长度为16意味着16个字符或符号,每个8位,总共128位。这里,使用了一个名为StringToBinary的函数,它将字符串转换为二进制。
public static string StringToBinary(string data)
{
StringBuilder sb = new StringBuilder();
foreach (char c in data.ToCharArray())
{
sb.Append(Convert.ToString(c, 2).PadLeft(8, '0'));
}
return sb.ToString();
}
现在,使用浏览按钮打开图像:
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp";
if (open.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = new Bitmap(open.FileName);
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
imgpath = open.FileName;
encryptBtn.Enabled = true;
}
读取图像文件对话框中的图像,并在图片框中显示。现在,真正的工作开始了,开始使用TripleDESCryptoServiceProvider函数:
byte[] bytimg = (Byte[])new ImageConverter().ConvertTo(pictureBox1.Image, typeof(Byte[]));
beforeEnc();
TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
tripleDES.KeySize = 128;
tripleDES.Key = UTF8Encoding.UTF8.GetBytes(keyBoxTxt.Text);
tripleDES.Mode = CipherMode.ECB;
tripleDES.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tripleDES.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(bytimg, 0, bytimg.Length);
tripleDES.Clear();
afterEncTxt.Text = Convert.ToBase64String(resultArray, 0, resultArray.Length);
首先,使用ImageConverter将图像转换为字节,然后使用自定义函数beforeEnc将字节转换为二进制字符串,并显示在多行文本框中。
现在,创建了一个名为tripleDES的TripleDESCryptoServiceProvider函数的包装对象。然后,正如定义的,密钥大小应该是128位,所以也设置给tripleDES。在将密钥转换为字节后,选择了电子密码本(ECB)的密码算法。
电子密码本(ECB)是一种创建块密码的操作模式,意味着字节或位将使用块密码进行加密。密码是使用任何算法加密的明文。有两种类型的密码:
ECB是一种块密码算法,它将重复的明文转换为相同的重复密码文本。这意味着如果“a”表示0011,那么每次“a”出现时,它都会被编码为0011。因此,它不适合小块大小,这就是为什么使用128位块的原因。
公钥加密标准(PKCS) #7是RSA数据安全公司制定的公钥加密的标准格式。它涉及数字签名和证书。PKCS #7使用证书的公钥加密消息,并且只能使用该证书的私钥解密。PKCS #7的一些扩展功能包括:
然后,ICryptoTransform定义了基本的加密操作,并将加密的消息转换为字节数组,并分配给一个文本框,以便比较加密前后的消息。
现在加密完成了!轮到解密消息了。由于密钥和加密消息一起发送,所以这里是代码:
byte[] inputArray = Convert.FromBase64String(afterEncTxt.Text);
TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
tripleDES.KeySize = 128;
tripleDES.Key = UTF8Encoding.UTF8.GetBytes(binKeyTxt.Text);
tripleDES.Mode = CipherMode.ECB;
tripleDES.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tripleDES.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);
tripleDES.Clear();
using (var ms = new MemoryStream(resultArray))
{
pictureBox1.Image = Image.FromStream(ms);
}