ciphers 0.1.0 → 0.2.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
  SHA1:
3
- metadata.gz: 7e36bf3e83fae5fbae6343c0dc17ab9bc0438bb1
4
- data.tar.gz: 868bf3e3bb6581a752c68330f138cf65fc3df547
3
+ metadata.gz: 78798fc9ac89c2c90a9a8c2a475fb5166547eaf6
4
+ data.tar.gz: 2700a2447d77e52df94ac4abc02c306812398e6f
5
5
  SHA512:
6
- metadata.gz: 3ccccddcb51caff8fe6ad9684ed2b7e8d2aa141b4838f3b6c4d83b864aac8469ea68c636684dc16da9a08e044220da6355fb5c5411887410aed8a34d6aabc6c6
7
- data.tar.gz: 7f3d7114024abd0cc0542c192a11d116033d2949861a62e7a27316dddecf8a64ceac02a7e6f80c92cb512d460652f43842a47c68572b337cd811282f3d637c07
6
+ metadata.gz: 2e4e3c619be9e125b3bcb5a09a93632adcdf67f1c46f47f38a5226e4ceea2e5c9e85445653287434bcd362936b5c770c07c70c0991eb131df84018d4ae30ab0b
7
+ data.tar.gz: 618b5dc0975b2e480ee331a2c44ae25b5128c5eb408f202495d9f19d871d8569b0112243fb056b14cd8cc8f65b64eb1e84422c6a84d1de8d6ff0df37ce979bef
data/README.md CHANGED
@@ -1,13 +1,16 @@
1
1
  # Ciphers
2
2
 
3
3
  This gem implements simple cryptographic ciphers. As of now, it can only do
4
- Vigenère ciphers, but more are coming as I have the time and inclination.
4
+ Vigenère and Autokey ciphers, but more are coming as I have the time and inclination.
5
5
  Because this mostly exists for my own purposes (the fun of programming it and
6
6
  CTFs), I am not currently accepting PRs for new features or ciphers. Feel free
7
7
  to fork away, though, and if you have any suggestions for what I should
8
8
  implement next, I'd love to hear them! This especially applies if the
9
9
  recommendation comes with a fun puzzle that implementing it will solve!
10
10
 
11
+ I generally feel free to break the API on minor revisions prior to a 1.0. After
12
+ that, I follow semantic versioning.
13
+
11
14
  ## Contributing
12
15
 
13
16
  Bug reports and feature/cipher requests are welcome
data/lib/ciphers.rb CHANGED
@@ -1,6 +1,18 @@
1
1
  require "ciphers/version"
2
2
  require "ciphers/vigenere"
3
-
3
+ require "ciphers/autokey"
4
4
 
5
5
  module Ciphers
6
+ LATIN = ('A'..'Z').to_a
7
+
8
+ def self.alphabet_from(string)
9
+ raise ArgumentError.new("Argument must be at most #{LATIN.length} characters long") unless string.length <= 26
10
+ chars = string.upcase.chars
11
+ raise ArgumentError.new("Argument must not contain duplicate letters") unless chars.uniq == chars
12
+ if chars.length < 26
13
+ chars + (LATIN - chars)
14
+ else
15
+ chars
16
+ end
17
+ end
6
18
  end
@@ -0,0 +1,40 @@
1
+ module Ciphers
2
+ class Autokey
3
+ def initialize(alphabet: Ciphers::LATIN, key: )
4
+ alphabet = alphabet.chars if alphabet.is_a? String
5
+ @alphabet = alphabet.to_a.freeze
6
+ @key = key.upcase.freeze
7
+ end
8
+
9
+ def encrypt(string)
10
+ string.each_char.with_index.with_object('') do |(char, i), ret|
11
+ ret << char and next unless alphabet.include?(char)
12
+ key_char = "#{key}#{string}"[i]
13
+ row = table.fetch key_char
14
+ col = alphabet.index(char)
15
+ ret << row[col]
16
+ end
17
+ end
18
+
19
+ def decrypt(string)
20
+ string.each_char.with_index.with_object('') do |(char, i), ret|
21
+ ret << char and next unless alphabet.include?(char)
22
+ key_char = "#{key}#{ret}"[i]
23
+ row = table.fetch key_char
24
+ col = row.index(char)
25
+ ret << alphabet[col]
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :alphabet, :key
32
+
33
+ def table
34
+ @table = {}.tap do |hash|
35
+ alphabet.each_with_index {|char, i| hash[char] = alphabet.rotate(i) }
36
+ end
37
+ end
38
+ end
39
+
40
+ end
@@ -1,3 +1,3 @@
1
1
  module Ciphers
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,18 +1,5 @@
1
1
  module Ciphers
2
- LATIN = ('A'..'Z').to_a
3
-
4
2
  class Vigenere
5
- def self.alphabet_from(string)
6
- raise ArgumentError.new("Argument must be at most #{LATIN.length} characters long") unless string.length <= 26
7
- chars = string.upcase.chars
8
- raise ArgumentError.new("Argument must not contain duplicate letters") unless chars.uniq == chars
9
- if chars.length < 26
10
- chars + (LATIN - chars)
11
- else
12
- chars
13
- end
14
- end
15
-
16
3
  def initialize(alphabet: Ciphers::LATIN, key: )
17
4
  alphabet = alphabet.chars if alphabet.is_a? String
18
5
  @alphabet = alphabet.to_a.freeze
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ciphers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Forrest Fleming
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-07-18 00:00:00.000000000 Z
11
+ date: 2016-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -83,6 +83,7 @@ files:
83
83
  - bin/setup
84
84
  - ciphers.gemspec
85
85
  - lib/ciphers.rb
86
+ - lib/ciphers/autokey.rb
86
87
  - lib/ciphers/version.rb
87
88
  - lib/ciphers/vigenere.rb
88
89
  homepage: https://github.com/ffleming/ciphers