0.0
No release in over a year
A lightweight library for encoding and decoding strings using various patterns.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies
 Project Readme

StringThing

StringThing is a lightweight library for encoding and decoding strings using various patterns.

Installation

StringThing has no external dependencies, so it can be installed from source or directly from rubygems:

gem install "string_thing"

or via Gemfile:

gem "string_thing"

Usage

StringThing provides an API for encoding and decoding strings. To use it, import the StringThing class and create a new instance with an array of patterns in the order you want to use them:

require 'string_thing'

myString = 'This is my string'

# Create a new instance of StringThing with default pattern (['split-halves', 'reverse', 'shift', 'swap-case', 'rotate'])
myStringThing = StringThing.new

# Encode the string
encoded = myStringThing.encode(myString)

# Output the encoded string
puts encoded # "ZN!TJ!TJIuHOJSUT!"

# Decode the string
decoded = myStringThing.decode(encoded)

# Output the decoded string
puts decoded # "This is my string"

Patterns

StringThing patterns currently support the following operations:

  • split-halves: Splits the string into two halves and swaps them.
    • Abcd12 => d12Abc
  • reverse: Reverses the order of the characters in the string.
    • Abcd12 => 21dcbA
  • shift: Shifts the characters in the string up by 1 in the ASCII table.
    • Abcd12 => Bcde23
  • swap-case: Swaps uppercase & lowercase characters in the string.
    • Abcd12 => aBCD12
  • rotate: Shifts the string 1 position to the right.
    • Abcd12 => 2Abcd1

To use a specific pattern, pass it as an argument to the StringThing constructor:

require 'string_thing'

myStringThing1 = StringThing.new(['split-halves', 'shift', 'reverse', 'shift', 'swap-case', 'rotate'])

# OR

stringThingPattern = ['split-halves', 'shift', 'reverse', 'shift', 'swap-case', 'rotate']
myStringThing2 = StringThing.new(stringThingPattern)

Example: Encoding Passwords for Secure Storage

StringThing can be used to encode passwords before hashing them and storing them in a database, making it more difficult for an attacker to retrieve the original password even if they gain access to the database.

Here's an example of how to use StringThing to encode a password before hashing it with bcrypt when working with passwords in a database:

Create User:

require 'bcrypt'
require 'string_thing'

stringThingPattern = ['split-halves', 'shift', 'reverse', 'shift', 'swap-case', 'rotate']

# Generate a salt for the bcrypt hash
salt = BCrypt::Engine.generate_salt

# The original password to be encoded and hashed
password = 'myPassword123'

# Encode the password using StringThing
encodedPassword = StringThing.new(stringThingPattern).encode(password)

# Hash the encoded password with bcrypt
hashedPassword = BCrypt::Engine.hash_secret(encodedPassword, salt, cost: 12)

# Add the hashed password to a user object for storage in a database
user = {
  'username' => 'johndoe',
  'email' => 'johndoe@example.com',
  'password' => hashedPassword,
  'salt' => salt,
  # other user data...
}

# Add the user object to the database
myDatabase.addUser(user)

Authenticate User:

require 'bcrypt'
require 'string_thing'

stringThingPattern = ['split-halves', 'shift', 'reverse', 'shift', 'swap-case', 'rotate']

# Retrieve the user's hashed password and salt from the database
user = myDatabase.getUserByUsername('johndoe')
hashedPassword = user.password
salt = user.salt

# The password entered by the user attempting to log in
passwordAttempt = 'myPassword123'

# Encode the password attempt using StringThing
encodedPasswordAttempt = StringThing.new(stringThingPattern).encode(passwordAttempt)

# Hash the encoded password attempt with bcrypt
hashedPasswordAttempt = BCrypt::Engine.hash_secret(encodedPasswordAttempt, salt, cost: 12)

# Compare the hashed password attempt to the stored hashed password
if (hashedPasswordAttempt == hashedPassword)
  # Passwords match - login successful!
else
  # Passwords do not match - login failed
end