Mã ngắn nhất để bảo mật xóa đĩa


9

Chúng ta hãy viết mã ngắn nhất để thực hiện một biến thể đơn giản hóa của Phương pháp xóa DoD 5220,22-M chỉ với hai lần viết.

Bất kỳ ngôn ngữ lập trình nào được chấp nhận, nhưng việc sử dụng các thư viện định hướng xóa đĩa đều bị cấm.

Đây là cách chúng tôi thực hiện nó trong mã giả:

Set x to 0

[Start]
'Write Pass
For each sector in disk write the content of x
'Verification Pass
For each sector in disk {
    If sector does not contain the content of x then goto [Start]
}
'Check whether we already did the pass with 1
If x is not 1 then {
    Set x to 1
    GoTo [Start]
}
Else end

Nói cách khác, mã này sẽ chạy hai lần, với vượt qua ghi và vượt qua xác minh 0, và vượt qua ghi và vượt qua xác minh cho 1.

Bất cứ ai cũng đủ để thực hiện nó theo phong cách golf-code? ;)


6
Tôi nghi ngờ điều này sẽ nhận được bất kỳ câu trả lời vì khó kiểm tra.
James

12
Nghiêm túc mà nói, SSD của bạn đã làm gì với bạn để xứng đáng được đối xử như vậy? Nó đã giết toàn bộ bộ sưu tập gấu bông của bạn hay cái gì đó?
R. Kap

2
Thực sự muốn thử và giải quyết điều này ... cũng thực sự không muốn hy sinh ổ cứng của tôi để kiểm tra nó.
Michelfrancis Bustillos

6
Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì thử thách này yêu cầu mã độc.
admBorkBork

2
Tôi sẽ tranh luận khác. Thách thức này yêu cầu mã khuyến khích quyền riêng tư và bảo mật thông tin.
MathuSum Mut

Câu trả lời:


1

Mã máy x86 (Linux), 116 byte

