shift_ciphers 0.0.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f9719f1d7ca53e6f2bdfb05df4d0f43e936c572ed687e841f63052c01aa0433b
4
- data.tar.gz: bc58897ff42d8b542c03ffcc527fbfeac1c61fcc9a5074e1cc3399ab6632ea7c
3
+ metadata.gz: 13ef5b2fbf5292674972c5edcc94313197bb9ac92c1b9cd4562bf8a9a9ce4ba9
4
+ data.tar.gz: efc143672e0bd32d311ed806f8c2987c842a5db0067dbba22fc2ad7420e6a422
5
5
  SHA512:
6
- metadata.gz: 5e4876ec51d94454024e8caa69e7a2e36d0cf25890c74a2ff75288be68d0ea38aebe3d5234736db32251f6fbf72653df2bfc41ad45bbea02f86a6c4b2969e237
7
- data.tar.gz: 73bc9aed8e221b46a6186375de7b3658df0661c37494fe9c33f2bea53deb74db3f77473defb732bc056f672dfe430eba11d48f90478f1c724dbe37dc2f69733c
6
+ metadata.gz: 13b2ed0c1075700fe69956cf8ff8cd7e3d58143dca26849a42a9fa89e61ef59efcc4f96209273e806bb0ef0a82a09b6548efc2f4e4fcd0dfb7785df5cd9f9180
7
+ data.tar.gz: 0d81a6dc37f73e6bf1b929f83a6b48fd9cdf89fa9314a96ed509ded86b2cf5ceb69f4e5f6967cdf03f0e2d2088a213b4188e1528f9bfed4e53fbbe0596619904
data/README.md CHANGED
@@ -24,7 +24,7 @@ encrypted = ShiftCiphers::Vigenere.encrypt(plaintext, "my keyword") # => "W!0
24
24
  decrypted = ShiftCiphers::Vigenere.decrypt(encrypted, "my keyword") # => "Attack at dawn!"
25
25
  decrypted == plaintext # Should be true
26
26
 
27
- encrypted = ShiftCiphers::HardenedVigenere.encrypt(plaintext, "my keyword") # => "Z6tappN^Ap[o&Ns"
27
+ encrypted = ShiftCiphers::HardenedVigenere.encrypt(plaintext, "my keyword") # => " )a=\"IX;2=j_i[:"
28
28
  decrypted = ShiftCiphers::HardenedVigenere.decrypt(encrypted, "my keyword") # => "Attack at dawn!"
29
29
  decrypted == plaintext # Should be true
30
30
  ```
@@ -44,7 +44,7 @@ decrypted = vigenere.decrypt(encrypted) # => "Attack at dawn!"
44
44
  decrypted == plaintext # Should be true
45
45
 
46
46
  strong_vigenere = ShiftCiphers::HardenedVigenere.new("my keyword")
47
- encrypted = strong_vigenere.encrypt(plaintext) # => "Z6tappN^Ap[o&Ns"
47
+ encrypted = strong_vigenere.encrypt(plaintext) # => " )a=\"IX;2=j_i[:"
48
48
  decrypted = strong_vigenere.decrypt(encrypted) # => "Attack at dawn!"
49
49
  decrypted == plaintext # Should be true
50
50
  ```
@@ -1,19 +1,26 @@
1
1
  module ShiftCiphers
2
2
  class HardenedVigenere < Vigenere
3
+ attr_accessor :initial_seed
3
4
 
4
- def initialize(key, alphabet: Alphabets::DEFAULT, nonalphabet_char_strategy: :error)
5
+ def initialize(key, alphabet: Alphabets::DEFAULT, nonalphabet_char_strategy: :error, initial_seed: 0)
5
6
  validate_key(key, alphabet)
6
7
  @key = key
7
8
  @alphabet = alphabet
8
9
  @nonalphabet_char_strategy = nonalphabet_char_strategy
10
+ @initial_seed = initial_seed
9
11
  end
10
12
 
11
13
  protected
12
14
 
13
15
  def process(text, encrypting = true)
16
+ stage1 = process_single(text, text.each_char, encrypting)
17
+ process_single(stage1, stage1.each_char.reverse_each, encrypting)
18
+ end
19
+
20
+ def process_single(text, text_enumerator, encrypting = true)
14
21
  offsets_stream = create_offsets_stream
15
22
  plaintext_char = ""
16
- text.each_char.reduce("") do |result, char|
23
+ text_enumerator.reduce("") do |result, char|
17
24
  char_idx = alphabet.index(char)
18
25
  if !char_idx.nil?
19
26
  rel_offset = offsets_stream.next(plaintext_char) * (encrypting ? 1 : -1)
@@ -31,15 +38,15 @@ module ShiftCiphers
31
38
  end
32
39
 
33
40
  def create_offsets_stream
34
- RandomOffsetsStream.new(key, alphabet.size - 1)
41
+ RandomOffsetsStream.new(key, alphabet.size - 1, @initial_seed)
35
42
  end
36
43
 
37
44
 
38
45
  class RandomOffsetsStream
39
- SEEDING_RAND_MAX = 2**32-1
46
+ SEEDING_RAND_MAX = 2**31-1
40
47
 
41
- def initialize(key, max)
42
- @random = key.bytes.reduce(Random.new(0)) do |random, byte|
48
+ def initialize(key, max, initial_seed)
49
+ @random = key.bytes.reduce(Random.new(initial_seed)) do |random, byte|
43
50
  Random.new(random.rand(SEEDING_RAND_MAX) ^ byte)
44
51
  end
45
52
  @max = max
@@ -1,8 +1,8 @@
1
1
  module ShiftCiphers
2
2
  module Version
3
- MAJOR = 0
3
+ MAJOR = 1
4
4
  MINOR = 0
5
- PATCH = 3
5
+ PATCH = 0
6
6
  LABEL = nil
7
7
  end
8
8
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shift_ciphers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomasz Więch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-15 00:00:00.000000000 Z
11
+ date: 2018-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler