import os
from random import *
from math import *
+from bbs import *
+
infinity = 1000000000
+M=18532395500947174450709383384936679868383424444311405679463280782405796233163977*39688644836832882526173831577536117815818454437810437210221644553381995813014959
+X=18532395500947174450709383384936679868383424444311
+
+
return List
-def compute_filter_canny(level,image):
+def compute_filter_canny(level,image,MsgLen):
+
+ bbs = BlumBlumShub();
+ bbs.setN(M)
+ bbs.setSeed(X)
+
level2=level.copy()
level2= array(level2.getdata()).flatten()
l=0
processed= array(processed.getdata()).flatten()
List7=set(compute_list_bit_to_change(100,processed))
- nb_bit_embedded=(512*512/10)+40
+
+ nb_bit_embedded=max(2*MsgLen,int(len(List3)/MsgLen)*MsgLen)
+ print "nb_bit_embedded",nb_bit_embedded
AvailablePixel3=List3
AvailablePixel5=AvailablePixel3.union(List5)
AvailablePixel7=AvailablePixel5.union(List7)
+ sub=set()
+
if len(AvailablePixel3)>nb_bit_embedded:
step=1
WorkingPixel=AvailablePixel3
+ sub = bbs.sample(AvailablePixel3,nb_bit_embedded)
elif len(AvailablePixel5)>nb_bit_embedded:
step=2
WorkingPixel=AvailablePixel5
+ sub = AvailablePixel3.union(
+ bbs.sample(AvailablePixel5-AvailablePixel3,nb_bit_embedded-len(AvailablePixel3)))
+
elif len(AvailablePixel7)>nb_bit_embedded:
step=3
WorkingPixel=AvailablePixel7
+ sub = AvailablePixel5.union(
+ bbs.sample(AvailablePixel7-AvailablePixel5,nb_bit_embedded-len(AvailablePixel5)))
else:
step=4
WorkingPixel=range(len(level2))
+ sub = range(len(level2))
+
print "avail P3",len(AvailablePixel3)
print "avail P5",len(AvailablePixel5)
print "avail P7",len(AvailablePixel7)
- print "size WorkingPixel",len(WorkingPixel)
- Weight=[0 for _ in WorkingPixel]
+
+ Weight=[0 for _ in sub]
l=0
- for i in WorkingPixel:
+ for i in sub:
if step>=1 and i in List3:
Weight[l]=1
if step>=2 and i in List5 and Weight[l]==0:
Weight[l]=1000
l+=1
-
-
-
- List_bit_to_change=WorkingPixel
+ List_bit_to_change=sub
+ return [sub,Weight]
- return [List_bit_to_change,Weight]
+def verifie(fileout,leng_msg,Message,):
+ global M,X
+ bit_to_read = 1
+ dd2 = im.open(fileout)
+ dd2 = dd2.convert('RGB')
+ red2, green, blue = dd2.split()
+ level2=red2.copy()
+ [List_bit_to_change2,Weight2]=compute_filter_canny(level2,dd2,leng_msg)
+ level2= array(level2.getdata()).flatten()
+ print "support2",len(List_bit_to_change2)
+ print "message2",len(Message)
+ print "weight2",len(Weight2)
+ alpha = float(len(List_bit_to_change2))/len(Message)
+ assert alpha >= 2
+ index = min(int(alpha),9)
+ H_hat2 = {
+ 2 : [71,109],
+ 3 : [95, 101, 121],
+ 4 : [81, 95, 107, 121],
+ 5 : [75, 95, 97, 105, 117],
+ 6 : [73, 83, 95, 103, 109, 123],
+ 7 : [69, 77, 93, 107, 111, 115, 121],
+ 8 : [69, 79, 81, 89, 93, 99, 107, 119],
+ 9 : [69, 79, 81, 89, 93, 99, 107, 119, 125]
+ }[index]
-def mystego(filein, fileout):
- dd = im.open(filein)
- dd = dd.convert('RGB')
- red, green, blue = dd.split()
- level=red.copy()
- [List_bit_to_change,Weight]=compute_filter_canny(level,dd)
- level= array(level.getdata()).flatten()
+ print H_hat2
+
+
+ Stc_message2=[getBit(level2[l],bit_to_read) for l in List_bit_to_change2]
+ LL2=list(List_bit_to_change2)
+
+ """
+ print "Level",max([level2[l]-level[l] for l in xrange(len(Stc_message2))])
+ print "List bit to change",max([LL2[l]-LL1[l] for l in xrange(len(Stc_message))])
+ print "Stc message", max([Stc_message[l]-Stc_message2[l] for l in xrange(len(Stc_message))])
+ """
+ Message2 = [x%2 for x in prod(H_hat2,len(Message),Stc_message2)]
+ level2=Message2
+# print "mesg",Message
+# print "mesg2",Message2
- bit_to_read=1
+ l=0
+ val_mod2=0
+ list_msg=[]
+ decoded_msg=""
+ bbs = BlumBlumShub();
+ bbs.setN(M)
+ bbs.setSeed(X)
- M=18532395500947174450709383384936679868383424444311405679463280782405796233163977*39688644836832882526173831577536117815818454437810437210221644553381995813014959
- # M clef
- X=18532395500947174450709383384936679868383424444311
- # X clef
+ List_random=[]
+ while len(List_random)<len(Message2):
+ List_random.extend(Denary2Binary(bbs.next()))
+ MessageDecoded2=[(int(Message2[l])^int(List_random[l])) for l in xrange(len(Message2))]
+# print conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(leng_error*8)]))
+# print int(conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(leng_error*8)])))
- l=0
+ #print "MessageDecoded2",MessageDecoded2
+
+ outIm = im.new("L",im.open("invader.png").size)
+ (l,h) = outIm.size
+ print "taille de l'image",l*h
+ print "taille des donneées",len(MessageDecoded2)
+ queue = [255 if x != 0 else 0 for x in MessageDecoded2]
+ queue = queue[len(queue)-l*h:]
+ outIm.putdata(queue)
+ outIm.save("apresSobel.png")
+
+"""
+ print conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(len(Message2))]))
+ for l in List_bit_to_change2:
+ if(val_mod2<leng_error*8):
+ list_msg.append(`getBit(level2[l],bit_to_read)^int(List_random[val_mod2])`)
+ if(val_mod2==leng_error*8-1):
+ bin_leng2=''.join(list_msg)
+ coded_msg2=conv_list_bit(bin_leng2)
+ clear_msg2=coded_msg2
+ length_msg=int(clear_msg2)
+ list_msg=[]
+ if(val_mod2>=leng_error*8 and val_mod2<leng_error*8+length_msg*leng_error):
+ list_msg.append(`getBit(level2[l],bit_to_read)^int(List_random[val_mod2])`)
+ if(len(list_msg)==leng_error*8):
+ pack=''.join(list_msg)
+ msg=conv_list_bit(pack)
+ decoded_msg=decoded_msg+msg
+ list_msg=[]
+ val_mod2+=1
+ l=l+1
+ print decoded_msg#[0:20]
+"""
+
+
+
+
+
+def mystego(filein, fileout,file_msg="invader"):
+ bit_to_read = 1
+ global M,X
+ bbs = BlumBlumShub();
+ bbs.setN(M)
+ bbs.setSeed(X)
+
+ dd = im.open(filein)
+ dd = dd.convert('RGB')
+ red, green, blue = dd.split()
+ level=red.copy()
+
+ #print type(level),level
+ """
+
message="Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete voila c'est la fin blablabla:-)"
- message=message[0:len(message)/1]
+
+ message="Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela. Bon voici un test avec un message un peu plus long. Bon j'en rajoute pour voir. Ce que j'écris est très original... Bref, je suis un poete Salut christophe, arrives tu à lire ce message? normalement tu dois lire cela."
+
+
+
+
leng_msg=len(message)
+ print "taille du message en caracteres",leng_msg
message=message+((leng_msg+7)/8*8-leng_msg)*" "
leng_msg=len(message)
-
leng='%08d'%len(message)
-
-
-
-
+
len_leng=len(leng)
leng_error=int(len_leng)
leng_cor=leng
+
List_pack=a2b_list(leng_cor)
- print len(str(M))
-
- List_random=[]
- while len(List_random)<len(List_bit_to_change):
- X=(X*X)%M
- List_random.extend(Denary2Binary(X))
-
size=0
for i in range(leng_msg/8):
m=message[i*8:(i+1)*8]
size=size+len(m_bin)
List_pack.extend(m_bin)
+ """
+
+ message = []
+ for c in [x if x==0 else 1 for x in im.open("invader.png").getdata()]:
+ message +=[c]
+
+ leng_msg=len(message)
+ leng='%08d'%len(message)
+ len_leng=len(leng)
+ leng_error=int(len_leng)
+ leng_cor=leng
+ List_pack=a2b_list(leng_cor)
+ List_pack += message
+ #print List_pack
+ leng_msg=len(List_pack)
+ print "leng_msg",leng_msg
-
+ [List_bit_to_change,Weight]=compute_filter_canny(level,dd,leng_msg)
+ level= array(level.getdata()).flatten()
+ List_random=[]
+ while len(List_random)<len(List_pack):
+ List_random.extend(Denary2Binary(bbs.next()))
- #List_bit_to_change = support
- #print len(List_bit_to_change)
#print List_bit_to_change
- Support=[getBit(level[l],bit_to_read) for l in List_bit_to_change]
- #print len(List_pack)
+ Support=[]
+ for l in List_bit_to_change :
+ Support += [getBit(level[l],bit_to_read) ]
+
#List_pack = message
Message=[(int(List_pack[l])^int(List_random[l])) for l in xrange(len(List_pack))]
- print "support",len(List_bit_to_change)
- print "message",len(Message)
- print "weight",len(Weight)
+ #print "support",len(List_bit_to_change)
+ #print "message",Message
+ #print "weight",len(Weight)
+ #(x_b,Stc_message,H_hat) = stc(Support,Weight,Message)
+
(x_b,Stc_message,H_hat) = stc(Support,Weight,Message)
- print "pourcentage modif",nbdif(x_b,Stc_message)
- print "taille Stc_message",len(Stc_message)
+ print "comparaison entre stc_message et message", len(Stc_message),len(Message)
+
+
+ #print "pourcentage modif",nbdif(x_b,Stc_message)
+ #print "taille Stc_message",len(Stc_message)
# Stc_message=Message
level[l]=float64(setBit(level[l],bit_to_read,Stc_message[size_mesg]))
size_mesg+=1
- print 'size mesg',size_mesg
- print 'val mod',val_mod
- print 'len message',len(Message),len(List_pack)
+ #print 'size mesg',size_mesg
+ #print 'val mod',val_mod
+ #print 'len message',len(Message),len(List_pack)
zz3.save(fileout)
#zz4.show()
+ verifie(fileout,leng_msg,Message)
-
- dd2 = im.open(fileout)
- dd2 = dd2.convert('RGB')
- red2, green, blue = dd2.split()
- level2=red2.copy()
-
- [List_bit_to_change2,Weight2]=compute_filter_canny(level2,dd2)
- level2= array(level2.getdata()).flatten()
- print "support2",len(List_bit_to_change2)
- print "message2",len(Message)
- print "weight2",len(Weight)
-
- alpha = float(len(List_bit_to_change2))/len(Message)
- print alpha
- assert alpha >= 2
- index = min(int(alpha),9)
- H_hat2 = {
- 2 : [71,109],
- 3 : [95, 101, 121],
- 4 : [81, 95, 107, 121],
- 5 : [75, 95, 97, 105, 117],
- 6 : [73, 83, 95, 103, 109, 123],
- 7 : [69, 77, 93, 107, 111, 115, 121],
- 8 : [69, 79, 81, 89, 93, 99, 107, 119],
- 9 : [69, 79, 81, 89, 93, 99, 107, 119, 125]
- }[index]
-
-
- print H_hat,H_hat2
-
-
- Stc_message2=[getBit(level2[l],bit_to_read) for l in List_bit_to_change]
- LL1=list(List_bit_to_change);
- LL2=list(List_bit_to_change2)
-
- print "Level",max([level2[l]-level[l] for l in xrange(len(Stc_message))])
- print "List bit to change",max([LL2[l]-LL1[l] for l in xrange(len(Stc_message))])
- print "Stc message", max([Stc_message[l]-Stc_message2[l] for l in xrange(len(Stc_message))])
-
- Message2 = [x%2 for x in prod(H_hat2,len(Message),Stc_message2)]
- level2=Message2
-
-# print "mesg",Message
-# print "mesg2",Message2
-
- print equiv(Message,Message2)
-
- print "fini"
-
- l=0
- val_mod2=0
- list_msg=[]
- decoded_msg=""
-
- MessageDecoded2=[(int(Message2[l])^int(List_random[l])) for l in xrange(len(Message2))]
-# print conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(leng_error*8)]))
-# print int(conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(leng_error*8)])))
-
- print conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(len(Message2))]))
-
-
-
-
-
-
-# for l in List_bit_to_change2:
-# if(val_mod2<leng_error*8):
-# list_msg.append(`getBit(level2[l],bit_to_read)^int(List_random[val_mod2])`)
-# if(val_mod2==leng_error*8-1):
-# bin_leng2=''.join(list_msg)
-# coded_msg2=conv_list_bit(bin_leng2)
-# clear_msg2=coded_msg2
-# length_msg=int(clear_msg2)
-# list_msg=[]
-# if(val_mod2>=leng_error*8 and val_mod2<leng_error*8+length_msg*leng_error):
-# list_msg.append(`getBit(level2[l],bit_to_read)^int(List_random[val_mod2])`)
-# if(len(list_msg)==leng_error*8):
-# pack=''.join(list_msg)
-# msg=conv_list_bit(pack)
-# decoded_msg=decoded_msg+msg
-# list_msg=[]
-# val_mod2+=1
-# l=l+1
-
- print decoded_msg#[0:20]
- print len(List_bit_to_change)
- list_nb_bit.append(filein)
- list_nb_bit.append(len(List_bit_to_change))
-
-
-
-
-#path_cover = '/localhome/couturie/ensemble/cover_bad_laplace/'
-path_stego = '/localhome/couturie/ensemble/BossBase-1.0-canny_new/'
-path_cover = '/localhome/couturie/ensemble/BossBase-1.0-cover/'
-#path_stego = '/tmp/'
-#path_stego = '/home/couturie/BossBase-1.0-canny/'
-#listing = os.listdir(path_cover)
-
-list_nb_bit=[]
-l=0
-
-
-mystego(argv[1],argv[2])
# entree sortie
+def main():
+ path_stego = '/home/couchot/rech/CCG12/canny/stc/exp/raphus/stego/'
+ path_cover = '/home/couchot/rech/BCG10/Oxford11/experiments/images/'
+ list_nb_bit=[]
+ l=0
+ listing = [957, 108, 106, 29, 431, 924, 262, 477, 346, 809]
+ for infile in listing:
+ # if l<10:
+ fi = path_cover+str(infile)+'.png'
+ fo = path_stego+str(infile)+'.png'
+ mystego(fi,fo)
+ l+=1
-raise SystemExit
-
-for infile in listing:
-# if l<10:
- if infile[0]==argv[1]:
- print "current file is: " + infile, path_stego+infile
- mystego(path_cover+infile,path_stego+infile)
- l+=1
-
-#f = open('histogram_boss_canny_100255', 'w')
-#f = open('histogram', 'w')
-#for item in list_nb_bit:
-# f.write("%s\n" % item)
+if __name__ == "__main__":
+ main()