ขัดขวางการบีบอัด LZMA2


11

เป้าหมาย

สร้างโปรแกรมหรือคู่ของโปรแกรมที่ทำลายและแก้ไขไฟล์โดยรวมโดยมีเจตนาเพื่อป้องกัน LZMA2 จากการทำงานอย่างมีประสิทธิภาพ รูทีนการรบกวนและแก้ไขต้องเป็นแบบกลับกันดังนั้นคุณสามารถกู้คืนไฟล์ต้นฉบับได้อย่างแน่นอน

เป้าหมาย

วิธีการบีบอัด

  • อูบุนตู / เกี่ยวข้อง: xz -kz5 <infile>
  • ของ windows: 7z.exe a -txz -mx5 <outfile> <infile>
  • อื่น ๆ : ใช้คอมเพรสเซอร์ LZMA2 พร้อมระดับการบีบอัด 5 ที่บีบอัดงานของเช็คสเปียร์เป็น 1570550 ไบต์± 100 ไบต์

เกณฑ์การให้คะแนน; ผลรวมของ (ทุกสิ่งมีหน่วยเป็นไบต์ls -lหรือdir:)

  • ขนาดโปรแกรม (สิ่งที่ต้องใช้ร่วมกันเพื่อย้อนกลับ "หยุด" / แก้ไขไฟล์)
  • ความแตกต่างในขนาด (แน่นอน) ระหว่าง:
    • ผลงานที่รวบรวมได้ของ Shakespeare และสำเนาที่ไม่ได้บีบอัดของคุณ
    • รูปภาพดิบและสำเนาที่แก้ไข (ไม่บีบอัด) ของคุณ
  • ความแตกต่างในขนาดหรือ 0 แล้วแต่จำนวนใดจะยิ่งใหญ่กว่าระหว่าง:
    • ผลงานที่รวบรวมได้ของ Shakespeare ลบสำเนาที่บีบอัด LZMA2 ของคุณ
    • ภาพถ่ายดิบลบสำเนาที่บีบอัด LZMA2 ของคุณ

ตัวอย่าง

ให้คะแนนไม่ดีนักกอล์ฟอย่างเฉื่อยชา แต่เป็น Python 2.x ที่สอดคล้องกับมาตรฐาน:

import sys
x = 7919 if sys.argv[1] == 'b' else -7919
i = bytearray(open(sys.argv[2], 'rb').read())
for n in range(len(i)):
    i[n] = (i[n] + x*n) % 256
o = open(sys.argv[2]+'~', 'wb').write(i)

วิ่ง...

$ python break.py b pg100.txt 
$ python break.py f pg100.txt~ 
$ diff -s pg100.txt pg100.txt~~
Files pg100.txt and pg100.txt~~ are identical
$ python break.py b Glühwendel_brennt_durch.jpg 
$ python break.py f Glühwendel_brennt_durch.jpg~
$ diff -s Glühwendel_brennt_durch.jpg Glühwendel_brennt_durch.jpg~~
Files Glühwendel_brennt_durch.jpg and Glühwendel_brennt_durch.jpg~~ are identical
$ xz -kz5 pg100.txt~
$ xz -kz5 Glühwendel_brennt_durch.jpg~
$ ls -ln
-rw-rw-r-- 1 2092 2092     194 May 23 17:37 break.py
-rw-rw-r-- 1 2092 2092 1659874 May 23 16:20 Glühwendel_brennt_durch.jpg
-rw-rw-r-- 1 2092 2092 1659874 May 23 17:39 Glühwendel_brennt_durch.jpg~
-rw-rw-r-- 1 2092 2092 1659874 May 23 17:39 Glühwendel_brennt_durch.jpg~~
-rw-rw-r-- 1 2092 2092 1646556 May 23 17:39 Glühwendel_brennt_durch.jpg~.xz
-rw-rw-r-- 1 2092 2092 5589891 May 23 17:24 pg100.txt
-rw-rw-r-- 1 2092 2092 5589891 May 23 17:39 pg100.txt~
-rw-rw-r-- 1 2092 2092 5589891 May 23 17:39 pg100.txt~~
-rw-rw-r-- 1 2092 2092 3014136 May 23 17:39 pg100.txt~.xz

