美国国防部机密文件销毁算法

本文介绍了一种基于美国国防部DOD5220.22M标准的机密文件销毁算法,通过多次覆盖文件内容并更改文件名来确保文件不可恢复。文中还提供了C语言实现的源代码。

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

美国国防部机密文件销毁算法

  当我们在系统里“删除”了一个文件时,并不意味着这个文件就一定从磁盘上清除了,很多优秀的文件恢复软件都可以恢复被删除的文件,这在一定程度上就带来了隐私泄露的隐患。好在现在很多软件,比如360、电脑管家等等软件都集成了文件粉碎的实用功能。今天介绍一种以前被用于美国国防部的机密文件销毁算法,并附上实现的代码(C)。

  算法介绍:

    美国国防部DOD5220.22M文件销毁标准包括以下三步:

  1. 将文件先用0x00覆盖,再用0x01覆盖,如此重复三次;
  2. 将文件用一个随机值覆盖;
  3. 将文件名改为一个单字符文件名,最后删除之。

   算法可靠性验证:

     此算法虽然已经不再被美国国防部采用,但也足够应付一般的环境,主流文件恢复软件恢复的可能性还有待验证。

  实现:

复制代码
  1 /*
  2  *    File Destroyer 文件安全销毁
  3  *
  4  *    Copyright (C) 2015 Chaobs
  5  *
  6  *    This program is free software: you can redistribute it and/or modify
  7  *    it under the terms of the GNU General Public License as published by
  8  *    the Free Software Foundation, either version 3 of the License, or
  9  *    (at your option) any later version.
 10  *
 11  *    This program is distributed in the hope that it will be useful,
 12  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 13  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 14  *    GNU General Public License for more details.
 15  *
 16  *    You should have received a copy of the GNU General Public License
 17  *    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 18  *
 19  *    E-mail: chaobs@outlook.com
 20  *    Blog: www.cnblogs.com/chaobs
 21  *
 22  *    用法: file-destroyer [filename1] <filename2>...
 23  *
 24  *     算法介绍:
 25  *     基于美国国防部DOD5220.22M标准进行文件销毁,包括以下三步:
 26  *     (1)将文件先用0x00覆盖,再用0x01覆盖,如此重复三次;
 27  *     (2)将文件用一个随机值覆盖;
 28  *     (3)将文件名改为一个单字符文件名,最后删除之。
 29  *
 30  *     算法可靠性验证:
 31  *     此算法虽然已经不再被美国国防部采用,但也足够应付一般的环境,对于主流文件恢复软件恢复的可能性还有待验证。
 32  *
 33  */
 34 
 35 #include <stdio.h>
 36 #include <stdlib.h>
 37 #include <time.h>
 38 
 39 
 40 void notice(int i, char *s);    /* print short notice */
 41 
 42 void wipe(FILE *f, char c);    /* core func */
 43 
 44 long file_size(FILE *f);    /* get the size of a file */
 45 
 46 int require(int c, char *s[]);
 47 
 48 
 49 int main(int argc, char *argv[])
 50 {
 51     int i, j;
 52     char ch;
 53 
 54     FILE *f;
 55 
 56     notice(1, argv[0]);
 57 
 58     if (argc < 2) {
 59         /* too few arguments */
 60         notice(2, argv[0]);
 61         exit(0);
 62     }
 63 
 64     if (!require(argc, argv)) {
 65         fprintf(stderr, "Cancel Operating.\n");
 66         exit(0);    /* cancel */
 67     }
 68 
 69     srand(time(NULL));    /* randomize */
 70 
 71     for (i = 1; i < argc; ++i) {
 72         /* process each file */
 73 
 74         if ((f = fopen(argv[i], "r+b")) == NULL) {/* fail to open file */
 75             fprintf(stderr, "Error when open %s:\n", argv[i]);
 76             exit(0);
 77         }
 78 
 79         for (j = 0; j < 3; ++j) {
 80             /* DOD5220.22M Step 1 */
 81             wipe(f, 0x00);
 82             wipe(f, 0x01);
 83         }
 84 
 85         wipe(f, rand() % 256);    /* Step 2 */ 
 86         
 87         if (rename(argv[i], "C")) {
 88             /* Step 3*/
 89             fprintf(stderr, "Error when rename %s\n", argv[i]);
 90             exit(0);
 91             
 92             /* XXX:文件名冲突的解决?可以考虑使用tmpnam()吗?*/
 93         }
 94 
 95         remove("C"); /* XXX:如果是一个符号连接怎样保证删除的是真正的文件? */
 96         fclose(f);
 97     }
 98 
 99     printf("Done! Destroy %d files\n", argc - 1);
100 
101     return 0;
102 }
103 
104 
105 /* implementation */
106 
107 void notice(int i, char *s)
108 {
109     if (i == 1) {
110         printf("\nFile Destroyer Copyright (C) 2015 Chaobs\n");
111         printf("This program comes with ABSOLUTELY NO WARRANTY.\n");
112         printf("This is free software, and you are welcome to redistribute under certain conditions.\n\n");
113     } else {
114         fprintf(stderr, "Usage: %s [filename1] <filename2> ...\n", s);
115     }
116 }
117 
118 void wipe(FILE *f, char c)
119 {
120     long i;
121 
122     for (i = 0; i < file_size(f); ++i)
123         fwrite(&c, 1, 1, f);    /* overwrite */
124 
125 }
126 
127 long file_size(FILE *f)
128 {
129     long len;
130     fseek(f, 0, SEEK_END);    /* jump to the and of file */
131     len = ftell(f);
132     fseek(f, 0, SEEK_SET);    /* restore */ 
133 }
134 
135 
136 int require(int c, char *s[])
137 {
138     int i;
139     char ch;
140     for (i = 1; i < c; ++i) {
141         /* FIXME: the comfirm function can make mistakes and
142          * it is not convenient even can't work in some cases.
143          */
144         printf("Do you want to destroy %s ?(y/n) ", s[i]);
145         ch = getchar();
146         getchar(); /* '\n' */
147         if (ch == 'n')
148             return 0;
149     }
150 
151     return 1;
152 }
复制代码

  当然这样的实现有一个显著缺点——当文件很大时,删除将会占用大量时间,感兴趣的可以自己改进。

 

