首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

3DES解密时-指定键的大小对于此算法无效,该如何处理

2012-04-25 
3DES解密时---指定键的大小对于此算法无效C# codeusing Systemusing System.Collections.Genericusing S

3DES解密时---指定键的大小对于此算法无效

C# code
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Security.Cryptography;using System.IO;namespace DataEncrypt{    public partial class FormMain : Form    {        public FormMain()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {            string str = textBoxInput.Text;            if (str.Length == 0)            {                MessageBox.Show("请输入被加密的字符串");                return;            }            //加密            try            {                TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();                //随机生成密钥Key和初始化向量IV                tdes.GenerateKey();                tdes.GenerateIV();                byte[] encryptedBytes = EncryptText(str, tdes.Key, tdes.IV);                File.AppendAllText("C:\\MyData.txt", Encoding.UTF8.GetString(tdes.Key));                File.AppendAllText("C:\\MyData.txt", "\r\n");                File.AppendAllText("C:\\MyData.txt", Encoding.UTF8.GetString(tdes.IV));                File.AppendAllText("C:\\MyData.txt", "\r\n");                File.AppendAllText("C:\\MyData.txt", Encoding.UTF8.GetString(encryptedBytes));                             //   textBoxKey.Text = Encoding.UTF8.GetString(tdes.Key);                //得到加密后的字节流                                //显示加密后的字符串             //   textBoxInput.Text = Encoding.UTF8.GetString(encryptedBytes);                //解密              //  string decryptString = DecryptText(encryptedBytes, tdes.Key, tdes.IV);                //显示解密后的字符串              //  textBoxInput.Text = decryptString;            }            catch (Exception err)            {                MessageBox.Show(err.Message, "出错");            }        }        private byte[] EncryptText(string str, byte[] Key, byte[] IV)        {            //创建一个内存流            MemoryStream memoryStream = new MemoryStream();            //使用传递的私钥和IV创建加密流            CryptoStream cryptoStream = new CryptoStream(memoryStream,                new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),                CryptoStreamMode.Write);            //将传递的字符串转换为字节数组            byte[] toEncrypt = Encoding.UTF8.GetBytes(str);            try            {                //将字节数组写入加密流,并清除缓冲区                cryptoStream.Write(toEncrypt, 0, toEncrypt.Length);                cryptoStream.FlushFinalBlock();                //得到加密后的字节数组                byte[] encryptedBytes = memoryStream.ToArray();                return encryptedBytes;            }            catch (CryptographicException err)            {                throw new Exception("加密出错:" + err.Message);            }            finally            {                cryptoStream.Close();                memoryStream.Close();            }        }        private string DecryptText(byte[] dataBytes, byte[] Key, byte[] IV)        {            //根据加密后的字节数组创建一个内存流            MemoryStream memoryStream = new MemoryStream(dataBytes);            //使用传递的私钥、IV和内存流创建解密流            CryptoStream cryptoStream = new CryptoStream(memoryStream,                new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV),                CryptoStreamMode.Read);            //创建一个字节数组保存解密后的数据            byte[] decryptBytes = new byte[dataBytes.Length];            try            {                //从解密流中将解密后的数据读到字节数组中                cryptoStream.Read(decryptBytes, 0, decryptBytes.Length);                //得到解密后的字符串                string decryptedString = Encoding.UTF8.GetString(decryptBytes);                return decryptedString;            }            catch (CryptographicException err)            {                throw new Exception("解密出错:" + err.Message);            }            finally            {                cryptoStream.Close();                memoryStream.Close();            }        }        private void DecryptFromFile()        {                        if (File.Exists("C:\\MyData.txt"))            {              //  TripleDESCryptoServiceProvider tdes2 = new TripleDESCryptoServiceProvider();                StreamReader sr = new StreamReader("C:\\MyData.txt",Encoding.Default);                               byte[] Key = System.Text.Encoding.Default.GetBytes(sr.ReadLine());               byte[] IV = System.Text.Encoding.Default.GetBytes(sr.ReadLine());                byte[] encryptedBytes = System.Text.Encoding.Default.GetBytes(sr.ReadLine());                sr.Close();                               string decryptString = DecryptText(encryptedBytes, Key, IV);                textBoxInput.Text = decryptString;                            }                                }        private void button2_Click(object sender, EventArgs e)        {            DecryptFromFile();        }        private void FormMain_Load(object sender, EventArgs e)        {            DecryptFromFile();        }               }} 



[解决办法]
问题出在把key等二进制数据转换为字符串,以及转换字符串为数据的步骤上:
..., Encoding.UTF8.GetString(tdes.Key) //错误
byte[] Key = System.Text.Encoding.Default.GetBytes(sr.ReadLine()) //错误

原因是:
1、UTF8不能转换所有的二进制数据。
2、数据中万一有回车(\n),UTF8也会转换出一个回车,你存储的数据可能变成4行以上。

解决方法就是用Convert.ToBase64String,以及Convert.FromBase64String进行编码。

热点排行