shredder 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
|