คะแนน

  • = 194 + abs (5589891 - 5589891) + สูงสุด (5589891 - 3014136, 0) + abs (1659874 - 1659874) + สูงสุด (1659874 - 1646556, 0)
  • = 194 + 0 + 2575755 + 0 + 13318
  • 2,589,267 ไบต์ ไม่ดี แต่การไม่ทำอะไรกับไฟล์ให้คะแนน 4,635,153 ไบต์

การอธิบาย

นี่คือกอล์ฟดังนั้นคุณจึงพยายามลดคะแนนของคุณ ฉันไม่แน่ใจว่าความคิดเห็นนั้นชี้ให้เห็นช่องโหว่ที่ถูกต้องในการให้คะแนนของฉันหรือว่าเป็นเพราะฉันทำให้ซับซ้อนเกินไป ไม่ว่าในกรณีใดคุณต้องการให้เล็กที่สุด :

  • รหัสแหล่งที่มา
  • ความแตกต่างระหว่างไฟล์ที่แก้ไขแล้วที่ไม่มีการบีบอัดและไฟล์ต้นฉบับ (เช่นหากคุณแก้ไขด้วยการเพิ่ม 0 ล้านล้านต่อท้ายคะแนนของคุณจะเพิ่มขึ้นเป็นล้านล้านไบต์)
  • ความแตกต่างระหว่างไฟล์ที่ถูกบีบอัดและไฟล์ต้นฉบับ (เช่นไฟล์ที่บีบอัดไม่ได้จะกลายเป็นคะแนนของคุณยิ่งสูงขึ้น) ไฟล์ที่ไม่สามารถบีบอัดได้อย่างสมบูรณ์แบบที่เพิ่มขึ้นเล็กน้อยหรือไม่มีเลยจะได้คะแนน 0

2
คำตอบที่หมุนรอบ: ขั้นตอนที่ 1 - หาจำนวนเนื้อที่ว่างบนดิสก์ที่คุณแบ่งแล้วตามขนาดของไฟล์เพื่อรับ N ขั้นตอนที่ 2 - ต่อท้ายไฟล์ด้วยตัวเอง N ครั้งและต่อท้ายหมายเลข N ขั้นตอนที่ 3 - รู้ว่ามี ไม่มีพื้นที่เหลือในการบีบอัดไฟล์ แต่ท้ายสุดจะมีความแตกต่างที่แน่นอนในขนาดไฟล์ของเทราไบต์ (หรือมากกว่า) .... [หากต้องการย้อนกลับให้อ่าน N จากจุดสิ้นสุดของไฟล์และย่อขนาดไฟล์เป็น 1 / Nth ]
MT0

@ MT0: อาฉันคิดว่าทางออกคือความแตกต่างไม่ควรแน่นอน หากไฟล์ที่คุณแก้ไขมีขนาดใหญ่ขึ้นควรลบคะแนน
Claudiu

@ MT0 หากคุณแก้ไขไฟล์เพื่อให้มีขนาดใหญ่มากเทราไบต์คะแนนของคุณจะเป็น 1 เทราไบต์ ... ค่อนข้างแย่เมื่อคุณพยายามตีกอล์ฟ
Nick T

@ MT0 ฉันเพิ่มคำอธิบายลงในโพสต์แล้วมันช่วยได้ไหม?
Nick T

2
เล่นลิ้นหนึ่ง คอมเพรสเซอร์อาจทำให้ไฟล์มีขนาดใหญ่ขึ้นถ้า t ไม่สามารถบีบอัดได้เป็นพิเศษ ในกรณีนี้คุณควรได้รับรางวัลไม่ถูกลงโทษไม่?
Claudiu

คำตอบ:


8

Python คะแนน = 120

import sys,hashlib
i=0
for c in sys.stdin.read():sys.stdout.write(chr(ord(c)^ord(hashlib.md5(str(i)).digest()[0])));i+=1

