shift_ciphers 0.0.3 → 1.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.
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