Kode terpendek untuk mengamankan penghapusan disk

9

Mari kita menulis kode terpendek untuk melakukan varian yang disederhanakan dari Metode Penghapusan DoD 5220.22-M dengan hanya dua lintasan penulisan.

Bahasa pemrograman apa pun diterima, tetapi penggunaan pustaka berorientasi disk-wiping dilarang.

Inilah cara kami mengimplementasikannya dalam pseudocode:

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

Dengan kata lain, kode ini akan berjalan dua kali, dengan pass tulis dan pass verifikasi 0, dan pass tulis dan pass verifikasi 1.

Adakah yang cukup berani untuk menerapkannya gaya kode-golf? ;)

MathuSum Mut
sumber
6
Saya ragu ini akan mendapat jawaban karena sulitnya untuk menguji.
James
12
Serius, apa yang SSD Anda lakukan agar Anda pantas mendapatkan perawatan seperti ini? Apakah itu membunuh seluruh koleksi boneka beruang Anda atau sesuatu?
R. Kap
2
Benar-benar ingin mencoba dan mengatasi ini ... juga benar-benar tidak ingin mengorbankan HDD saya untuk mengujinya.
Michelfrancis Bustillos
6
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena tantangan ini meminta kode berbahaya.
AdmBorkBork
2
Saya berpendapat sebaliknya. Tantangan ini meminta kode yang mempromosikan privasi dan keamanan informasi.
MathuSum Mut

Jawaban:

1

kode mesin 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.

Mengambil nama file sebagai argumen

Majelis (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

Cobalah online! (Menggunakan file sementara)

-11 byte dengan mengoptimalkan register bergerak dan menggunakan stack sebagai buffer alih-alih lokasi konstan dalam memori.

Logern
sumber
3

Pada sistem linux, tidak perlu penanganan khusus untuk perangkat. Cukup gunakan antarmuka file perangkat.

Python 3 (string 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

Ini cukup mudah, dan tidak terlalu dioptimalkan, tetapi berfungsi. Berikut ini adalah ikhtisar dasar.

  • Dapatkan input (jalur file perangkat)
  • Buka file perangkat
  • Cari sampai akhir, dapatkan ukuran file (perangkat blok selalu ukuran sebenarnya)
  • masukkan loop tulis-dan-periksa
  • membangun string 0-bit dan 1-bit (x)
  • tulis bitstring
  • output flush (saya bisa mengatur buffering = 0 tapi ini lebih pendek)
  • uji file terhadap x, dan tambah langkah loop jika lolos

keluar loop ketika kenaikan cukup tinggi

Sebagai bonus, Anda dapat memodifikasi ini untuk setiap set dan jumlah pola byte-modifikasi, seperti 0x55 / 0xaa untuk efek overwriting yang lebih kuat.

Saya benar-benar menguji ini pada file perangkat, menggunakan loopback. Namun, saya tidak 100% yakin pengecekan benar-benar berfungsi. Mungkin perlu untuk menutup dan membuka kembali file setiap pass, karena perilaku buffering. Saya berharap siram mencegah ini.

* diedit untuk memasukkan beberapa saran dalam komentar

William Shipley
sumber
1
Selamat datang di situs ini. Anda tentu tidak perlu spasi putih di sekitar =di python. Anda juga dapat mengurangi jumlah byte Anda dengan menggunakan ;untuk mengurangi indentasi.
Ad Hoc Garf Hunter
Biasanya, kami menghitung pengiriman dalam byte, bukan karakter. Anda juga dapat alias beberapa fungsi Anda, misalnya f.seek(0);f.seek(0)(19 byte) dapat s=f.seek;s(0);s(0)(18 byte). Selanjutnya if f.read()==x:i+=1bisa i+=f.read()==x.
Jonathan Frech
Anda juga tidak perlu membutuhkan string kosong sebagai argumen untuk input.
Quintec
Saya pikir b'\0'bukannya b'\x00'harus bekerja.
Jason
Baru menyadari fitur penting. Program ini akan mengkonsumsi RAM sama dengan ukuran perangkat yang dihapus.
William Shipley
2

C (dentang) , -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--);}}

Cobalah online!

Mengambil nama file sebagai argumen

Tidak Disatukan:

#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++;
	}
}
Logern
sumber
Hmm ... apakah TiO akan menghapus internet? ;-D
Titus
@Titus Ini membuat file sementara dan menghapusnya.
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]} {}

Tidak benar-benar dioptimalkan dengan baik. Saya mencoba apa yang saya bisa, tetapi saya tidak tahu banyak tentang Tcl.

Simpan sebagai "f.tcl" dan jalankan di Unix dengan tclsh f.tcl "your filename" . Pastikan ada satu argumen! Saya menguji ini pada file biasa, tetapi itu harus bekerja pada file perangkat juga.

Pengaturan variabel dan pengindeksan lebih banyak terlibat dalam Tcl, jadi saya memutuskan untuk meletakkan kode umum antara lintasan ke dalam fungsi. Lalu saya menyebutnya pertama dengan "\ 0", dan ulangi saat gagal memverifikasi. Saya melakukan hal yang sama dengan "\ xff".

Saya memerah setelah menulis; mungkin tidak perlu. fconfigure -translation binary -buffering nonelebih panjang.

-2 byte dengan menghapus tanda kutip r+.

Jason
sumber