ทำให้แผ่นเพียงครั้งเดียวโดยใช้ md5 ในโหมดเคาน์เตอร์ xors ไฟล์ด้วย นี่เป็นข้อดีที่ไฟล์ต้นฉบับและไฟล์ที่เสียหายนั้นมีขนาดเท่ากันและตัว disruptor และ fixer เป็นโปรแกรมเดียวกัน

ไฟล์ที่ถูกบีบอัดที่ถูกบีบอัดมีขนาดใหญ่กว่าต้นฉบับ


ฉันปรับการให้คะแนนดังนั้นหากไฟล์ซิปมีขนาดใหญ่กว่าไฟล์ต้นฉบับคุณไม่ถูกลงโทษและพวกเขาเพิ่งได้คะแนน 0 ไม่แน่ใจว่าไฟล์ของคุณแตกต่างกันอย่างไร แต่คุณอาจต้องการอัปเดตคะแนน
Nick T

@NickT: อัปเดต
Keith Randall

8

C, 51 = 51 + 0 + 0 + 0 + 0

main(c){for(;c=~getchar();putchar(~c^rand()>>23));}

ภายใต้ลูกกอล์ฟโปรแกรมนี้จะวนซ้ำสำหรับแต่ละไบต์ในอินพุตมาตรฐานและไม่ จำกัด เฉพาะหรือด้วยแผ่นไม่มีที่สิ้นสุดจาก Rand () ฉันทดสอบสิ่งนี้ด้วย rand () ใน libc ของ OpenBSD 5.5

การใช้งาน:

./scramble <orig >scrambled
./scramble <scrambled >orig.copy

เพื่อทดสอบโปรแกรมของฉันฉันเขียนshell script test.sh (57 บรรทัด)เพื่อรวบรวมโปรแกรมของฉันและคำนวณคะแนนของฉัน

$ sh test.sh
[1/4] Compiling scramble...
/tmp//ccbcB43x.o(.text+0x6): In function `main':
: warning: rand() isn't random; consider using arc4random()
[2/4] Scrambling files...
[3/4] Compressing scrambled files...
[4/4] Checking descrambler...
SCORE: 51=51+0+0+0+0
You may wish to rm -rf tmp.9Tjw89dgCs
$ ls -l tmp.9Tjw89dgCs/
total 43032
-rw-r--r--  1 kernigh  kernigh  1659874 May 28 17:23 filament.jpg.cp
-rw-r--r--  1 kernigh  kernigh  1659874 May 28 17:23 filament.jpg.sc
-rw-r--r--  1 kernigh  kernigh  1660016 May 28 17:23 filament.jpg.sc.xz
-rw-r--r--  1 kernigh  kernigh  5589891 May 28 17:23 pg100.txt.cp
-rw-r--r--  1 kernigh  kernigh  5589891 May 28 17:23 pg100.txt.sc
-rw-r--r--  1 kernigh  kernigh  5590232 May 28 17:23 pg100.txt.sc.xz
-rwxr-xr-x  1 kernigh  kernigh     8564 May 28 17:23 scramble

หมายเหตุเกี่ยวกับ rand () และการเปลี่ยนที่ถูกต้อง

อัลกอริทึมการบีบอัดใด ๆ ไม่สามารถบีบอัดข้อมูลแบบสุ่มได้ ฉันสามารถปลอมpg100.txtและfilament.jpgเป็นข้อมูลแบบสุ่มถ้าฉันแย่งพวกเขาด้วยตัวเลขกระแส

ความคิดแรกของฉันคือใช้เอกสิทธิ์หรือข้อความธรรมดาที่มีแผ่นรองเพื่อทำciphertextจากนั้นเก็บทั้งciphertextและpadไว้ในไฟล์สัญญาณรบกวน นี่จะเพิ่มขนาดของไฟล์และเพิ่มคะแนนของฉัน ตัวเลือกที่ชัดเจนคือการใช้แผ่นอิเล็กโทรดเดียวกันสำหรับทุกไฟล์และเก็บเฉพาะไซเฟอร์เท็กซ์ในไฟล์สัญญาณรบกวน ถ้าฉันเพิ่งเรียก rand () มันจะใช้เมล็ดเริ่มต้นที่ 1 และทำให้แผ่นเดียวกันทุกครั้ง

