mirror of
https://github.com/cedricbonhomme/Stegano.git
synced 2025-05-12 17:18:30 +02:00
Added Lorem Ipsum. New steganalysis technique and a new test image.
This commit is contained in:
parent
3449484350
commit
15e25eec2b
6 changed files with 247 additions and 125 deletions
119
LSB.py
119
LSB.py
|
@ -1,119 +0,0 @@
|
||||||
#! /usr/local/bin/python
|
|
||||||
#-*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
__author__ = "Cedric Bonhomme"
|
|
||||||
__version__ = "$Revision: 0.1 $"
|
|
||||||
__date__ = "$Date: 2010/10/01 $"
|
|
||||||
|
|
||||||
import tools
|
|
||||||
|
|
||||||
from PIL import Image
|
|
||||||
|
|
||||||
def hide(img, message):
|
|
||||||
"""
|
|
||||||
Hide a message (string) in an image with the
|
|
||||||
LSB (Least Significant Bit) technique.
|
|
||||||
"""
|
|
||||||
encoded = img.copy()
|
|
||||||
width, height = img.size
|
|
||||||
index = 0
|
|
||||||
|
|
||||||
message = message + '~~~'
|
|
||||||
message_bits = tools.a2bits(message)
|
|
||||||
|
|
||||||
npixels = width * height
|
|
||||||
if len(message_bits) > npixels * 3:
|
|
||||||
return """Too long message (%s > %s).""" % (len(message_bits), npixels * 3)
|
|
||||||
|
|
||||||
for row in range(height):
|
|
||||||
for col in range(width):
|
|
||||||
|
|
||||||
if index + 3 <= len(message_bits) :
|
|
||||||
|
|
||||||
# Get the colour component.
|
|
||||||
(r, g, b) = img.getpixel((col, row))
|
|
||||||
|
|
||||||
# Change the Least Significant Bit of each colour component.
|
|
||||||
r = tools.setlsb(r, message_bits[index])
|
|
||||||
g = tools.setlsb(g, message_bits[index+1])
|
|
||||||
b = tools.setlsb(b, message_bits[index+2])
|
|
||||||
|
|
||||||
# Save the new pixel
|
|
||||||
encoded.putpixel((col, row), (r, g , b))
|
|
||||||
|
|
||||||
index += 3
|
|
||||||
|
|
||||||
return encoded
|
|
||||||
|
|
||||||
def reveal(img):
|
|
||||||
"""
|
|
||||||
Find a message in an image
|
|
||||||
(with the LSB technique).
|
|
||||||
"""
|
|
||||||
width, height = img.size
|
|
||||||
bits = ""
|
|
||||||
index = 0
|
|
||||||
for row in range(height):
|
|
||||||
for col in range(width):
|
|
||||||
r, g, b = img.getpixel((col, row))
|
|
||||||
|
|
||||||
bits += tools.bs(r)[-1] + tools.bs(g)[-1] + tools.bs(b)[-1]
|
|
||||||
|
|
||||||
if int(bits[-8:], 2) == 126:
|
|
||||||
# chr(126) = '~ '
|
|
||||||
list_of_string_bits = ["".join(list(bits[i:(i+8)])) for i in range(0, len(bits)-8, 8)]
|
|
||||||
|
|
||||||
list_of_character = [chr(int(elem, 2)) for elem in list_of_string_bits]
|
|
||||||
return "".join(list_of_character)
|
|
||||||
return ""
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
# Point of entry in execution mode
|
|
||||||
original_image_file = "./pictures/2010-08-04T15:42:06.png"
|
|
||||||
encoded_image_file = "./pictures/2010-08-04T15:42:06_enc.png"
|
|
||||||
secret_message = "Avec la technique LSB (Least Significant Bit) l'oeil humain (un normal ;-)) ne voit plus la difference"
|
|
||||||
Lorem_ipsum = """\
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
||||||
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
|
||||||
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
||||||
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
|
||||||
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
||||||
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
|
||||||
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
||||||
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
|
||||||
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
||||||
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
|
||||||
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
||||||
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
|
||||||
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
||||||
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
|
||||||
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
||||||
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
||||||
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
|
||||||
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
|
||||||
"""
|
|
||||||
|
|
||||||
img1 = Image.open(original_image_file)
|
|
||||||
img_encoded = hide(img1, Lorem_ipsum)
|
|
||||||
|
|
||||||
if img_encoded:
|
|
||||||
# Save it
|
|
||||||
img_encoded.save(encoded_image_file)
|
|
||||||
# Test it
|
|
||||||
img2 = Image.open(encoded_image_file)
|
|
||||||
print reveal(img2)
|
|
99
lorem_ipsum.txt
Normal file
99
lorem_ipsum.txt
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam placerat fermentum lorem, at porttitor metus congue eu. Mauris vitae tellus et quam venenatis mollis. Ut et eleifend magna. Cras eu arcu mi. Aliquam commodo iaculis imperdiet. Nulla vel eros bibendum lectus vestibulum tristique in vel lorem. Fusce sed adipiscing diam. Sed aliquet mauris at eros scelerisque id volutpat dui elementum. Cras sit amet mauris sit amet metus consectetur pretium nec sit amet dolor. Praesent eget turpis et leo tincidunt elementum vitae eget purus. Vestibulum sit amet arcu lectus. Sed ac feugiat nisl. Curabitur feugiat tristique nibh, pretium suscipit felis vulputate id. Nullam et dui libero. Aenean egestas, urna vitae iaculis sodales, lectus dolor interdum sapien, vel commodo purus nibh in nunc. Aenean bibendum nibh tortor, sit amet tempus ante. Pellentesque pulvinar nisl sit amet nisi consectetur quis commodo nibh sagittis. Duis sit amet sem enim, quis mattis dui. Aenean sagittis, eros id laoreet venenatis, felis diam ultrices turpis, a dignissim nulla metus ut eros. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
|
||||||
|
|
||||||
|
Maecenas quam tellus, fermentum id iaculis eu, condimentum sit amet est. Donec iaculis, risus ut sollicitudin vehicula, ligula erat laoreet tellus, congue interdum turpis ligula tincidunt mauris. Phasellus mollis molestie dui eget lacinia. Pellentesque ac nunc nisi, vestibulum rhoncus libero. Vestibulum elementum quam blandit dui adipiscing nec vulputate justo posuere. Morbi et mi vitae ligula placerat venenatis. In vitae libero in massa tempus elementum commodo vel augue. Integer arcu magna, dignissim facilisis tempus non, tincidunt quis lacus. Maecenas ullamcorper vulputate pellentesque. Sed venenatis tincidunt volutpat. Sed nec dolor ut velit lobortis dapibus feugiat at sem. Morbi nec orci eu ipsum pulvinar scelerisque vitae eu ante.
|
||||||
|
|
||||||
|
Nullam pharetra laoreet tincidunt. In tempus ornare nibh eget adipiscing. Vestibulum turpis justo, scelerisque eu aliquam a, cursus sed turpis. Donec sed leo nec dui cursus commodo quis ac nisl. In rhoncus tempor magna, a rhoncus tellus tincidunt a. Aliquam rhoncus ante nec velit dignissim pellentesque. Maecenas pellentesque sollicitudin lobortis. Etiam ac cursus justo. Vivamus tristique lobortis mi. Nunc dignissim, dolor ut mollis ullamcorper, sapien augue mattis erat, quis placerat magna arcu eu dolor. Phasellus dapibus venenatis risus, non sollicitudin quam commodo non.
|
||||||
|
|
||||||
|
Phasellus nec nisi nunc. Nullam vestibulum ullamcorper dolor non convallis. Maecenas consequat molestie lobortis. Praesent scelerisque, nulla et iaculis vestibulum, mi nibh consequat risus, quis ullamcorper enim massa id tellus. Sed dignissim quam tempor tortor scelerisque fermentum. Pellentesque et fermentum tellus. Pellentesque hendrerit imperdiet mi id dapibus. Phasellus et lacus ligula, at feugiat augue. Maecenas euismod lobortis tellus ut scelerisque. Duis non ipsum eu tortor hendrerit molestie ac at est. Pellentesque in eros ligula. In commodo placerat pulvinar.
|
||||||
|
|
||||||
|
Sed justo arcu, ornare et pharetra eget, tempus ac eros. Proin eu metus accumsan nibh varius feugiat. Aliquam aliquam dictum mattis. Nullam hendrerit rutrum gravida. Sed mauris sem, eleifend a hendrerit eu, vulputate vel tortor. Morbi nibh ipsum, mattis id sagittis id, lacinia aliquam felis. Nam at velit quis sem ullamcorper sodales. Ut ultrices mollis vulputate. Suspendisse nunc ligula, ultricies sit amet rutrum vel, volutpat a magna. Donec et nunc leo. Fusce gravida adipiscing erat, sed consequat augue placerat ut.
|
||||||
|
|
||||||
|
Aliquam at felis magna. Nulla ac tincidunt justo. Nunc nulla nulla, eleifend ut viverra sit amet, fermentum ac leo. Phasellus pellentesque sollicitudin nibh, ac elementum ligula eleifend in. Donec quis justo tellus. Suspendisse sed leo nibh. Vivamus blandit pharetra venenatis. Quisque auctor elementum augue vel elementum. Phasellus placerat dapibus ultrices. Donec nec massa eget nulla placerat lobortis vestibulum vitae tellus. Aenean id ligula orci. Suspendisse aliquet, orci in pharetra dictum, quam ipsum venenatis enim, a vehicula mi dolor nec metus. Fusce eu ligula justo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis metus dui, ullamcorper in lobortis et, venenatis ut diam. Cras vel hendrerit metus.
|
||||||
|
|
||||||
|
Suspendisse non augue dolor. Mauris sed libero id justo fermentum cursus ac sit amet nunc. Nulla pellentesque ante quis sapien tempor ornare. Vestibulum suscipit, lorem sed vulputate laoreet, nisl felis venenatis magna, et dignissim nulla neque eget metus. Vivamus varius, ligula sed cursus vehicula, lorem dui convallis lacus, quis pellentesque erat elit eu justo. Maecenas tempus odio ut nibh scelerisque aliquam mollis magna pretium. Morbi accumsan placerat velit in egestas. Mauris posuere risus quis lorem condimentum rhoncus. Phasellus suscipit, tortor id feugiat aliquam, nisi ipsum pretium dolor, et laoreet orci diam a dolor. Aliquam erat volutpat. Pellentesque ornare enim vitae ligula tempor sit amet tempor dui aliquam. Aenean auctor nibh id nisi faucibus placerat. Vivamus velit urna, semper in vulputate id, condimentum vitae nulla.
|
||||||
|
|
||||||
|
Etiam quis porta urna. Praesent ut sagittis mauris. In quis tellus a nisi molestie lobortis. Donec cursus, turpis ut bibendum congue, ligula sem rhoncus purus, ac volutpat nibh quam et purus. Maecenas tempus consequat convallis. Proin auctor posuere nunc ac pulvinar. Pellentesque sollicitudin dolor non nunc auctor dapibus. Suspendisse dictum metus et justo molestie hendrerit. Aenean sed fermentum lacus. Nulla neque sem, fringilla sit amet viverra et, commodo quis urna. Nullam id sem ut nisi feugiat aliquet. Sed urna erat, sagittis at consequat id, tincidunt eu libero.
|
||||||
|
|
||||||
|
Quisque quis erat risus. Sed id ipsum nibh. Donec euismod vulputate fermentum. Maecenas id lorem ut neque dignissim vestibulum sed id nunc. Nullam facilisis, neque id pharetra mattis, odio felis lobortis velit, id pretium dolor dui ut libero. Ut posuere, eros ac iaculis lacinia, mi velit commodo tellus, vitae suscipit arcu ipsum quis lectus. Vivamus eget turpis enim. Aliquam erat volutpat. Mauris auctor scelerisque orci ut aliquam. Nunc tortor sem, accumsan quis feugiat sit amet, tincidunt quis ante. Sed dapibus tempor neque nec consequat. In placerat consequat velit ac pulvinar. Sed luctus, ligula iaculis pretium porta, diam tortor iaculis dui, in aliquet neque nunc vitae diam. Fusce mollis urna vehicula nibh vehicula non convallis magna dapibus. Morbi quis felis velit, in ultrices urna. Sed commodo ultrices magna, et ultricies quam euismod sit amet.
|
||||||
|
|
||||||
|
Nullam venenatis commodo nibh et scelerisque. Mauris mauris magna, ultricies ut tempor convallis, eleifend vel odio. Aenean rutrum, nisi et cursus rutrum, justo sem condimentum arcu, at rutrum libero odio a elit. Integer sem eros, consectetur eget venenatis vitae, viverra vel tortor. Donec libero tellus, ultrices fringilla rutrum sit amet, rutrum at neque. Nunc nibh sapien, elementum eu pellentesque id, vestibulum eu tellus. Nulla facilisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nulla vestibulum, dolor in blandit sagittis, diam nibh mattis mi, sit amet tincidunt lorem odio ac augue. Vestibulum neque leo, sagittis sit amet scelerisque in, feugiat quis lorem. Maecenas at tortor arcu, id euismod metus. Fusce sit amet neque ante. Nam vitae ante et tortor commodo ultricies non eu nisi. Etiam rhoncus, dui ut eleifend fringilla, neque ipsum vehicula tortor, ac pretium turpis lorem eget massa. Curabitur placerat tincidunt mi, at elementum dui dignissim vitae. Sed eu tellus ac nulla vulputate malesuada. Sed a neque in libero accumsan sagittis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In tincidunt odio sed nulla viverra imperdiet. Duis suscipit velit sit amet neque convallis vel auctor enim venenatis.
|
||||||
|
|
||||||
|
Mauris non dictum nulla. Duis sit amet neque nunc, sed tempus orci. Ut laoreet ullamcorper purus et pretium. Duis sed molestie ligula. Quisque et augue augue. Donec nec laoreet eros. In sed orci a nisl tempus venenatis. Maecenas ac risus tellus. Donec consequat consectetur libero, ut tristique lectus pulvinar sit amet. Praesent molestie lacus ut sem sodales laoreet. Pellentesque id lectus eu lorem dictum commodo in vel libero.
|
||||||
|
|
||||||
|
Etiam iaculis, mauris a tempor bibendum, augue nisi sollicitudin turpis, sit amet laoreet ipsum elit at enim. Ut mauris turpis, placerat in sodales nec, ullamcorper ut risus. Maecenas lorem nulla, posuere quis malesuada sit amet, pretium at ante. Vestibulum viverra vestibulum commodo. Curabitur nec enim turpis. Nunc blandit semper lacus, sed facilisis mauris hendrerit ac. Donec id imperdiet risus. Fusce dignissim iaculis mi non adipiscing. Quisque feugiat euismod ipsum, in viverra est volutpat nec. Mauris auctor hendrerit pretium. Etiam condimentum pulvinar quam, eget fringilla nisi iaculis sit amet. Phasellus tristique dignissim vestibulum. Curabitur fringilla massa quis lectus commodo sollicitudin. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin tristique turpis sed magna faucibus ullamcorper commodo metus feugiat. Vestibulum elementum elit sed nunc imperdiet quis gravida felis lacinia.
|
||||||
|
|
||||||
|
Sed rutrum tristique ipsum, eu adipiscing leo aliquet tincidunt. Sed pretium malesuada posuere. Proin consequat, nisl ut sollicitudin scelerisque, lectus odio varius orci, at porttitor sem dolor at lectus. Quisque lobortis laoreet nisi eget varius. Nam ut nibh tincidunt tortor placerat consectetur non vel odio. Sed vitae nulla nibh. Ut pretium malesuada ipsum, at molestie sapien tempus ac. Maecenas imperdiet pharetra leo, nec feugiat turpis lacinia non. Duis vitae felis mauris. Nunc tempus turpis et eros dapibus vitae tempor nulla ultricies. Phasellus nunc nisl, sagittis sit amet interdum sed, luctus eget neque.
|
||||||
|
|
||||||
|
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris risus urna, fringilla sed porta nec, dictum eu mauris. Ut eget sagittis magna. Duis rhoncus sem id sem aliquam quis commodo nunc luctus. Mauris tincidunt metus at turpis bibendum quis molestie orci imperdiet. Curabitur gravida sapien lobortis ante elementum vel suscipit diam aliquet. Ut auctor, risus iaculis tristique fringilla, nunc leo viverra felis, imperdiet sodales quam nulla sit amet metus. Vestibulum gravida porttitor massa, vitae tincidunt sapien adipiscing non. Donec lacinia, arcu at accumsan ornare, ipsum orci volutpat ligula, id gravida sem felis imperdiet tellus. Ut mollis massa et nunc tempus ac tristique lorem vulputate. Aenean et leo id tellus dapibus porttitor in vel mauris. Etiam quis dolor at tellus mollis sagittis facilisis non turpis. Integer vel diam in lorem fringilla iaculis et a erat. Donec non nisi augue, hendrerit ultrices quam.
|
||||||
|
|
||||||
|
Aliquam luctus consectetur nulla, sit amet euismod est venenatis id. Quisque at dui purus. Quisque magna ligula, laoreet vitae ultricies vel, viverra quis nulla. Cras sollicitudin velit interdum dolor rhoncus pulvinar. Curabitur ac odio velit. Proin aliquet posuere magna vitae placerat. Mauris in porta magna. Duis est mi, porta eget faucibus a, facilisis non risus. Morbi venenatis tincidunt massa non consectetur. Aliquam mattis urna ac odio convallis elementum. Mauris nisi mauris, varius at cursus nec, imperdiet lobortis ante. Mauris vestibulum viverra adipiscing. Maecenas posuere pellentesque nibh, a dignissim purus pulvinar vel. Duis turpis lectus, condimentum nec consequat quis, tempus at lectus.
|
||||||
|
|
||||||
|
Quisque cursus nisi vel arcu egestas ut condimentum nisl imperdiet. Integer molestie, risus sed congue rhoncus, diam nibh dictum diam, sit amet gravida sapien lectus vel augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum quis massa velit, at blandit massa. Duis in risus id nunc condimentum cursus. Nulla facilisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer egestas nibh eget nisl aliquet porttitor. Duis pharetra consectetur odio pulvinar aliquam. Duis sit amet justo mauris. Nullam nec arcu in enim luctus ornare. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed vel sapien id tellus euismod imperdiet. Morbi vel enim sed neque consectetur gravida. Vestibulum vel turpis sit amet sem varius faucibus. Proin mauris turpis, mollis sed viverra ut, semper volutpat tortor. In mattis ligula in enim lobortis eget tempor diam dictum. Mauris ullamcorper diam in dui ullamcorper id auctor enim pharetra. Donec congue, nibh non lobortis pretium, tellus urna porttitor nunc, nec molestie est ligula nec enim.
|
||||||
|
|
||||||
|
Donec mattis congue metus, quis pellentesque ante fermentum sit amet. Vestibulum eget diam vel neque rhoncus consequat vel in arcu. Donec vehicula libero a ligula feugiat fermentum. Donec molestie pretium mi at sollicitudin. Integer viverra magna nec risus egestas at cursus diam ultrices. Quisque et metus tristique magna feugiat porttitor eget vitae ante. Suspendisse quis odio risus, ut pharetra mauris. Integer vitae dui elit, ac blandit nulla. Pellentesque purus odio, tristique id venenatis rutrum, blandit nec libero. Phasellus egestas dui sit amet lectus vehicula convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
|
||||||
|
|
||||||
|
Aenean quis convallis mi. Sed nec eros ante, non varius neque. Etiam sed urna vel dolor mattis pretium sit amet at ipsum. Vivamus egestas tellus id augue dapibus venenatis. Vivamus ornare aliquam enim in varius. Phasellus ut dolor justo. Morbi dignissim facilisis ipsum vel fringilla. Integer ut ligula nisl. Nulla placerat lobortis vestibulum. Duis vitae sem erat. Etiam ac orci at lacus dignissim elementum non tristique arcu. Curabitur vel varius nunc. Maecenas non tellus enim. Nunc pellentesque ullamcorper nibh eget eleifend. Duis sit amet erat ut nunc placerat placerat. Donec vel ultricies eros. Sed placerat justo non est congue in sodales dui laoreet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur faucibus urna sed ligula iaculis consectetur.
|
||||||
|
|
||||||
|
Duis nulla eros, tincidunt sed volutpat a, luctus iaculis tellus. Cras nec ante a mauris eleifend consequat. Duis ac dignissim ipsum. Donec elit urna, ultrices ut fringilla ut, gravida in ligula. Aenean porttitor rhoncus vehicula. Maecenas lectus enim, pellentesque vel semper sed, sodales id ligula. Integer laoreet ornare velit, id tincidunt metus varius a. Quisque rutrum sapien vel mauris commodo quis mattis mi hendrerit. In at metus ipsum, sed sollicitudin augue. Aenean vitae ante eget magna porta bibendum eget id lacus. Aenean tempus placerat sapien, ac molestie ante dapibus id. Morbi dui orci, vulputate sit amet dignissim quis, tincidunt et nunc. Curabitur tellus leo, rutrum in vulputate congue, laoreet non neque. Donec urna tortor, aliquam id varius vel, scelerisque nec diam. Ut laoreet varius fringilla. Sed placerat augue ac erat fermentum sodales. Donec id ante quis diam fermentum pellentesque.
|
||||||
|
|
||||||
|
Maecenas eget nisi metus. Fusce semper, neque vitae tristique porttitor, est erat faucibus neque, sed mattis dolor ipsum vitae enim. Donec ultrices erat eget nunc semper sodales. Donec aliquet volutpat mi sed varius. Donec velit elit, posuere ac accumsan vitae, convallis sed velit. Mauris in ipsum arcu, non facilisis diam. Nullam et ipsum dolor, lacinia iaculis libero. Sed congue mi vitae leo imperdiet a elementum purus vulputate. Donec tristique feugiat consectetur. Suspendisse accumsan felis tellus. Pellentesque non nisl nisl. Nam ac tortor nec lectus vehicula luctus. Pellentesque dignissim suscipit nulla, quis elementum arcu egestas vel. Nullam nisl odio, mattis nec iaculis vitae, venenatis in felis. Nunc gravida aliquet ante, et vulputate mauris mollis id. Morbi dignissim orci eu lacus porta lacinia. Vivamus venenatis odio malesuada sapien auctor ultricies. Nunc at est pharetra est dictum facilisis. Mauris pharetra neque at ipsum sollicitudin eget ultrices ante cursus. Phasellus felis est, commodo sit amet pellentesque ac, lacinia eget diam.
|
||||||
|
|
||||||
|
Curabitur ante libero, ornare ut lacinia eu, molestie non velit. Vestibulum augue dui, sollicitudin et sagittis varius, adipiscing non enim. Donec vitae magna lectus. Vivamus ullamcorper libero in mauris pharetra bibendum. Proin porttitor, nisl nec congue interdum, ante ante hendrerit velit, non lobortis erat turpis in est. Ut arcu risus, laoreet sed fringilla a, sodales sit amet ipsum. Nullam posuere dui quis erat pretium auctor. Phasellus porttitor lacus sit amet neque blandit quis rutrum massa sagittis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur dui elit, blandit sed viverra quis, commodo pretium quam. Nam tortor turpis, tincidunt sit amet tempus sit amet, fringilla in augue. Vestibulum nulla dolor, varius vitae feugiat quis, sollicitudin id magna. Sed volutpat, massa in bibendum facilisis, quam sapien euismod magna, ac scelerisque ante est nec velit.
|
||||||
|
|
||||||
|
Curabitur vel tortor erat. Morbi vehicula vehicula nibh, fringilla rutrum orci congue in. Proin rhoncus augue eget nisi lobortis sed pharetra arcu bibendum. Maecenas vulputate, mauris eu euismod iaculis, libero diam porta purus, ac congue tellus diam eu leo. Aliquam ut porttitor leo. Etiam porta enim vel magna placerat nec pulvinar tellus venenatis. Nullam et blandit nulla. Integer eleifend mattis augue id egestas. Sed sed diam posuere enim volutpat faucibus. Vivamus molestie accumsan tellus, eu gravida enim congue eget. Aenean feugiat consequat turpis convallis fermentum. Sed eleifend libero sit amet tortor pretium sed congue ligula egestas. Fusce commodo, urna in vehicula fermentum, ligula justo molestie sem, vitae posuere leo lorem vel nisl. Quisque tortor purus, ornare nec luctus a, posuere in lectus. Etiam eget semper enim. Vivamus convallis metus et purus congue a tempor sapien semper. Praesent enim quam, accumsan ut rutrum ut, viverra a dolor. Pellentesque hendrerit, mauris sed ullamcorper laoreet, odio nisi sagittis nisi, nec pulvinar nibh orci quis ipsum.
|
||||||
|
|
||||||
|
Aenean cursus fermentum sapien sed faucibus. Sed molestie metus in ante molestie pharetra. Pellentesque et mattis magna. Aenean arcu erat, porttitor in interdum a, tincidunt vitae ante. Aliquam dolor mi, suscipit aliquet suscipit dignissim, elementum quis mauris. Sed nisl lectus, eleifend ut condimentum blandit, iaculis ac enim. Suspendisse accumsan iaculis feugiat. Donec luctus cursus turpis ut interdum. In ac hendrerit eros. Mauris augue nunc, ullamcorper a hendrerit a, scelerisque nec dui. Donec rhoncus bibendum metus, quis viverra ligula vehicula non. Aenean nibh quam, tempus et accumsan ac, dignissim eget lorem. Curabitur cursus justo ac turpis consequat varius. Curabitur dictum pretium nulla, vitae feugiat mauris accumsan eu.
|
||||||
|
|
||||||
|
Donec orci nibh, tincidunt quis elementum ut, aliquam sit amet lacus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum orci dolor, porttitor sit amet congue non, ultrices eu mauris. Duis sagittis lectus nisl, sit amet lacinia odio. Suspendisse lacinia mattis elit, et dignissim tortor mollis eu. Fusce risus est, ullamcorper nec imperdiet et, vehicula ut leo. Pellentesque orci lacus, mollis quis vulputate non, vehicula quis lorem. Morbi leo eros, facilisis vitae condimentum sed, facilisis non neque. Donec in sapien dolor, ut elementum dui. Nunc a orci ipsum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum commodo, nisl ut tempus tempus, nisi nibh vulputate enim, at vulputate dolor lacus sit amet nisi. Vivamus urna nulla, rutrum vel ornare vel, tristique eu ante.
|
||||||
|
|
||||||
|
Nulla semper luctus purus ut semper. Ut tempus imperdiet nibh, vitae accumsan lorem euismod at. In dictum pharetra semper. Quisque neque nulla, malesuada a placerat ullamcorper, accumsan a libero. Nullam felis purus, tristique in luctus quis, ullamcorper ac odio. Curabitur mattis, purus nec rhoncus interdum, neque diam vehicula orci, vitae tempus tellus dolor sit amet nibh. Cras at diam sit amet dui lacinia pharetra. Suspendisse ut mauris justo, at ultrices mi. Curabitur in arcu arcu, sed eleifend odio. Maecenas volutpat placerat odio, at tempus nibh ornare vel. Aliquam ultricies felis vel lacus facilisis luctus. Praesent vel viverra risus. Phasellus rhoncus dui eu arcu fringilla porttitor. Ut et fermentum ipsum. Cras at tortor ut eros consectetur malesuada. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Phasellus odio metus, lacinia nec lobortis non, elementum et nibh. Curabitur nec felis id mauris tincidunt porta. Duis tincidunt est vel nisi rutrum sodales. Proin non eros vitae sapien sagittis commodo eget nec turpis.
|
||||||
|
|
||||||
|
Nunc fringilla commodo quam, ac blandit mauris mollis sed. Vivamus sit amet ipsum erat. Maecenas vehicula massa at urna ullamcorper semper. Ut vitae lorem quis augue pretium tempor. Etiam tristique ligula non orci molestie ac fermentum sapien tempor. Morbi gravida hendrerit ipsum eu viverra. Aliquam vel elementum augue. Nunc ultrices venenatis neque non fermentum. Duis arcu mi, aliquet accumsan vestibulum id, egestas eget leo. Pellentesque nulla odio, dignissim ac ultrices vel, euismod eget dolor. Suspendisse potenti. Mauris sed tellus sit amet nibh sagittis lobortis. Vivamus porttitor libero a magna ullamcorper nec varius sem vulputate. Maecenas pharetra urna non nunc rutrum molestie. Sed pellentesque egestas posuere.
|
||||||
|
|
||||||
|
Phasellus sed odio sem, vitae placerat nibh. Ut dignissim adipiscing turpis eget euismod. Donec pulvinar lectus in est euismod ultricies. Maecenas eu lacinia massa. Pellentesque at arcu eget risus dapibus pulvinar. Pellentesque nulla justo, consectetur vel faucibus sit amet, aliquet nec lacus. Duis quis tincidunt tortor. Nulla id justo orci, auctor facilisis purus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras nulla tortor, tincidunt ac egestas non, adipiscing quis arcu. Cras lobortis dolor quis risus luctus ut euismod purus lacinia. Duis elementum nulla sit amet purus dictum malesuada. Morbi iaculis aliquam laoreet. Ut a tortor ac elit ornare lacinia. Proin congue volutpat malesuada.
|
||||||
|
|
||||||
|
Cras facilisis lectus eget quam rhoncus tincidunt. Curabitur in turpis vitae diam posuere ullamcorper eget sed ante. Donec consectetur tristique volutpat. Nullam fringilla elementum pellentesque. Vivamus dignissim sodales urna, ac porta massa dictum in. Nunc ut neque ut lacus facilisis vehicula. In eget mi in metus blandit tempor vel in justo. Donec tincidunt est risus, sit amet rhoncus est. Aliquam ultricies suscipit tempor. Mauris vitae tortor dui. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque in ante enim. Sed ultrices hendrerit risus, ut faucibus nisl lacinia et.
|
||||||
|
|
||||||
|
Ut sit amet velit sed ipsum tristique venenatis. Nunc ac turpis justo, ac blandit ligula. Nullam ultrices, sem non suscipit laoreet, lectus tellus ultricies neque, vitae interdum ante purus sit amet mi. Integer ut suscipit diam. Nunc mauris turpis, vulputate eu porta nec, sodales non lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent fermentum dignissim lectus quis consectetur. Maecenas at dui sapien. Aliquam vel lorem in mauris fermentum tempor eu nec urna. Vestibulum vitae augue eget diam pharetra ullamcorper. Etiam vulputate, est eget tempor fringilla, risus justo sodales ante, at malesuada dui tortor vitae ligula. Aliquam sed magna sed lorem pellentesque gravida at vitae eros. Pellentesque ornare ornare nibh vel luctus.
|
||||||
|
|
||||||
|
Curabitur sit amet eros diam, non posuere urna. Proin sapien enim, euismod nec vestibulum ac, ullamcorper a purus. Vivamus imperdiet tortor ac nunc feugiat a accumsan quam placerat. Maecenas vitae odio facilisis elit volutpat viverra. Nam dapibus arcu ac nunc ultrices tincidunt. Proin quis turpis quam, quis lacinia purus. Donec posuere leo non urna fermentum posuere. Aliquam a nibh eu diam ullamcorper placerat ac quis magna. Sed ornare vestibulum condimentum. Integer pellentesque auctor risus vehicula porttitor.
|
||||||
|
|
||||||
|
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed porttitor sagittis nisl, quis dignissim diam fringilla a. Curabitur facilisis leo nec sapien porttitor mollis. Donec vel erat risus, non fringilla turpis. Nulla a consequat neque. Etiam ac pulvinar mi. Quisque id lectus augue, eu malesuada est. Nunc non dolor sit amet nunc egestas semper vitae aliquam mauris. Nullam sed neque tortor, posuere placerat mauris. Duis a enim lacus. Sed molestie libero sit amet quam vestibulum auctor. Duis consectetur fermentum ligula, eu ullamcorper elit faucibus nec. In lacus ipsum, pulvinar et mattis et, faucibus vel tellus. In eu quam eu nisi auctor aliquam a ut felis.
|
||||||
|
|
||||||
|
Donec euismod, orci quis faucibus mattis, nisi metus porttitor nisl, vel convallis neque ligula quis augue. Maecenas quam ipsum, fringilla vel varius id, gravida sed orci. Curabitur ac libero lacus. Nulla vel orci vehicula nulla vestibulum rutrum. Phasellus viverra, urna vitae molestie vehicula, nisi leo fringilla mauris, non laoreet nibh nisi eu arcu. Pellentesque vehicula, dui in blandit suscipit, dui felis rhoncus eros, id molestie nibh ligula dignissim arcu. Aliquam congue, sem eu tristique rhoncus, justo erat mollis diam, hendrerit ullamcorper nulla erat ut risus. Etiam magna lorem, facilisis nec auctor et, ullamcorper ut turpis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum porta vestibulum lacinia. Phasellus pellentesque libero quam, quis pellentesque risus. In purus metus, cursus et vestibulum ac, aliquet et mi. Pellentesque tincidunt est a ligula tempor porttitor.
|
||||||
|
|
||||||
|
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam scelerisque ornare tortor. Phasellus elit velit, feugiat in mollis non, pulvinar in magna. Quisque eget augue est, eu facilisis magna. Proin et nunc vitae dolor cursus mollis vel ut magna. Integer interdum sem non urna pulvinar ut fringilla elit posuere. Etiam accumsan tempor eros sit amet auctor. Proin dictum, turpis in euismod hendrerit, tortor tortor volutpat ante, eu pulvinar turpis libero non leo. Aliquam gravida, quam eget bibendum dictum, enim ante lobortis nulla, a sodales leo metus ac erat. Integer eu nunc nulla. Sed accumsan porta turpis, ut volutpat libero bibendum sit amet. Aenean vestibulum ante nec est pharetra pulvinar. Vestibulum non magna enim, quis ultrices lectus.
|
||||||
|
|
||||||
|
Donec tempus adipiscing nunc, quis consequat velit varius a. Suspendisse potenti. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec est nulla, eleifend sit amet egestas egestas, fringilla sit amet leo. Nulla facilisi. Integer purus nisl, accumsan vel condimentum id, pharetra non mi. Praesent orci ligula, luctus ut mollis vel, luctus vel sapien. Vivamus lacinia commodo elit a tempor. Nam sit amet leo ipsum, vel egestas ipsum. Suspendisse potenti. In hac habitasse platea dictumst. Quisque adipiscing nisi at nibh porttitor bibendum. Cras ut egestas odio. Maecenas blandit laoreet mi, vitae fermentum quam imperdiet eget.
|
||||||
|
|
||||||
|
Vestibulum faucibus, tortor sit amet eleifend gravida, velit leo mollis neque, in mattis felis nisl eget justo. Nulla varius aliquam commodo. Nulla ante sapien, pharetra eget condimentum hendrerit, sodales eu magna. Pellentesque elementum suscipit metus, id vestibulum odio adipiscing id. Phasellus sed ligula in dui tempor luctus. Donec dictum lorem id magna vestibulum mattis. Mauris metus magna, molestie vel molestie id, dapibus non ipsum. Mauris scelerisque varius erat et laoreet. Integer ac ultrices tortor. Nulla at justo metus, ac vehicula mi. Suspendisse lorem nisl, ornare id scelerisque ac, ullamcorper dignissim mauris. Nullam eget quam est. Integer et erat porttitor leo luctus sollicitudin nec in diam. Maecenas in turpis risus, eu sagittis nisl. Etiam vitae rhoncus metus. Proin blandit euismod elementum. Pellentesque id augue ac arcu hendrerit feugiat. Praesent at magna massa, ac dignissim dolor.
|
||||||
|
|
||||||
|
Proin porttitor consectetur leo, in dictum ante lobortis quis. Fusce nec nibh tellus. Quisque vitae nisi lorem, sed convallis dolor. Praesent ligula mauris, vehicula nec mollis quis, vulputate non purus. Integer gravida leo velit. Nulla dui nunc, sollicitudin at auctor vel, tempus laoreet ante. Duis et urna turpis. Etiam leo felis, scelerisque eu fermentum vitae, tempor ac dolor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum quam odio, aliquet ut eleifend at, elementum nec nibh. Etiam felis est, varius vel venenatis ac, fermentum nec tellus. Donec nulla arcu, molestie id tristique eget, interdum a libero. Pellentesque pretium fermentum mi nec egestas. Donec vehicula turpis at lectus volutpat a feugiat urna dictum. Fusce leo lorem, iaculis a consequat molestie, luctus ut est.
|
||||||
|
|
||||||
|
Nunc vel pellentesque tellus. Nunc tempor scelerisque ligula. Donec commodo ante non nibh dictum nec blandit nisi dignissim. Suspendisse viverra dapibus dui sed aliquet. Suspendisse iaculis lacus non dui euismod mollis. Pellentesque accumsan, nibh quis egestas fringilla, neque quam blandit nisl, quis porta nulla ligula quis lectus. Praesent et eros quis enim sagittis semper sit amet et ligula. Ut quis tortor arcu. Nunc et euismod est. Donec laoreet placerat iaculis.
|
||||||
|
|
||||||
|
Etiam consectetur augue ut nulla luctus mollis. Proin sodales vulputate magna eu suscipit. Ut neque leo, mattis id volutpat et, facilisis ut urna. Aenean sed rutrum sem. Maecenas ac malesuada nulla. Duis dui justo, ornare id ultrices et, fringilla in sapien. Mauris faucibus eros in purus convallis quis iaculis est auctor. Curabitur vestibulum venenatis porta. Suspendisse potenti. Nam euismod lacus eu elit congue eu elementum turpis malesuada. Nullam viverra, justo vel pharetra lobortis, sapien urna fringilla lorem, a congue velit nisi ac sem. Donec gravida ante non enim egestas in ullamcorper tortor volutpat. Nulla porta fermentum enim, et gravida quam venenatis non. Aliquam ac velit lorem, sed congue enim. Quisque dictum felis eget sem ullamcorper ultricies. Sed ante ante, porta in tincidunt ut, malesuada vel nunc.
|
||||||
|
|
||||||
|
Etiam et ligula ac erat eleifend ornare non sit amet turpis. Etiam pretium tellus in magna rhoncus et convallis mauris tempus. Praesent posuere commodo velit, ac blandit quam tincidunt quis. Sed ac nunc elit. Aenean mattis diam eget arcu eleifend sed tincidunt massa auctor. Curabitur sapien tellus, lacinia ut lacinia eget, venenatis at sapien. Suspendisse ornare rhoncus metus, in congue neque cursus non. Etiam blandit congue ligula, et posuere lacus condimentum a. Proin volutpat mi dui. Phasellus euismod volutpat sem vel fringilla. In feugiat, mauris viverra congue pharetra, mauris tortor semper lacus, in posuere odio justo tempus risus. Donec vel ante quis ipsum iaculis dictum a eget ligula. Duis odio diam, iaculis eget sollicitudin sit amet, consequat nec nunc. Fusce erat orci, facilisis eget tempor ut, tempus at nibh.
|
||||||
|
|
||||||
|
Phasellus sit amet purus nisl. Nullam sed quam in neque rutrum fermentum. Sed sed lorem sed est interdum egestas. Maecenas ac magna non sem semper convallis. Nulla quam purus, sagittis eu congue ut, egestas nec sapien. Aliquam erat volutpat. Phasellus at nulla justo. Fusce eget mi non ipsum viverra tempus. Cras bibendum ipsum tempor ligula posuere facilisis. Vivamus eros eros, rutrum vitae tincidunt a, vulputate aliquam lectus. Pellentesque tempus justo eu felis accumsan a viverra magna pretium. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin vel sem nisl. Mauris eget leo eget lectus fringilla facilisis. Nunc dictum, mi sed viverra viverra, mauris lacus faucibus magna, sit amet tincidunt ligula diam sit amet arcu. Pellentesque at est magna, ut tincidunt est. Nulla mauris leo, aliquet a sodales ut, tempor pretium quam. Sed justo ipsum, condimentum quis mollis et, adipiscing vitae eros. Praesent in quam ligula, non commodo libero.
|
||||||
|
|
||||||
|
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras dignissim malesuada lacus nec gravida. Fusce adipiscing nisi sit amet massa auctor nec faucibus lectus egestas. Duis lobortis placerat porta. Cras non turpis lorem. Nulla quis magna vitae massa viverra fringilla. Donec placerat metus eu arcu laoreet non sodales augue scelerisque. Donec volutpat dui eget lectus bibendum volutpat. Suspendisse sagittis diam id nunc euismod eu sodales elit tincidunt. Vestibulum gravida felis nec arcu tempus volutpat. Mauris convallis augue et nunc lobortis porta. Praesent ipsum purus, posuere aliquet malesuada suscipit, fermentum a nisi.
|
||||||
|
|
||||||
|
Sed ligula felis, congue non lacinia eu, adipiscing quis neque. Sed congue tristique ultrices. Suspendisse blandit sodales urna quis varius. Mauris vel placerat velit. Ut venenatis venenatis venenatis. Morbi velit metus, hendrerit vitae consectetur vel, egestas vitae purus. Proin viverra consectetur turpis, vitae tempor dolor porta suscipit. In lacinia elementum magna, quis feugiat leo consectetur eu. Duis eget pharetra erat. Praesent fringilla, risus at hendrerit iaculis, tellus dui consequat nisi, id aliquet nisi odio vel libero. Fusce vel enim felis. Aenean mollis tincidunt lorem, sed interdum turpis varius quis. Suspendisse volutpat pharetra lectus, id lacinia erat gravida et.
|
||||||
|
|
||||||
|
Aenean in elit ut felis molestie hendrerit quis in dolor. Phasellus tempor nibh non justo molestie ac convallis sem malesuada. Etiam eu lorem dolor, vitae ornare justo. Vestibulum vestibulum accumsan lectus non ultricies. Nunc et dui mauris, nec vehicula lacus. Integer vulputate, est et sodales egestas, purus libero molestie lorem, eu rutrum sapien ante ut metus. Phasellus in pretium turpis. Quisque ac elit at sem sagittis hendrerit vel porta libero. Vestibulum semper egestas quam a luctus. Fusce feugiat porttitor aliquam. Etiam ac sem sed libero suscipit dapibus nec tempus velit. Nullam scelerisque ornare magna, et venenatis risus posuere quis. Mauris interdum interdum velit, at tempor nulla ultrices ac. Phasellus convallis lectus vitae mi blandit euismod.
|
||||||
|
|
||||||
|
Phasellus sed turpis ut massa gravida sollicitudin non non eros. Maecenas porttitor justo quis nisl luctus posuere in semper lectus. Fusce et neque nulla. Nam egestas, metus sed rutrum fringilla, tellus justo consequat metus, lobortis varius mi augue dignissim urna. Vestibulum nec elementum nunc. Sed sed risus et metus fermentum aliquam. Nullam non massa non sem fringilla accumsan. Duis ac felis sapien, ut venenatis nulla. Vestibulum bibendum nunc et orci viverra fringilla mattis mauris fermentum. Nulla aliquet pharetra dui, non hendrerit nunc laoreet ut. Pellentesque in mauris id quam aliquet pretium. Duis tempus nisl nec quam venenatis tristique. Donec cursus consequat tincidunt. Nunc at elit vel nisi varius tincidunt nec in sapien. Aenean at elementum dolor. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
|
||||||
|
Vestibulum a lorem elit. Morbi molestie, urna sed iaculis pellentesque, orci libero ornare urna, vitae dignissim est eros convallis libero. Suspendisse at mi et turpis sagittis rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam ligula arcu, elementum a interdum sed, auctor sodales quam. Proin metus ante, rutrum non fermentum vel, dignissim sed turpis. Morbi leo dui, malesuada sodales faucibus ultricies, tempor sed nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lacus metus, posuere nec scelerisque sit amet, dapibus ut erat. Curabitur quis nunc sed mi euismod imperdiet blandit id purus. Sed sed nisl nibh. Aliquam eu neque et sapien malesuada accumsan id a erat. Integer faucibus nibh nisl. Etiam magna massa, semper at imperdiet non, pellentesque sed turpis. Mauris feugiat, mi id cursus blandit, quam neque lacinia nulla, feugiat ultricies lorem tortor sed sapien. Praesent ultrices consectetur porta.
|
||||||
|
|
||||||
|
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam erat volutpat. Ut dui ante, euismod a vehicula id, hendrerit a justo. Aenean dictum nisi et diam condimentum in malesuada nunc gravida. In interdum ipsum odio. Ut aliquam arcu varius dolor ornare molestie. Donec vel commodo quam. Etiam lobortis consectetur ligula eget pulvinar. Integer semper pharetra est, eget lobortis nisi tristique mollis. Vivamus fermentum risus vitae ligula pretium tempor. Vestibulum laoreet magna ut lectus imperdiet molestie. Cras quam dolor, sodales nec iaculis vitae, pellentesque a nunc. Maecenas laoreet, eros quis euismod venenatis, sem orci imperdiet diam, nec auctor massa lorem at tortor. Nullam consequat justo in tortor elementum luctus. Aliquam erat volutpat. Fusce mollis libero eu tellus aliquet interdum. Vestibulum in odio lacus. Vestibulum mauris elit, dignissim eget mollis non, sagittis vitae ante.
|
||||||
|
|
||||||
|
In nec diam lectus, et scelerisque orci. Nullam tincidunt dictum enim. Suspendisse fermentum nunc vel enim elementum nec tincidunt quam rhoncus. Duis non est a mi tristique mollis luctus a ante. Mauris eu quam eu purus ornare iaculis in at lorem. Nullam ut dignissim enim. Proin vestibulum felis sed nulla euismod vitae hendrerit ligula tincidunt. Fusce vehicula, diam dapibus scelerisque elementum, purus dolor consequat elit, vitae consectetur ante nisi sit amet sapien. Sed non velit magna, rutrum lacinia orci. Nullam laoreet est nec justo egestas rutrum.
|
||||||
|
|
||||||
|
Nunc vel sapien nec ligula mattis suscipit. Morbi augue leo, elementum eu ornare id, rhoncus nec libero. Sed risus ante, feugiat nec interdum et, euismod et est. Pellentesque a eros elit. Etiam sagittis luctus lacus. Proin porttitor accumsan erat, vitae convallis orci tempor eu. Praesent nec sodales urna. Phasellus lacinia, justo sed vestibulum venenatis, eros sem porttitor odio, vitae consectetur lectus ante ac diam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum egestas, nibh ut commodo pretium, ante nisi bibendum nibh, eget consectetur nisl felis non est. Nam dolor purus, dapibus in facilisis a, ultrices eget leo. Phasellus luctus, felis ornare tempor iaculis, orci velit mattis tellus, in suscipit augue massa id diam. Nunc a tincidunt quam. Nullam ac libero vel quam luctus scelerisque. Phasellus magna arcu, pretium id sodales sed, porttitor at ligula. Phasellus quis augue diam, vitae cursus nulla.
|
||||||
|
|
||||||
|
Sed interdum erat ut ligula tempor sollicitudin sed eget tortor. Mauris vehicula, arcu sed aliquam tristique, ligula tortor aliquet dolor, quis ornare lectus enim nec risus. Integer a ipsum mauris. Cras non tellus ac mauris aliquam euismod. In vestibulum, eros non dictum bibendum, nibh arcu mollis massa, nec fringilla dolor ante vitae est. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur semper venenatis risus, eu commodo nunc posuere in. Curabitur ultricies, sem et vehicula posuere, leo ligula cursus nunc, ac malesuada ipsum risus ultrices felis. Aenean a felis felis, quis luctus ligula. Morbi sit amet nulla mi. Aenean nec consectetur ipsum. Curabitur ac ligula nec turpis aliquam bibendum. Integer vulputate mauris sit amet elit auctor et mattis lorem lobortis. Nullam gravida imperdiet lacus, tincidunt vehicula nibh hendrerit eget. Sed lacinia, nibh convallis adipiscing consequat, leo ipsum consectetur felis, non euismod nisi odio id justo. Mauris posuere iaculis nunc, vitae bibendum massa mollis id.
|
||||||
|
|
||||||
|
Sed enim felis, eleifend et volutpat vitae, congue nec lectus. Pellentesque lectus risus, egestas vitae eleifend vel, aliquam quis odio. Nullam eget nunc a mauris aliquet luctus eget a augue. In hendrerit elit feugiat sapien vestibulum eu lobortis metus luctus. Mauris eget elit enim. Sed ut nulla eu nisi vehicula dapibus. Donec et justo leo. Vestibulum ac mi sem. Vestibulum vel sem id ipsum lobortis varius. Sed blandit ornare aliquam. In hac habitasse platea dictumst. Curabitur tempor velit vitae erat dignissim at ullamcorper elit accumsan. Vestibulum in risus vel magna blandit interdum eu et lectus. Suspendisse varius neque sed ligula rutrum commodo. Etiam sed placerat lectus.
|
87
lsb-s.py
Executable file
87
lsb-s.py
Executable file
|
@ -0,0 +1,87 @@
|
||||||
|
#! /usr/local/bin/python
|
||||||
|
#-*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
__author__ = "Cedric Bonhomme"
|
||||||
|
__version__ = "$Revision: 0.1 $"
|
||||||
|
__date__ = "$Date: 2010/10/01 $"
|
||||||
|
|
||||||
|
import tools
|
||||||
|
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
def hide(img, message):
|
||||||
|
"""
|
||||||
|
Hide a message (string) in an image with the
|
||||||
|
LSB (Least Significant Bit) technique.
|
||||||
|
"""
|
||||||
|
encoded = img.copy()
|
||||||
|
width, height = img.size
|
||||||
|
index = 0
|
||||||
|
|
||||||
|
message = message + '~~~'
|
||||||
|
message_bits = tools.a2bits(message)
|
||||||
|
|
||||||
|
npixels = width * height
|
||||||
|
if len(message_bits) > npixels * 3:
|
||||||
|
return """Too long message (%s > %s).""" % (len(message_bits), npixels * 3)
|
||||||
|
|
||||||
|
for row in range(height):
|
||||||
|
for col in range(width):
|
||||||
|
|
||||||
|
if index + 3 <= len(message_bits) :
|
||||||
|
|
||||||
|
# Get the colour component.
|
||||||
|
(r, g, b) = img.getpixel((col, row))
|
||||||
|
|
||||||
|
# Change the Least Significant Bit of each colour component.
|
||||||
|
r = tools.setlsb(r, message_bits[index])
|
||||||
|
g = tools.setlsb(g, message_bits[index+1])
|
||||||
|
b = tools.setlsb(b, message_bits[index+2])
|
||||||
|
|
||||||
|
# Save the new pixel
|
||||||
|
encoded.putpixel((col, row), (r, g , b))
|
||||||
|
|
||||||
|
index += 3
|
||||||
|
|
||||||
|
return encoded
|
||||||
|
|
||||||
|
def reveal(img):
|
||||||
|
"""
|
||||||
|
Find a message in an image
|
||||||
|
(with the LSB technique).
|
||||||
|
"""
|
||||||
|
width, height = img.size
|
||||||
|
bits = ""
|
||||||
|
index = 0
|
||||||
|
for row in range(height):
|
||||||
|
for col in range(width):
|
||||||
|
r, g, b = img.getpixel((col, row))
|
||||||
|
|
||||||
|
bits += tools.bs(r)[-1] + tools.bs(g)[-1] + tools.bs(b)[-1]
|
||||||
|
|
||||||
|
if int(bits[-8:], 2) == 126:
|
||||||
|
# chr(126) = '~ '
|
||||||
|
list_of_string_bits = ["".join(list(bits[i:(i+8)])) for i in range(0, len(bits)-8, 8)]
|
||||||
|
|
||||||
|
list_of_character = [chr(int(elem, 2)) for elem in list_of_string_bits]
|
||||||
|
return "".join(list_of_character)
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# Point of entry in execution mode
|
||||||
|
original_image_file = "./pictures/montenach.png"
|
||||||
|
encoded_image_file = "./pictures/montenach_enc.png"
|
||||||
|
secret_message = "Avec la technique LSB (Least Significant Bit) l'oeil humain (un normal ;-)) ne voit plus la difference"
|
||||||
|
with open("./lorem_ipsum.txt", "r") as f:
|
||||||
|
secret_message = f.read()
|
||||||
|
|
||||||
|
img1 = Image.open(original_image_file)
|
||||||
|
img_encoded = hide(img1, secret_message)
|
||||||
|
|
||||||
|
if img_encoded:
|
||||||
|
# Save it
|
||||||
|
img_encoded.save(encoded_image_file)
|
||||||
|
# Test it
|
||||||
|
img2 = Image.open(encoded_image_file)
|
||||||
|
print reveal(img2)
|
BIN
pictures/montenach.png
Normal file
BIN
pictures/montenach.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2 MiB |
|
@ -9,8 +9,7 @@ from PIL import Image
|
||||||
|
|
||||||
def steganalyse(img):
|
def steganalyse(img):
|
||||||
"""
|
"""
|
||||||
Find a message in an image
|
Steganlysis of the LSB technique.
|
||||||
(with the LSB technique).
|
|
||||||
"""
|
"""
|
||||||
encoded = img.copy()
|
encoded = img.copy()
|
||||||
width, height = img.size
|
width, height = img.size
|
||||||
|
@ -35,10 +34,10 @@ def steganalyse(img):
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
# Point of entry in execution mode
|
# Point of entry in execution mode
|
||||||
original_image_file = "./pictures/2010-08-04T15:42:06.png"
|
original_image_file = "./pictures/montenach.png"
|
||||||
encoded_image_file = "./pictures/2010-08-04T15:42:06_enc.png"
|
encoded_image_file = "./pictures/montenach_enc.png"
|
||||||
original_image_file_steganalysed = "./pictures/2010-08-04T15:42:06_steganalysed.png"
|
original_image_file_steganalysed = "./pictures/montenach_steganalysed.png"
|
||||||
encoded_image_file_steganalysed = "./pictures/2010-08-04T15:42:06_enc_steganalysed.png"
|
encoded_image_file_steganalysed = "./pictures/montenach_enc_steganalysed.png"
|
||||||
|
|
||||||
img_original_image_file = Image.open(original_image_file)
|
img_original_image_file = Image.open(original_image_file)
|
||||||
img_encoded_image_file = Image.open(encoded_image_file)
|
img_encoded_image_file = Image.open(encoded_image_file)
|
56
steganalysis-statistics.py
Normal file
56
steganalysis-statistics.py
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
#! /usr/local/bin/python
|
||||||
|
#-*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
__author__ = "Cedric Bonhomme"
|
||||||
|
__version__ = "$Revision: 0.1 $"
|
||||||
|
__date__ = "$Date: 2010/10/01 $"
|
||||||
|
|
||||||
|
import operator
|
||||||
|
|
||||||
|
from PIL import Image
|
||||||
|
from collections import Counter
|
||||||
|
from collections import OrderedDict
|
||||||
|
|
||||||
|
def steganalyse(img):
|
||||||
|
"""
|
||||||
|
Steganlysis of the LSB technique.
|
||||||
|
"""
|
||||||
|
encoded = img.copy()
|
||||||
|
width, height = img.size
|
||||||
|
colours = Counter()
|
||||||
|
for row in range(height):
|
||||||
|
for col in range(width):
|
||||||
|
r, g, b = img.getpixel((col, row))
|
||||||
|
colours[r] += 1
|
||||||
|
|
||||||
|
most_common = colours.most_common(10)
|
||||||
|
dict_colours = OrderedDict(sorted(colours.items(), key=lambda t: t[1]))
|
||||||
|
|
||||||
|
colours = 0
|
||||||
|
for colour in dict_colours.keys():
|
||||||
|
colours += colour
|
||||||
|
colours = colours / len(dict_colours)
|
||||||
|
|
||||||
|
#return colours.most_common(10)
|
||||||
|
return dict_colours.keys()[:30], most_common
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# Point of entry in execution mode
|
||||||
|
original_image_file = "./pictures/montenach.png"
|
||||||
|
encoded_image_file = "./pictures/montenach_enc.png"
|
||||||
|
original_image_file_steganalysed = "./pictures/montenach_steganalysed.png"
|
||||||
|
encoded_image_file_steganalysed = "./pictures/montenach_enc_steganalysed.png"
|
||||||
|
|
||||||
|
img_original_image_file = Image.open(original_image_file)
|
||||||
|
img_encoded_image_file = Image.open(encoded_image_file)
|
||||||
|
img_original_image_file_steganalysed = Image.open(original_image_file_steganalysed)
|
||||||
|
img_encoded_image_file_steganalysed = Image.open(encoded_image_file_steganalysed)
|
||||||
|
|
||||||
|
print steganalyse(img_original_image_file)
|
||||||
|
print
|
||||||
|
print steganalyse(img_encoded_image_file)
|
||||||
|
print
|
||||||
|
print
|
||||||
|
print steganalyse(img_original_image_file_steganalysed)
|
||||||
|
print
|
||||||
|
print steganalyse(img_encoded_image_file_steganalysed)
|
Loading…
Add table
Reference in a new issue