shredder 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.txt +27 -0
- data/lib/shredder.rb +95 -0
- metadata +70 -0
data/README.txt
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
### SYNOPSIS ###
|
2
|
+
|
3
|
+
require 'shredder'
|
4
|
+
|
5
|
+
# Shreds text.txt into test.f.1, test.f.2, test.f.3
|
6
|
+
Shredder::Files.new('test.txt', ['test.f.1','test.f.2','test.f.3'] ).shred
|
7
|
+
|
8
|
+
# Sews test.f.1, test.f.2, test.f.3 into restored.f.txt
|
9
|
+
Shredder::Files.new('restored.f.txt', ['test.f.1','test.f.2','test.f.3'] ).sew
|
10
|
+
|
11
|
+
# or #
|
12
|
+
|
13
|
+
# shred streams #
|
14
|
+
reader = File.open('test.txt','r')
|
15
|
+
writers = []; ['test.s.1','test.s.2','test.s.3'].each{|writer| writers.push(File.open(writer,'wb'))}
|
16
|
+
Shredder::Streams.new(reader,writers).shred
|
17
|
+
reader.close
|
18
|
+
writers.each{|writer| writer.close}
|
19
|
+
|
20
|
+
# sew streams
|
21
|
+
writer = File.open('restored.s.txt','wb')
|
22
|
+
readers = []; ['test.s.1','test.s.2','test.s.3'].each{|writer| readers.push(File.open(writer,'r'))}
|
23
|
+
Shredder::Streams.new(writer,readers).sew
|
24
|
+
writer.close
|
25
|
+
readers.each{|reader| reader.close}
|
26
|
+
|
27
|
+
# Also available, Shredder.shred( writer, readers) and Shredder.sew( reader, writers )
|
data/lib/shredder.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
module Shredder
|
2
|
+
VERSION = '0.0.0'
|
3
|
+
|
4
|
+
# note that these are streams
|
5
|
+
def self.shred(reader,writers,limit=0)
|
6
|
+
shreds = writers.length
|
7
|
+
xor = count = 0
|
8
|
+
while byte = reader.getbyte do
|
9
|
+
writers[ count % shreds ].putc byte^xor
|
10
|
+
xor = byte
|
11
|
+
count += 1
|
12
|
+
# note: will not break if limit is zero
|
13
|
+
break if count == limit
|
14
|
+
end
|
15
|
+
return count
|
16
|
+
end
|
17
|
+
|
18
|
+
# note that these are streams
|
19
|
+
def self.sew(writer,readers,limit=0)
|
20
|
+
shreds = readers.length
|
21
|
+
xor = count = 0
|
22
|
+
while byte = readers[ count % shreds ].getbyte do
|
23
|
+
chr = byte^xor
|
24
|
+
xor = chr
|
25
|
+
writer.putc chr
|
26
|
+
count += 1
|
27
|
+
# note: will not break if limit is zero
|
28
|
+
break if count == limit
|
29
|
+
end
|
30
|
+
return count
|
31
|
+
end
|
32
|
+
|
33
|
+
class Streams
|
34
|
+
# this one takes streams
|
35
|
+
def initialize(sew,shreds,limit=0)
|
36
|
+
@sew = sew
|
37
|
+
@shreds = shreds
|
38
|
+
@limit = limit
|
39
|
+
end
|
40
|
+
|
41
|
+
def shred(limit=@limit)
|
42
|
+
Shredder.shred(@sew,@shreds,limit)
|
43
|
+
end
|
44
|
+
|
45
|
+
def sew(limit=@limit)
|
46
|
+
Shredder.sew(@sew,@shreds,limit)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class Files
|
51
|
+
# this one takes filenames
|
52
|
+
def initialize(sew,shreds,limit=0)
|
53
|
+
@sew = sew
|
54
|
+
@shreds = shreds
|
55
|
+
@limit = limit
|
56
|
+
end
|
57
|
+
|
58
|
+
def shred(limit=@limit)
|
59
|
+
reader = File.open(@sew,'r')
|
60
|
+
writers = []
|
61
|
+
@shreds.each{|shred| writers.push( File.open(shred,'wb') ) }
|
62
|
+
|
63
|
+
count = nil
|
64
|
+
begin
|
65
|
+
count = Shredder.shred( reader, writers, limit )
|
66
|
+
rescue Exception
|
67
|
+
raise $!
|
68
|
+
ensure
|
69
|
+
writers.each{|writer| writer.close}
|
70
|
+
reader.close
|
71
|
+
end
|
72
|
+
|
73
|
+
return count
|
74
|
+
end
|
75
|
+
|
76
|
+
def sew(limit=@limit)
|
77
|
+
writer = File.open(@sew,'wb')
|
78
|
+
readers = []
|
79
|
+
@shreds.each{|shred| readers.push( File.open(shred,'r') ) }
|
80
|
+
|
81
|
+
count = nil
|
82
|
+
begin
|
83
|
+
count = Shredder.sew( writer, readers, limit )
|
84
|
+
rescue Exception
|
85
|
+
raise $!
|
86
|
+
ensure
|
87
|
+
writer.close
|
88
|
+
readers.each{|reader| reader.close}
|
89
|
+
end
|
90
|
+
|
91
|
+
return count
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: shredder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 31
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 0.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- carlosjhr64@gmail.com
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-06-12 00:00:00 Z
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: |
|
22
|
+
The idea is to disperse file shreds in separate depositories
|
23
|
+
such that no one depository has the entire file.
|
24
|
+
Note: These are not file segments, they're shreds.
|
25
|
+
|
26
|
+
email: carlosjhr64@gmail.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files: []
|
32
|
+
|
33
|
+
files:
|
34
|
+
- ./lib/shredder.rb
|
35
|
+
- ./README.txt
|
36
|
+
homepage: https://sites.google.com/site/carlosjhr64/rubygems/shredder
|
37
|
+
licenses: []
|
38
|
+
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
hash: 3
|
50
|
+
segments:
|
51
|
+
- 0
|
52
|
+
version: "0"
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 3
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
requirements: []
|
63
|
+
|
64
|
+
rubyforge_project:
|
65
|
+
rubygems_version: 1.8.4
|
66
|
+
signing_key:
|
67
|
+
specification_version: 3
|
68
|
+
summary: Shred a file into file fragments, and join fragments back into a restored file.
|
69
|
+
test_files: []
|
70
|
+
|