OpenBSD 5.5 กำหนด rand () ในstdlib.hและrand.c :

/* from stdlib.h */
#define RAND_MAX    0x7fffffff

/* from rand.c */
static u_int next = 1;

int
rand_r(u_int *seed)
{
    *seed = *seed * 1103515245 + 12345;
    return (*seed % ((u_int)RAND_MAX + 1));
}

int
rand(void)
{
    return (rand_r(&next));
}

นี้เป็นตัวสร้างความสอดคล้องแบบเชิงเส้น ข้อบกพร่องใหญ่คือบิตที่ต่ำมีระยะเวลาสั้น ๆ บิตที่ 1 มีระยะเวลา 2: ถ้าคุณพลิกเหรียญด้วยrand()&1มันจะไปที่หัวก้อยหัวก้อยและอื่น ๆ บิตที่ n มีระยะเวลาของ 2 n มี 31 บิตดังนั้นลำดับทั้งมีระยะเวลาของ 2 เป็นวันที่ 31

LZMA2 สามารถค้นหารูปแบบในช่วงเวลาสั้น ๆ และบีบอัดได้ รหัสที่สั้นที่สุด~c^rand()ใช้เวลา 8 บิตต่ำและไม่ป้องกันการบีบอัด การเปลี่ยนที่ถูกต้อง~c^rand()>>9ช่วยได้ แต่ไม่เพียงพอ ~c^rand()>>23ฉันใช้

  • ~c คะแนน: 4227957 = 40 + 0 + 0 + 4019391 + 208526
  • ~c^rand() คะแนน: 2474616 = 47 + 0 + 0 + 2463735 + 10834
  • ~c^rand()>>9 คะแนน: 350717 = 50 + 0 + 0 + 350667 + 0
  • ~c^rand()>>23 คะแนน: 51 = 51 + 0 + 0 + 0 + 0

5

BrainFuck : 129 (129 + 0 + 0 + 0 + 0) *

random.bf (เพิ่ม linefeeds เพื่อให้สามารถอ่านได้)

,+[->>>>++[<++++++++[<[<++>-]>>[>>]+>>+[-[->>+<<<[<[<<]<
+>]>[>[>>]]]<[>>[-]]>[>[-<<]>[<+<]]+<<]<[>+<-]>>-]<[-<<+
>>]<<.,+[->]>>>]]

ในการสร้างunrandom.bfคุณต้องเปลี่ยน + สุดท้ายในบรรทัดที่สอง

ส่วนใหญ่ของรหัสจะขึ้นอยู่กับตัวสร้างตัวเลขสุ่มตาม Rule30ของ Daniel B Cristofani ที่ดัดแปลงเพื่อเพิ่มหมายเลขให้กับแต่ละอินพุตและจะยุติเมื่อไม่มีการป้อนข้อมูลเพิ่มเติม

* ฉันได้ทดสอบไบต์ที่มีการประมวลผลจนถึง 212992 (ผ่านการประมวลผลหลังจาก 12 ชั่วโมง) และทั้งสองไฟล์กลายเป็นไฟล์บีบอัด 213064 ฉันเดาว่าน่าจะเสร็จสิ้นภายในสัปดาห์เพื่อทราบอย่างแน่นอน แต่ฉันไม่ต้องการรอการโพสต์ ฉันจะอัปเดตคะแนนถ้ามันผิด แต่ให้แก้ปัญหาตั้งแต่ Rule30 หิน!

สิ่งละอันพันละน้อย: Stephen Wolfram ค้นพบกฎข้อที่ 30ในปี 1983 และตาม Wikipedia มันถูกใช้เพื่อผลิตจำนวนเต็มแบบสุ่มใน Mathematica

การรวบรวมและการทำงาน:

