Compare commits
3 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6cd76be94d | ||
|
|
e10bedee0f | ||
|
|
0b26d83313 |
6 changed files with 87 additions and 112 deletions
|
|
@ -7,11 +7,11 @@ class EncodeImage
|
||||||
@@utils = nil
|
@@utils = nil
|
||||||
|
|
||||||
|
|
||||||
def initialize(p, m, i)
|
def initialize(p, m, uri)
|
||||||
@@password = p
|
@@password = p
|
||||||
@@message = m
|
@@message = m
|
||||||
|
|
||||||
@@utils = ImageUtils.new(@@password, @@message, i)
|
@@utils = ImageUtils.new(@@password, @@message, uri)
|
||||||
|
|
||||||
@@table = @@utils.generateLookupTable
|
@@table = @@utils.generateLookupTable
|
||||||
end
|
end
|
||||||
|
|
@ -32,46 +32,4 @@ class EncodeImage
|
||||||
|
|
||||||
@@utils.getImage.saveImage
|
@@utils.getImage.saveImage
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# Need to properly sever this at some point...
|
|
||||||
|
|
||||||
def decode
|
|
||||||
puts "Hacked in decode..."
|
|
||||||
s = @@utils.getImage.getSize
|
|
||||||
|
|
||||||
msg_bits = 0
|
|
||||||
|
|
||||||
@@table.reverse.each do |loc|
|
|
||||||
pixel = @@utils.getImage.getPixel(loc[:x], loc[:y])
|
|
||||||
msg_bits = (msg_bits << 6) | pixel.decodeBits
|
|
||||||
end
|
|
||||||
|
|
||||||
#this trash needs to move somewhere...
|
|
||||||
puts "Try to convert the message..."
|
|
||||||
len = msg_bits & 0xffff
|
|
||||||
msg_bits = msg_bits >> 16
|
|
||||||
|
|
||||||
# check the padding bits....
|
|
||||||
if (msg_bits & 255) != 0 then
|
|
||||||
puts "Padding failed scrutiny! "
|
|
||||||
puts msg_bits.to_s(2)
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
msg_bits = msg_bits >> 8
|
|
||||||
|
|
||||||
puts "Padding passed scrutiny..."
|
|
||||||
msg_chars = []
|
|
||||||
|
|
||||||
while msg_bits > 0 do
|
|
||||||
byte = msg_bits & 0xff
|
|
||||||
msg_chars.push(byte.chr)
|
|
||||||
msg_bits = msg_bits >> 8
|
|
||||||
end
|
|
||||||
|
|
||||||
msg = msg_chars.reverse.join
|
|
||||||
|
|
||||||
return msg
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
119
image_utils.rb
119
image_utils.rb
|
|
@ -1,99 +1,116 @@
|
||||||
require "./pixel_image.rb"
|
require "rmagick"
|
||||||
require "digest"
|
require "digest"
|
||||||
|
|
||||||
class ImageUtils
|
class ImageUtils
|
||||||
@@magickImg = nil
|
@@magickImg = nil
|
||||||
@@pixelImg = nil
|
|
||||||
|
|
||||||
@@password = ""
|
@@password = ""
|
||||||
@@message = ""
|
@@message = ""
|
||||||
|
@@salt = 0
|
||||||
|
|
||||||
|
@@imagickImg = nil
|
||||||
|
|
||||||
|
@@width = 0
|
||||||
|
@@height = 0
|
||||||
|
|
||||||
|
@@pixel_arr = nil
|
||||||
|
|
||||||
@@hash = nil
|
@@hash = nil
|
||||||
|
|
||||||
def initialize(pass, msg, i)
|
@@rng = nil
|
||||||
|
|
||||||
|
def initialize(pass, msg, uri)
|
||||||
@@password = pass
|
@@password = pass
|
||||||
@@message = msg
|
@@message = msg
|
||||||
|
@@salt = 0
|
||||||
|
|
||||||
if msg.length > 1024 then
|
@@magickImg = Magick::Image.read(uri).first
|
||||||
puts "Maximum length exceeded. Exiting."
|
|
||||||
exit
|
@@width = @@magickImg.columns
|
||||||
|
@@height = @@magickImg.rows
|
||||||
|
|
||||||
|
@@pixel_arr = @@magickImg.get_pixels(0, 0, @@width, @@height)
|
||||||
|
|
||||||
|
@@hash = self.generateHash
|
||||||
|
|
||||||
|
# convert hex string into an int to store for making the lookup table
|
||||||
|
@@rng = Random.new(@@hash.to_i(16))
|
||||||
|
|
||||||
|
puts self.getLookupTable.inspect
|
||||||
end
|
end
|
||||||
|
|
||||||
@@magickImg = i
|
def getPixel(x, y)
|
||||||
|
loc = (y*@@width) + x
|
||||||
|
|
||||||
@@pixelImg = PixelImage.new(@@magickImg)
|
return @@pixel_arr[loc]
|
||||||
|
|
||||||
self.generateHash
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def getImage
|
def getSalt
|
||||||
return @@pixelImg
|
for x in 0..@@width-1
|
||||||
|
for y in 0..@@height-1
|
||||||
|
pix = self.getPixel(x, y)
|
||||||
|
|
||||||
|
@@salt = @@salt + (pix.red/512)
|
||||||
|
@@salt = @@salt + (pix.green/512)
|
||||||
|
@@salt = @@salt + (pix.blue/512)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
h = Digest::SHA512.hexdigest(@@salt.to_s(16))
|
||||||
|
|
||||||
|
return h
|
||||||
end
|
end
|
||||||
|
|
||||||
def generateHash
|
def generateHash
|
||||||
h = Digest::SHA512.hexdigest(@@password)
|
pass_h = Digest::SHA512.hexdigest(@@password)
|
||||||
s = @@pixelImg.getSalt
|
|
||||||
|
|
||||||
@@hash = Digest::SHA512.hexdigest(self.interlaceHash(h, s))
|
return Digest::SHA512.hexdigest(pass_h + @@salt.to_s)
|
||||||
end
|
end
|
||||||
|
|
||||||
def interlaceHash(h1, h2)
|
def getBits(o)
|
||||||
puts h1
|
msg_bytes = o.unpack("c*")
|
||||||
puts h2
|
|
||||||
|
|
||||||
h1 = self.getBits(h1)
|
msg_bits = 0
|
||||||
h2 = self.getBits(h2)
|
|
||||||
|
|
||||||
interlaced = 0
|
for b in msg_bytes
|
||||||
|
msg_bits = (msg_bits << 8) | b
|
||||||
while h1.to_i > 0 and h2.to_i > 0 do
|
|
||||||
interlaced = (interlaced << 1) | (h1 & 1)
|
|
||||||
h1 = h1 >> 1
|
|
||||||
interlaced = (interlaced << 1) | (h2 & 1)
|
|
||||||
h2 = h2 >> 1
|
|
||||||
|
|
||||||
# puts interlaced
|
|
||||||
# puts h1
|
|
||||||
# puts h2
|
|
||||||
end
|
end
|
||||||
|
|
||||||
puts interlaced.to_s.inspect
|
return msg_bits
|
||||||
|
|
||||||
return interlaced.to_s
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def generateLookupTable
|
def getLookupTable
|
||||||
tbl = []
|
tbl = []
|
||||||
|
|
||||||
hash_bits = @@pixelImg.getBits(@@hash)
|
# track hash classes. if too many occur during the interval, abaondon
|
||||||
msg_bits = @@pixelImg.getBits(@@message)
|
# encoding.
|
||||||
|
clashes = 0
|
||||||
|
clash_limit = 100
|
||||||
|
|
||||||
# gross, but pad in the 24 bits that will become the msg length
|
msg_bits = self.getBits(@@message)
|
||||||
# and padding bits...
|
|
||||||
msg_bits = msg_bits << 24
|
|
||||||
|
|
||||||
while msg_bits > 0 do
|
while msg_bits > 0 do
|
||||||
loc = nil
|
loc = nil
|
||||||
|
|
||||||
loop do
|
loop do
|
||||||
x = (hash_bits.to_i % @@pixelImg.getSize[:width])
|
x = @@rng.rand(0..@@width)
|
||||||
y = (hash_bits.to_i % @@pixelImg.getSize[:height])
|
y = @@rng.rand(0..@@height)
|
||||||
|
|
||||||
loc = {"x": x, "y": y}
|
loc = {"x": x, "y": y}
|
||||||
|
if !tbl.include?(loc) then
|
||||||
|
clashes = 0
|
||||||
|
else
|
||||||
|
clashes = clashes + 1
|
||||||
|
end
|
||||||
|
|
||||||
break if !tbl.include?(loc)
|
if clashes < clash_limit then
|
||||||
hash_bits = hash_bits >> 1
|
break
|
||||||
|
else
|
||||||
if hash_bits <= 0 then
|
puts "wow clashed so much sorry for breaking"
|
||||||
puts
|
|
||||||
puts "wow too much data"
|
|
||||||
puts "leftover bits: " + msg_bits.to_s(36)
|
|
||||||
exit
|
exit
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
hash_bits = hash_bits >> 1
|
|
||||||
|
|
||||||
tbl.push(loc)
|
tbl.push(loc)
|
||||||
|
|
||||||
msg_bits = msg_bits >> 6
|
msg_bits = msg_bits >> 6
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 1 MiB After Width: | Height: | Size: 1 MiB |
|
Before Width: | Height: | Size: 2.7 MiB After Width: | Height: | Size: 2.7 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 237 KiB |
22
runner.rb
22
runner.rb
|
|
@ -1,13 +1,10 @@
|
||||||
require "rmagick"
|
|
||||||
|
|
||||||
require "./image_utils.rb"
|
require "./image_utils.rb"
|
||||||
require "./encode_image.rb"
|
require "./encode_image.rb"
|
||||||
|
|
||||||
img = Magick::ImageList.new "./images/original/arty.png"
|
|
||||||
|
|
||||||
#srand(12345)
|
#srand(12345)
|
||||||
|
|
||||||
pass = "my_password"
|
pass = "my_password"
|
||||||
|
|
||||||
message = "This is the message that I would like to save please " +
|
message = "This is the message that I would like to save please " +
|
||||||
"and thank you also I love you? AND apostrophe's, and " +
|
"and thank you also I love you? AND apostrophe's, and " +
|
||||||
"also some commas somewhere hiding around here, It's " +
|
"also some commas somewhere hiding around here, It's " +
|
||||||
|
|
@ -24,17 +21,21 @@ message = "This is the message that I would like to save please " +
|
||||||
"are going even further. further than anyone believed " +
|
"are going even further. further than anyone believed " +
|
||||||
"`~!@\#\{$%^&*()-_=+\][}{';:'}]} Wooow. 123456789!1234" +
|
"`~!@\#\{$%^&*()-_=+\][}{';:'}]} Wooow. 123456789!1234" +
|
||||||
"56789! so put 15 more??????400!"
|
"56789! so put 15 more??????400!"
|
||||||
#message = "tests"
|
|
||||||
|
|
||||||
puts message.length
|
puts message.length
|
||||||
puts message
|
puts message
|
||||||
puts
|
puts
|
||||||
|
|
||||||
puts "Initializing EncodeImage..."
|
|
||||||
|
|
||||||
start = Time.new.to_f
|
start = Time.new.to_f
|
||||||
|
|
||||||
em = EncodeImage.new(pass, message, img)
|
puts "Initializing EncodeImage..."
|
||||||
|
|
||||||
|
iu = ImageUtils.new(pass, message, "./images/original/arty.png")
|
||||||
|
|
||||||
|
puts "Took " + (Time.new.to_f - start).to_s + " seconds to encode... 🐱"
|
||||||
|
|
||||||
|
=begin
|
||||||
|
em = EncodeImage.new(pass, message, "./images/original/arty.png")
|
||||||
|
|
||||||
puts em.encode
|
puts em.encode
|
||||||
puts "Took " + (Time.new.to_f - start).to_s + " seconds to encode... 🐱"
|
puts "Took " + (Time.new.to_f - start).to_s + " seconds to encode... 🐱"
|
||||||
|
|
@ -46,13 +47,12 @@ result = em.decode
|
||||||
|
|
||||||
puts result
|
puts result
|
||||||
|
|
||||||
|
=end
|
||||||
|
|
||||||
puts "Took " + (Time.new.to_f - start).to_s + " seconds to decode... 🐱"
|
puts "Took " + (Time.new.to_f - start).to_s + " seconds to decode... 🐱"
|
||||||
|
|
||||||
if message == result then
|
if message == result then
|
||||||
puts "WOW THEY MATCH! 🐱🐱🐱🐱🐱🐱🐱🐱"
|
puts "WOW THEY MATCH! 🐱🐱🐱🐱🐱🐱🐱🐱"
|
||||||
end
|
end
|
||||||
|
|
||||||
exit
|
|
||||||
puts
|
|
||||||
|
|
||||||
puts "Done!"
|
puts "Done!"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue