TripleDES加密算法与图像字节转换

加密技术,源自希腊语“kryptos”,意味着“隐藏”。在计算机领域,加密技术确保了授权用户之间的安全通信。最初,它被军队用于交换机密信息,古代的国王们也使用它来发送秘密信息。现代加密技术旨在实现以下目标:

  • 保密性
  • 完整性
  • 认证性
  • 不可否认性
  • 可用性

加密技术主要分为三种类型:

  1. 对称加密:使用单一密钥/秘密密钥/私钥进行加密和解密。
  2. 非对称加密:使用公钥和私钥,一个用于加密,另一个用于解密,可以互换使用。
  3. 混合加密:结合了上述两种加密方式的优点,同时避免了它们的弱点。

接下来,将通过一个例子来理解对称加密,即如何使用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); }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485