มันใช้เวลาและพื้นที่ชี้แจง (ทำซ้ำมากกว่า 32 เซลล์ต่อการประมวลผลถ่าน) ดังนั้นจึงต้องใช้ BrainFuck รันไทม์ที่มีอย่างน้อย 178,876,517 เซลล์เพื่อเข้ารหัสไฟล์ Shakespear ไม่ถือว่าไม่ใช่ ASCII เป็นยูนิโค้ดมีความกว้างมากกว่า 8 บิตเซลล์และใช้ -1 เป็น eof (จะแตกต่างกันระหว่าง 255 และ -1) ฉันมักจะใช้ล่ามคนอื่น ๆ แต่คราวนี้ฉันต้องเป็นปลั๊กและส่งเสริมตัวเอง:

jitbf --eof -1 -b 16 -c 200000000 random.bf < pg100.txt > pg100.txt.ran
jitbf --eof -1 -b 16 -c 200000000 random.bf < Glühwendel_brennt_durch.jpg > Glühwendel_brennt_durch.jpg.ran

jitfb รวบรวม BrainFuck เพื่อเพิ่มประสิทธิภาพ C และใช้ perl Inline :: C เพื่อใช้งานอย่างไม่เหมาะสม มันเป็นเรื่องการรวมกลุ่มของฉันกับคอมไพเลอร์ brainfuck ขยาย ด้วยขนาดและความกว้างของเซลล์ในอาร์กิวเมนต์มันจะจัดสรรประมาณ 400MB


3

CJam, 22 ไบต์

G,~q{5$H$+255%_@^o}/];

สิ่งนี้ใช้ตัวกำเนิดฟิโบน่าชีที่มีความสัมพันธ์ที่เกิดซ้ำs n = (s n-5 + s n-16 )% 255 (ซึ่งฉันเลือกโดยไม่ได้ตั้งใจ แต่มันก็ใช้งานได้) และเมล็ดพันธุ์เล็ก ๆ ซึ่งก็คือ XORs ด้วยอินพุต

ฉันทดสอบโค้ดด้วยCJam 0.6ซึ่งเผยแพร่เมื่อวันที่ 1 พฤษภาคม 2014

มันทำงานอย่างไร

G,~                    e# Dump 0, 1, ... and 15 on the stack.
   q                   e# Read from STDIN.
    {             }/   e# For each character in the input.
     5$H$              e# Copy the sixth and 19th element from the stack.
         +255%         e# Push their sum modulo 255.
              _@       e# Duplicate and rotate the character on top.
                ^o     e# XOR and print.
                    ]; e# Clear the stack.

คะแนน

$ LANG=en_US
$ alias cjam='java -jar /usr/local/share/cjam/cjam-0.6.jar'
$ cjam thwart.cjam < pg100.txt > pg100.txt~
$ cjam thwart.cjam < pg100.txt~ > pg100.txt~~
$ diff -s pg100.txt pg100.txt~~
Files pg100.txt and pg100.txt~~ are identical
$ cjam thwart.cjam < Gluehwendel_brennt_durch.jpg > Gluehwendel_brennt_durch.jpg~
$ cjam thwart.cjam < Gluehwendel_brennt_durch.jpg~ > Gluehwendel_brennt_durch.jpg~~
$ diff -s Gluehwendel_brennt_durch.jpg Gluehwendel_brennt_durch.jpg~~
Files Gluehwendel_brennt_durch.jpg and Gluehwendel_brennt_durch.jpg~~ are identical
$ xz -kz5 pg100.txt~ Gluehwendel_brennt_durch.jpg~
$ wc -c thwart.cjam pg100.txt* Gluehwendel_brennt_durch.jpg*
      22 thwart.cjam
 5589889 pg100.txt
 5589889 pg100.txt~
 5589889 pg100.txt~~
 5590232 pg100.txt~.xz
 1659874 Gluehwendel_brennt_durch.jpg
 1659874 Gluehwendel_brennt_durch.jpg~
 1659874 Gluehwendel_brennt_durch.jpg~~
 1660016 Gluehwendel_brennt_durch.jpg~.xz
28999559 total

3

PHP, 117 + 0 + 0 + 0 + 0 = 117

เพราะคุณจะมอบความไว้วางใจในการทำงานกับการทำลายข้อมูลของคุณโดยไม่เป็นที่ยอมรับในภาษาอื่นหรือไม่?