This is free software, and you are welcome to redistribute it
    under certain conditions
不要想你能为世界做什么,想想你该为世界做什么!
### 关于中国科学技术大学计算数论的研究方向和课程 中国科学技术大学作为国内顶尖高校之一,在数学及其交叉领域有着深厚的研究累。针对计算数论这一具体方向,可以从以下几个方面探讨其可能涉及的研究主题和课程设置。 #### 一、研究方向 计算数论是一门结合传统数论与现代计算方法的学科,广泛应用于密码学、编码理论以及高性能计算等领域。中科大在该领域的研究主要集中在以下几方面: - **模形式与椭圆曲线**:这是当前数论研究中的热点问题之一,尤其在公钥加密体系中有重要应用。通过研究这些抽象代数结构,可以为信息安全提供更强大的保障机制[^2]。 - **素性测试与整数分解算法**:这类课题直接关系到RSA等主流加密协议的安全性评估。高效而可靠的算法开发成为学术界持续关注的重点[^1]。 - **有限域上的离散对数问题**:此问题是Diffie-Hellman密钥交换协议的核心所在。解决此类难题需借助先进的数值模拟技术和并行处理架构支持[^3]。 #### 二、相关课程 为了培养具备扎实理论功底又能灵活运用实际工具的人才队伍,中科大概率开设如下核心课程供感兴趣的学生修读: - **初等/解析数论导论** 这些入门级科目旨在帮助新生掌握基本概念框架和技术手段,为进一步探索高深议题奠定坚实基础[^4]。 ```python def is_prime(n): """判断n是否为质数""" if n <= 1: return False elif n == 2 or n == 3: return True else: limit = int(n**0.5)+1 for i in range(2,limit): if not (n%i):return False return True ``` 上述代码片段展示了如何实现简单的素性检测功能,这正是学习过程中经常练习的内容之一[^5]。 - **近世代数与群表示论** 探讨各种特殊类型的环、域以及它们之间的映射规律;同时介绍矩阵群作用下的不变量性质等内容。 - **计算机辅助证明技术** 教授利用Maple或者Mathematica软件包完成复杂命题验证的方法技巧。 #### 结语 综上所述,无论是从科研还是教学角度来看,中国科学技术大学都拥有开展高水平计算数论工作的优越条件。希望以上信息能够解答您的疑问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值