00000000: 89cb 6a02 5931 d289 4c24 f4b0 05cd 8050  ..j.Y1..L$.....P
00000010: 5b53 6a02 5a31 c9b0 13cd 8089 c65b 5331  [Sj.Z1.......[S1
00000020: d231 c9b0 13cd 8089 f75b 53b2 018d 4c24  .1.......[S...L$
00000030: f8b0 04cd 804e 09f6 75ef 5b53 31d2 31c9  .....N..u.[S1.1.
00000040: b013 cd80 89fe 5b53 8d4c 24f4 b201 b003  ......[S.L$.....
00000050: cd80 4e09 f674 0c8a 4424 f838 4424 f474  ..N..t..D$.8D$.t
00000060: e5eb ad89 fe8a 4424 f8c6 4424 f801 3c01  ......D$..D$..<.
00000070: 759e 58c3                                u.X.

Lấy tên tệp làm đối số

Hội (NASM):

section .text
	global func
func:			;this function uses fastcall conventions
	;seems like no enter instr needed

	;open file
	mov ebx, ecx	;first argument to func (filename)
	push 0x2	;flag O_RDWR
	pop ecx		;pushing a constant is shorter than mov
	xor edx, edx	;mode=0
	mov [esp-12], ecx ;set first byte (msg) to write to 0. msg later in esp-8, buf in esp-12
	mov al, 5	;using 8 bit regs is smaller
	int 0x80	;syscall open
	push eax	;save file descriptor

	write_verify:

	;get file size
	pop ebx		;get fd
	push ebx
	push 0x2	;flag SEEK_END
	pop edx
	xor ecx, ecx 	;offset 0
	mov al, 0x13
	int 0x80	;syscall lseek
	mov esi, eax	;save file byte count in esi
	

	;reset index of file to 0
	pop ebx		;get fd
	push ebx
	xor edx, edx	;flag SEEK_SET=0
	xor ecx, ecx	;ecx=0
	mov al, 0x13
	int 0x80	;syscall lseek

	;***write pass***
	mov edi, esi
	write_loop:	;for each byte in byte count, write [msg]
		;write to file
		pop ebx		;file descriptor
		push ebx
		mov dl, 1	;bytes to write
		lea ecx, [esp-8] ;buffer to write from
		mov al, 4
		int 0x80	;syscall write
		dec esi	;decrement esi (byte count) to 0
		or esi, esi	;cmp esi to 0
		jne write_loop	;while esi!=0, keep looping

	;reset index of file to 0
	pop ebx		;get fd
	push ebx
	xor edx, edx	;flag SEEK_SET=0
	xor ecx, ecx	;ecx=0
	mov al, 0x13
	int 0x80	;syscall lseek

	
	;***verification pass***
	mov esi, edi
	verify_loop:	;for each byte in byte count, verify written byte
		pop ebx		;get fd
		push ebx
		lea ecx, [esp-12] ;buffer to store read byte
		mov dl, 1	;read 1 byte
		mov al, 3
		int 0x80	;syscall read
		dec esi
		or esi, esi	;cmp esi to 0 
		je end_verify	;at final byte, end verification
		mov al, [esp-8]
		cmp byte [esp-12],al
		je verify_loop	 ;keep looping if expected value found
		jmp write_verify ;if byte!=expected value, restart

	end_verify:
	mov esi, edi
	mov al, [esp-8]
	mov byte [esp-8],0x1	;set new byte to write to 1
	cmp al, 0x1
	jne write_verify	;if old byte to write!=1, goto start
	
	pop eax			;reset stack
	ret

Hãy thử trực tuyến! (Sử dụng một tập tin tạm thời)

-11 byte bằng cách tối ưu hóa các thanh ghi di chuyển và sử dụng ngăn xếp làm bộ đệm thay vì vị trí không đổi trong bộ nhớ.


3

Trên hệ thống linux, không cần xử lý thiết bị đặc biệt. Chỉ cần sử dụng giao diện tập tin thiết bị.

Python 3 (chuỗi byte) - 141 byte

d=input()
f=open(d,'r+b')
z=f.seek
z(0,2)
s=f.tell()
i=0
while i<2:
 z(0);f.write([b'\0',b'\xff'][i]*s);f.flush();z(0)
 if f.read()==x:i+=1

Nó khá đơn giản và không thực sự được tối ưu hóa nhiều, nhưng nó hoạt động. Đây là một danh sách cơ bản.

  • Nhận đầu vào (đường dẫn tệp thiết bị)
  • Mở tập tin thiết bị
  • Tìm kiếm đến cùng, nhận kích thước tệp (thiết bị khối luôn có kích thước thật của chúng)
  • nhập vòng lặp ghi và kiểm tra
  • xây dựng chuỗi 0 bit và 1 bit (x)
  • viết chuỗi
  • đầu ra tuôn ra (tôi có thể đã đặt bộ đệm = 0 nhưng cái này ngắn hơn)
  • kiểm tra tệp so với x và bước tăng của vòng lặp nếu nó vượt qua

vòng lặp thoát khi mức tăng đủ cao

Như một phần thưởng, bạn có thể sửa đổi điều này cho bất kỳ tập hợp và số lượng mẫu sửa đổi byte nào, như 0x55 / 0xaa để có hiệu ứng ghi đè mạnh hơn.

Tôi đã thực sự kiểm tra điều này trên một tập tin thiết bị, sử dụng loopback. Tuy nhiên, tôi không chắc chắn 100% việc kiểm tra thực sự hoạt động. Có thể cần phải đóng và mở lại tệp mỗi lần vượt qua, do các hành vi đệm. Tôi hy vọng tuôn ra ngăn chặn điều này.

* chỉnh sửa để kết hợp một số đề xuất trong các ý kiến


1
Chào mừng đến với trang web. Bạn chắc chắn không cần khoảng trắng xung quanh một =con trăn. Bạn cũng có thể giảm số byte của mình bằng cách sử dụng ;để giảm thụt lề.
Ad Hoc Garf Hunter

Thông thường, chúng tôi đếm các bài nộp theo byte, không phải ký tự. Bạn cũng có thể bí danh một số chức năng của mình, ví dụ f.seek(0);f.seek(0)(19 byte) có thể là s=f.seek;s(0);s(0)(18 byte). Hơn nữa, if f.read()==x:i+=1có thể được i+=f.read()==x.
Jonathan Frech

Bạn cũng không cần chuỗi trống làm đối số để nhập.
Quintec

Tôi nghĩ b'\0'thay vì b'\x00'nên làm việc.
Jason

Chỉ cần nhận ra một tính năng quan trọng. Chương trình này sẽ tiêu thụ RAM bằng với kích thước của thiết bị bị xóa.
William Shipley

2

C (tiếng kêu) , -DZ=lseek(d,0+ 139 = 152 byte

g,j,x,d,s,i,c;f(n){x=0;d=open(n,2);s=Z,2);for(j=2;j--;x++){Z,0);for(i=s;i--;write(d,&x,1));Z,0);for(i=s;i--;read(d,&c,1),c!=x&&x--&&j--);}}

Hãy thử trực tuyến!

Lấy tên tệp làm đối số

Ung dung:

#include <unistd.h>
int g,j,x,d,s,i,c;
void f(char*n){
	x=0; /*Byte to write*/
	d=open(n,O_RDWR);
	s=lseek(d,0,SEEK_END); /*Get size of file*/
	j=0;
	for(j=0;j<2;j++){
		/*Write Pass*/
		lseek(d,0,SEEK_SET); /*Start writing from start of file*/
		for(i=0;i<s;i++){
			write(d,&x,1);
		}
		
		/*Verification Pass*/
		lseek(d,0,SEEK_SET);
		for(i=0;i<s;i++){
			read(d,&c,1);
			if(c!=x)x--,j--; /*If verification fails, repeat loop with the same value*/
		}
		x++;
	}
}

Hmm ... TiO sẽ xóa internet? ;-D
Tít

@Titus Nó tạo một tập tin tạm thời và xóa sạch nó.
Logern

1

Tcl, 286 byte

proc f {o i l} {seek $o 0
set s [string repeat $i $l]
puts -nonewline $o $s
flush $o
seek $o 0
return [string equal [read $o $l] $s]}
set n [open $argv r+]
fconfigure $n -translation binary
seek $n 0 end
set m [tell $n]
while {![f $n "\0" $m]} {}
while {![f $n "\xff" $m]} {}

Không thực sự tối ưu hóa tốt. Tôi đã thử những gì tôi có thể, nhưng tôi không biết nhiều về Tcl.

Lưu dưới dạng "f.tcl" và chạy trên Unix với tclsh f.tcl "your filename". Hãy chắc chắn rằng có chính xác một đối số! Tôi đã thử nghiệm điều này trên một tệp đơn giản, nhưng nó cũng hoạt động trên một tệp thiết bị.

Việc đặt các biến và lập chỉ mục có liên quan nhiều hơn đến Tcl, vì vậy tôi quyết định đặt mã chung giữa các lần truyền vào một hàm. Sau đó, tôi gọi nó trước bằng "\ 0" và lặp lại trong khi không xác minh được. Tôi làm điều tương tự với "\ xff".

Tôi đỏ bừng mặt sau khi viết; nó có thể không cần thiết fconfigure -translation binary -buffering nonedài hơn.

-2 byte bằng cách loại bỏ dấu ngoặc kép xung quanh r+.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.