<?=substr(gmp_export(gmp_invert(2*gmp_import($s=stream_get_contents(STDIN))+1,$m=2*gmp_pow(256,strlen($s)))/2+$m),1);

ในขณะที่ทุกโซลูชั่นอื่น ๆ ที่อยู่บนพื้นฐานของ“ปลอดภัย” การก่อสร้างเช่น“เครื่องกำเนิดไฟฟ้าแบบสุ่มจำนวน” หรือ“การเข้ารหัสทหารชั้น” ซึ่งเป็นหนึ่งในนี้ก็ตีความสตริงเป็นคิดเป็นเลขคี่ modulo 2⋅256 ^ ความยาวของพวกเขาและคำนวณผกผันแบบแยกส่วน

การสาธิต:

$ php thwart.php < 100.txt.utf-8 > 100.txt.utf-8~
$ php thwart.php < 100.txt.utf-8~ > 100.txt.utf-8~~
$ diff -s 100.txt.utf-8 100.txt.utf-8~~
Files 100.txt.utf-8 and 100.txt.utf-8~~ are identical
$ php thwart.php < Glühwendel_brennt_durch.jpg > Glühwendel_brennt_durch.jpg~
$ php thwart.php < Glühwendel_brennt_durch.jpg~ > Glühwendel_brennt_durch.jpg~~
$ diff -s Glühwendel_brennt_durch.jpg Glühwendel_brennt_durch.jpg~~
Files Glühwendel_brennt_durch.jpg and Glühwendel_brennt_durch.jpg~~ are identical
$ xz -kz5 100.txt.utf-8~ Glühwendel_brennt_durch.jpg~
$ wc -c *
 5589889 100.txt.utf-8
 5589889 100.txt.utf-8~
 5590232 100.txt.utf-8~.xz
 5589889 100.txt.utf-8~~
 1659874 Glühwendel_brennt_durch.jpg
 1659874 Glühwendel_brennt_durch.jpg~
 1660016 Glühwendel_brennt_durch.jpg~.xz
 1659874 Glühwendel_brennt_durch.jpg~~
     117 thwart.php
28999654 total

2

เชลล์สคริปต์, 203

id|gpg --batch --passphrase-fd 0 --personal-compress-preferences Uncompressed $1 $2

ใช้มัน

% sh break.sh -c pg100.txt                       
% sh break.sh -d pg100.txt.gpg > pg100.txt-original
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
gpg: WARNING: message was not integrity protected
% diff -s pg100.txt pg100.txt-original
Files pg100.txt and pg100.txt-original are identical
% sh break.sh -c Glühwendel_brennt_durch.jpg
% sh break.sh -d Glühwendel_brennt_durch.jpg.gpg > Glühwendel_brennt_durch.jpg-original
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
gpg: WARNING: message was not integrity protected
% diff -s Glühwendel_brennt_durch.jpg Glühwendel_brennt_durch.jpg-original
Files Glühwendel_brennt_durch.jpg and Glühwendel_brennt_durch.jpg-original are identical
% xz -kz5 Glühwendel_brennt_durch.jpg.gpg 
% xz -kz5 pg100.txt.gpg 
% ls -ln
total 28340
-rw-r--r-- 1 1000 1000      84 May 24 04:33 break.sh
-rw-r--r-- 1 1000 1000 1659874 Jan 19 17:22 Glühwendel_brennt_durch.jpg
-rw-r--r-- 1 1000 1000 1659943 May 24 04:46 Glühwendel_brennt_durch.jpg.gpg
-rw-r--r-- 1 1000 1000 1660084 May 24 04:46 Glühwendel_brennt_durch.jpg.gpg.xz
-rw-r--r-- 1 1000 1000 1659874 May 24 04:46 Glühwendel_brennt_durch.jpg-original
-rw-r--r-- 1 1000 1000 5589891 May 24 03:55 pg100.txt
-rw-r--r-- 1 1000 1000 5589941 May 24 04:43 pg100.txt.gpg
-rw-r--r-- 1 1000 1000 5590284 May 24 04:43 pg100.txt.gpg.xz
-rw-r--r-- 1 1000 1000 5589891 May 24 04:43 pg100.txt-original

