DES加密文件

本文介绍了一种使用DES算法对文件内容进行加密和解密的方法,包括支持和不支持中文字符的两种情况。提供了生成随机密钥的功能,并详细展示了如何通过C#实现文件的加密与解密过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 /// <summary>
        /// 随机产生密钥
        /// </summary>
        /// <returns></returns>
        static string GenerateKey()
        {
            // Create an instance of Symetric Algorithm. Key and IV is generated automatically.
            DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();

            // Use the Automatically generated key for Encryption. 
            return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
        }
        
        /// <summary>
        /// DES加密文件内容(不支持中文)
        /// </summary>
        /// <param name="sInputFilename">输入文件名</param>
        /// <param name="sOutputFilename">输出文件名</param>
        /// <param name="sKey">加密密钥8位</param>
        public static void EncryptFileByASCII(string sInputFilename,string sOutputFilename,string sKey)
        {   
            FileStream fsInput = new FileStream(sInputFilename,FileMode.Open,FileAccess.Read);
            FileStream fsEncrypted = new FileStream(sOutputFilename,FileMode.Create,FileAccess.Write);

            DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
            DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
            DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
            ICryptoTransform desencrypt = DES.CreateEncryptor();
            CryptoStream cryptostream = new CryptoStream(fsEncrypted,desencrypt,CryptoStreamMode.Write);

            byte[] bytearrayinput = new byte[fsInput.Length];
            fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
            cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
            cryptostream.Close();
            fsInput.Close();
            fsEncrypted.Close();
        }
        /// <summary>
        /// DES解密文件(不支持中文)
        /// </summary>
        /// <param name="sInputFilename">输入文件名</param>
        /// <param name="sOutputFilename">输出文件名</param>
        /// <param name="sKey">解密密钥8位</param>
        public static void DecryptFileByASCII(string sInputFilename, string sOutputFilename, string sKey)
        {
            DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
            //A 64 bit key and IV is required for this provider.
            //Set secret key For DES algorithm.
            DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
            //Set initialization vector.
            DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

            //Create a file stream to read the encrypted file back.
            FileStream fsread = new FileStream(sInputFilename,FileMode.Open,FileAccess.Read);
            //Create a DES decryptor from the DES instance.
            ICryptoTransform desdecrypt = DES.CreateDecryptor();
            //Create crypto stream set to read and do a 
            //DES decryption transform on incoming bytes.
            CryptoStream cryptostreamDecr = new CryptoStream(fsread,desdecrypt,CryptoStreamMode.Read);
            //Print the contents of the decrypted file.
            StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
            fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
            fsDecrypted.Flush();
            fsDecrypted.Close();
        }
        /// <summary>
        /// 对文件内容进行DES加密(支持中文)
        /// </summary>
        /// <param name="sourceFile">待加密的文件绝对路径</param>
        /// <param name="destFile">加密后的文件保存的绝对路径</param>
        /// <param name="sKey">加密密钥8位</param>
        public static void EncryptFileByUnicode(string sourceFile, string destFile,string sKey)
        {
            if (!File.Exists(sourceFile))
            {
                throw new FileNotFoundException("指定的文件路径不存在!", sourceFile);
            }
            byte[] btKey = Encoding.Default.GetBytes(sKey);
            byte[] btIV = Encoding.Default.GetBytes(sKey);
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] btFile = File.ReadAllBytes(sourceFile);
            using (FileStream fs = new FileStream(destFile, FileMode.Create, FileAccess.Write))
            {
                try
                {
                    using (CryptoStream cs = new CryptoStream(fs, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write))
                    {
                        cs.Write(btFile, 0, btFile.Length);
                        cs.FlushFinalBlock();
                    }
                }
                catch
                {
                    throw;
                }
                finally
                {
                    fs.Close();
                }
            }
        }
        /// <summary>
        /// 对文件内容进行DES加密,加密后覆盖掉原来的文件(支持中文)
        /// </summary>
        /// <param name="sourceFile">待加密的文件的绝对路径</param>
        /// <param name="sKey">加密密钥8位</param>
        public static void EncryptFileByUnicode(string sourceFile, string sKey)
        {
            EncryptFileByUnicode(sourceFile, sourceFile, sKey);
        }
        /// <summary>
        /// 对文件内容进行DES解密(支持中文)
        /// </summary>
        /// <param name="sourceFile">待解密的文件绝对路径</param>
        /// <param name="destFile">解密后的文件保存的绝对路径</param>
        /// <param name="sKey">解密密钥8位</param>
        public static void DecryptFileByUnicode(string sourceFile, string destFile, string sKey)
        {
            if (!File.Exists(sourceFile)) throw new FileNotFoundException("指定的文件路径不存在!", sourceFile);
            byte[] btKey = Encoding.Default.GetBytes(sKey);
            byte[] btIV = Encoding.Default.GetBytes(sKey);
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] btFile = File.ReadAllBytes(sourceFile);
            using (FileStream fs = new FileStream(destFile, FileMode.Create, FileAccess.Write))
            {
                try
                {
                    using (CryptoStream cs = new CryptoStream(fs, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write))
                    {
                        cs.Write(btFile, 0, btFile.Length);
                        cs.FlushFinalBlock();
                    }
                }
                catch
                {
                    throw;
                }
                finally
                {
                    fs.Close();
                }
            }
        }
        /// <summary>
        /// 对文件内容进行DES解密,加密后覆盖掉原来的文件(支持中文)
        /// </summary>
        /// <param name="sourceFile">待解密的文件的绝对路径</param>
        /// <param name="sKey">解密密钥8位</param>
        public static void DecryptFileByUnicode(string sourceFile, string sKey)
        {
            DecryptFileByUnicode(sourceFile, sourceFile, sKey);
        }


 

### 使用Python实现DES加密文件 为了使用Python实现DES加密文件,可以借助`pycryptodome`库中的功能。此库提供了强大的工具来进行各种形式的数据加密解密操作。 安装所需的库可以通过pip完成: ```bash pip install pycryptodome ``` 下面是一个完整的例子,展示如何读取文件内容并对其进行DES加密后再保存到新的文件中[^1]。 #### DES加密文件的示例代码 ```python from Crypto.Cipher import DES import base64 def pad(text): while len(text) % 8 != 0: text += b' ' return text def encrypt_file(input_filename, output_filename, key): with open(input_filename, 'rb') as file_in: plaintext = file_in.read() cipher = DES.new(key, DES.MODE_ECB) padded_plaintext = pad(plaintext) encrypted_text = cipher.encrypt(padded_plaintext) encoded_encrypted_text = base64.b64encode(encrypted_text).decode('utf-8') with open(output_filename, 'w', encoding='utf-8') as file_out: file_out.write(encoded_encrypted_text) if __name__ == "__main__": input_file_path = "example.txt" output_file_path = "encrypted_example.txt" secret_key = b'secret_k' encrypt_file(input_file_path, output_file_path, secret_key) ``` 这段程序首先定义了一个辅助函数`pad()`用来确保输入字符串长度为8字节倍数,因为这是DES算法的要求之一。接着实现了`encrypt_file()`函数,该函数接收三个参数:要加密文件路径、存储加密后数据的目标文件路径以及用于加密的秘密钥。最后,在主程序部分指定了具体的文件名和秘钥,并调用了上述函数执行实际的操作。 需要注意的是,这里使用的模式是ECB(电子密码本),这是一种简单的块加密方式;但在真实场景下可能更推荐CBC等其他更为安全的工作模式。此外,对于生产环境下的应用来说,还需要考虑更多因素如异常处理机制、秘钥管理策略等方面的内容[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值