ไม่สามารถพกพาได้ แต่สามารถคิดค่าใช้จ่ายเพียงไม่กี่ไบต์ ต้องใช้ PGP (การดำเนินการกับ OpenSSL ก็เป็นไปได้เช่นกัน) อาจมีการบันทึกความแตกต่าง ~ 50 ไบต์ระหว่างไฟล์ที่เข้ารหัสกับต้นฉบับ

เกณฑ์การให้คะแนน:

84 + abs (1659874 - 1659943) + สูงสุด (1659874 - 1660084, 0) + abs (5589891 - 5589941) + สูงสุด (5589891 - 5590284, 0) = 203


1

Python คะแนน = 183 + 7 + 6 + 0 + 0 = 196

การให้คะแนนทำให้คุณไม่สามารถบีบอัดไฟล์ได้อย่างสมบูรณ์เนื่องจากไฟล์บีบอัดนั้นมีขนาดใหญ่กว่าค่าใช้จ่ายในการบีบอัด ดังนั้นโปรแกรมของฉันทำให้พวกเขาน้อยกว่าที่ไม่สามารถบีบอัดได้ทั้งหมด:

import sys
from random import randint as J,seed
x=sys.stdin.read()
seed(ord(x[1]))
n=int(2362*J(1,2)**2.359)
sys.stdout.write(x[:n]+''.join(chr(ord(c)^J(0,255))for c in x[n:]))

ผลลัพธ์:

Laxori@Laxori-PC /cygdrive/f/Programming/lzkill
$ cat photo.jpg | python break.py > photo.jpg~; cat photo.jpg~ | python break.py > photo.jpg~~; diff photo.jpg photo.jpg~~; xz -kz5 photo.jpg~

Laxori@Laxori-PC /cygdrive/f/Programming/lzkill
$ cat pg100.txt | python break.py > pg100.txt~; cat pg100.txt~ | python break.py > pg100.txt~~; diff pg100.txt pg100.txt~~; xz -kz5 pg100.txt~

Laxori@Laxori-PC /cygdrive/f/Programming/lzkill
$ ls -l
total 28337
----------+ 1 Laxori mkpasswd     183 2014-05-24 13:43 break.py
----------+ 1 Laxori mkpasswd 5589891 2014-05-23 19:19 pg100.txt
-rw-r--r--+ 1 Laxori mkpasswd 5589891 2014-05-24 13:45 pg100.txt~
-rw-r--r--+ 1 Laxori mkpasswd 5589884 2014-05-24 13:45 pg100.txt~.xz
-rw-r--r--+ 1 Laxori mkpasswd 5589891 2014-05-24 13:45 pg100.txt~~
----------+ 1 Laxori mkpasswd 1659874 2014-05-23 19:19 photo.jpg
-rw-r--r--+ 1 Laxori mkpasswd 1659874 2014-05-24 13:44 photo.jpg~
-rw-r--r--+ 1 Laxori mkpasswd 1659880 2014-05-24 13:44 photo.jpg~.xz
-rw-r--r--+ 1 Laxori mkpasswd 1659874 2014-05-24 13:44 photo.jpg~~

Laxori@Laxori-PC /cygdrive/f/Programming/lzkill
$ python
Python 2.5.2 (r252:60911, Dec  2 2008, 09:26:14)
[GCC 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 183 + abs(5589891-5589884) + abs(1659874-1659880)
196

ด้วยกฎปัจจุบันไม่มีโทษสำหรับไฟล์บีบอัดที่มีขนาดใหญ่กว่า กฎมีการเปลี่ยนแปลงหรือไม่? ถ้าเป็นเช่นนั้นการเปลี่ยนแปลงดังกล่าวไม่เป็นธรรมต่อโปรแกรมนี้
kernigh

@ kernigh: ใช่พวกเขาเปลี่ยนไปหลังจากที่ฉันโพสต์ แท้จริงพวกเขาควรจะเป็นอย่างที่เป็นอยู่ตอนนี้ตั้งแต่เริ่มต้น
Claudiu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.