Tiedoston salausmenetelmiä

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 3:18 pm

Tiedoston salausmenetelmiä

Post by DJ-Filbe » Fri Dec 31, 2010 7:12 pm

Keksin tuossa oivallisen tavan salata mitä tahansa tiedostoja. Salausmenetelmä perustuu siihen, että muutat alkuperäisen tiedoston tiedostomuotoa. Tarjoan kaksi vaihtoehtoa: joko ääneksi (wav) tai kuvaksi (bmp, joka on überhidas :? ).
Salattuja ääni- ja kuvatiedostoja pystyy lukemaan kuin mitä tahansa ääni- ja kuvatiedostoa, eli salausalgoritmi 'piilottaa' datan äänen tai kuvan sisään.
Salauksen teho perustuu siihen, että käyttäjä ei tajua salatun tiedoston olevan joku muu miltä näyttää (ääni tai kuva).
Tehostaaksesi salauksen, salaa tiedosto vielä CoolBasicin omalla Encrypt -komennolla.

Kuvatiedostoon tulee mustavalkoharmaita pisteitä, kun taas äänitiedostoon algoritmi heittää kohinaa.

HUOM! filetobmp -funktiota käytettäessä salattavan tiedoston tulee olla todella pieni (en tiedä mikä on maksimi), mutta filetowav tukee kaikkia tiedostokokoja.
CB-koodit:

Code: Select all

Type tavu
	field b
EndType
Function filetobmp(file$)
	fs=FileSize(file)
	a=OpenToRead(file)
	cur#=0
	Repeat
		cur+1
		t.tavu=New(tavu)
		t\b=MakeMEMBlock(1)
		PokeByte t\b, 0, ReadByte(a)
		//If rand(0,fs) Mod 100 = 0 and rand(1,5)=5 Then SetWindow "Kirjoitetaan tavuja muistiin... "+((cur/fs)*100)+"%"
	Until EOF(a)
	CloseFile a
		For o=1000 To 1 Step -1 // kuvan leveys 1-1000
			If fs Mod o = 0 Then 
				b=MakeImage(o,fs/o)
				DrawToImage b
				fend=fs
				cur=1
				np=0
				For t.tavu = Each tavu
					Color PeekByte(t\b,0),PeekByte(t\b,0),PeekByte(t\b,0)
					DeleteMEMBlock t\b
					Delete t
					Dot np,cur
					np=np+1
					If np=o Then np=0 : cur+1
				Next t
				DrawToScreen
				Exit
			EndIf
		Next o
		
		SaveImage b, file+".bmp"
EndFunction

Function bmptofile(bmp$,file$)
	a=LoadImage(bmp)
	b=OpenToWrite(file)
	For cur=1 To ImageHeight(a)
		PickImageColor a, 0,cur
		WriteByte b, getRGB(RED)
	Next cur
	CloseFile b
EndFunction

Function SM_WriteWav(path$,samplerate,data1,data2=0)
    datalen = MEMBlockSize(data1)
    If data2 <> 0 Then channels = 2 Else channels = 1
    f = OpenToWrite(path$)
    WriteByte f,$52 : WriteByte f,$49 : WriteByte f,$46 : WriteByte f,$46//RIFF
    WriteInt f,4 + (8+16)+(8 + datalen/4 * channels * 4)
   WriteByte f,$57 : WriteByte f,$41 : WriteByte f,$56 : WriteByte f,$45//WAVE
   WriteByte f,$66 : WriteByte f,$6d : WriteByte f,$74 : WriteByte f,$20 //FMT
   WriteInt f,16
    WriteShort f,1
   WriteShort f,channels
    WriteInt f,samplerate
    WriteInt f,samplerate * channels * 4
    WriteShort f,channels * 4
    WriteShort f,32
   WriteByte f,$64 : WriteByte f,$61 : WriteByte f,$74 : WriteByte f,$61 //Data
    WriteInt f,datalen/4*channels*4
    For i = 0 To datalen-4 Step 4
        WriteInt f,PeekInt(data1,i)
    Next i
    CloseFile f
EndFunction

Function filetowav(file$)
	f=MakeMEMBlock(FileSize(file)+1)
	a=OpenToRead(file)
	c=0
	Repeat
		PokeByte f, c, ReadByte(a)
		c+1
	Until EOF(a)
	SM_WriteWav(file+".wav",1000,f)
EndFunction

Function wavtofile(wav$, file$)
	a=OpenToRead(wav)
	SeekFile a, 44
	b=OpenToWrite(file)
	Repeat
		WriteByte b, ReadByte(a)
	Until EOF(a)
	CloseFile a
	CloseFile b
EndFunction


	// filetowav(CommandLine())   //Tiedoston automaattinen salaus waviksi kutsuttaessa ohjelmaa komentoriviltä
EDIT:

Lisäksi on mahdollista piilottaa yksi kuva toiseen kuvaan, ns. steganografian avulla:

Code: Select all

Function export(img, modcode=4)
	times=85
	b=MakeImage(ImageWidth(img),ImageHeight(img))
	DrawToImage b
	For y=1 To ImageHeight(img)
		For x=1 To ImageWidth(img)
			PickImageColor img, x,y
			Color (getRGB(1) Mod modcode) * times, (getRGB(2) Mod modcode) * times, (getRGB(3) Mod modcode) * times
			Dot x,y
		Next x
	Next y
	DrawToScreen
	Return b
EndFunction

Function import(img1, img2, modcode=4)
	mw=Max(ImageWidth(img1),ImageWidth(img2))
	mh=Max(ImageHeight(img1),ImageHeight(img2))
	out=MakeImage(mw,mh)
	DrawToImage out
	For y=1 To ImageHeight(out)
		For x=1 To ImageWidth(out)
			PickImageColor img1,x,y
			r1=getRGB(1)
			g1=getRGB(2)
			b1=getRGB(3)
			PickImageColor img2,x,y
			r2=getRGB(1)
			g2=getRGB(2)
			b2=getRGB(3)
			Color Int(r1/modcode)*modcode+(r2/84),Int(g1/modcode)*modcode+(g2/84),Int(b1/modcode)*modcode+(b2/84)
			Dot x,y
		Next x
	Next y
	DrawToScreen
	Return out
EndFunction
Kun haluat sisällyttää kuvan img2 kuvaan img1, kutsu funktiota import(img1,img2) ja tallenna paluuarvo (lopullinen kuva) kuvamuuttujaan. Esim:

Code: Select all

kuva1=LoadImage("kuva1.png")
kuva2=LoadImage("kuva2.png")
kaksikuvaa = import(kuva1,kuva2)
Kun haluat purkaa tämän kuvan, kutsu export-funktiota. Saat piilotetun kuvan (import -funktion 'img2' -kuvan) paluuarvona. Esim:

Code: Select all

piilotettu = export(kaksikuvaa)
Lopputuloksen voit sitten tallentaa vaikkapa komennolla SaveImage tai piirtää näytölle DrawImage -komennolla.[/edit]
Last edited by DJ-Filbe on Sat Jan 01, 2011 5:05 pm, edited 3 times in total.

User avatar
naputtelija
Devoted Member
Posts: 718
Joined: Wed Nov 03, 2010 8:56 pm
Location: Joku piste pohjoisessa.

Re: Tiedoston salausmenetelmiä

Post by naputtelija » Fri Dec 31, 2010 7:28 pm

Opentoread failed.
<Ize> Pitäs tehä allekirjotus..
<Ize> Vois keksiä jonkin nasahtavan sanonnan..
<Ize> Siitä tulis upea legenda ja kaikki vaihtaisivat allekirjoituksensa siihen.
<Ize> Ehkä ei kuitenkaa...

User avatar
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: Tiedoston salausmenetelmiä

Post by tuhoojabotti » Fri Dec 31, 2010 7:30 pm

Joskus muinon leikin cmd scriptillä, jossa kopioitiin kuvatiedostoon jokin toinen tiedosto jonka sai sitten purettua vaikka WinRAR-ohjelmalla. Sama periaate, mutta siinä kuva pysyi alkuperäisenä.
Imagedev.tuhoojabotti.com — “Programmer (noun): An organism that turns caffeine into code.”

DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 3:18 pm

Re: Tiedoston salausmenetelmiä

Post by DJ-Filbe » Fri Dec 31, 2010 7:34 pm

naputtelija wrote:Opentoread failed.
Miksiköhän? Kerro koodi mitä yritit ja tarkka kuvaus siitä mitä teit.
Ei kannata yrittää tehdä sellaisia asioita mistä ei ole varma, ja sitten pistää oman koodin toimimattomuudesta ilmennyt virheilmoitus luettavaksi ilman minkään valtakunnan kuvauksia ongelmasta. Tässäkin oli todennäköisesti vain kysymys siitä, ettet ollut antanut ohjelmalle vaadittavaa parametria, jolloin tiedostoa ei tietenkään löydy ja "opentoread failaa". Tarkista tämä virhe lisäämällä koodin alkuun rivi:

Code: Select all

If FileExists(CommandLine()) = 0 Then MakeError "Parametriksi ei annettu olemassaolevaa tiedostoa."
Parametrin annat ohjelmalle, kun teet tuosta EXE-tiedoston ja vedät&pudotat jonkin muun tiedoston EXE:n päälle.
EDIT:

Miks sulle pitää kaikkien selittää asiat moneen kertaan... :roll: ei millään pahalla


User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Tiedoston salausmenetelmiä

Post by MaGetzUb » Sat Jan 01, 2011 5:20 am

Ömm, koodissasi on tuo

Code: Select all

Type Tavu
Field b
End Type
???
Sitten tuo B on muistipala, johon varataan tavun verran muistia? Mitä järkeä siinä on?
EI YHTIKÄS MITÄÄN. ;)
Koska voit tehdä myös näinkin:

Code: Select all

Type Tavu
Field b As Byte //<- <- Varataan suoraan jäseneen tavu tilaa, niin säästytään turhalta memblockki kikkailulta (Optimoi myös koodiasi ja vähentää pari tavua muistinkulutusta jonki verran) 
End Type
Varaat suoraan kokoelman jäseneen yhden tavun verran tilaa. Omassa toimeenpiteessäsi varaat 2-4tavua tilaa, koska muistipalan muistiosoitteen kokonaisluku tyyppi on integer(4:ä tavuinen kokonaisluku) taikka short(2 tavuinen kokonaisluku).
PS. Aavesoturi on tehnyt tämmöisen aikoinaan. Ja kuvaan tiedon piilotusmenetelmää sanotaan steganografiaksi.
EDIT:

Aavesoturi: En tutkinut Filben koodia tarkemmin, oletin vain että koodi toimii steganografian tavoin. :)

Last edited by MaGetzUb on Sat Jan 01, 2011 3:38 pm, edited 1 time in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
Aavesoturi
Active Member
Posts: 163
Joined: Fri Aug 31, 2007 7:07 pm
Location: Helsinki
Contact:

Re: Tiedoston salausmenetelmiä

Post by Aavesoturi » Sat Jan 01, 2011 6:17 am

Tämä vaikuttaa hieman steganografialta (johon joskus tein esimerkin), mutta huonommalta (ei millään pahalla). Steganografiassa on siis ideana, että esim. kuvan pikseleiden väriarvojen vähiten merkitseviin bitteihin koodataan piilotettavaa dataa (joka voi olla halutessaan kryptattua ja/tai pakattua). Jos vaikka jokaisesta R, G, B arvosta käytetään yksi bitti oman datan piilottamiseen, saadaan piilotettua noin yksi kirjain per pari pikseliä ja ihmissilmä ei kykene huomaamaan eroa alkuperäiseen kuvaan.
Lisää infoa

DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 3:18 pm

Re: Tiedoston salausmenetelmiä

Post by DJ-Filbe » Sat Jan 01, 2011 5:00 pm

Okei okei, tässä teille steganografiaa:

Code: Select all

Function export(img, modcode=4)
	times=85
	b=MakeImage(ImageWidth(img),ImageHeight(img))
	DrawToImage b
	For y=1 To ImageHeight(img)
		For x=1 To ImageWidth(img)
			PickImageColor img, x,y
			Color (getRGB(1) Mod modcode) * times, (getRGB(2) Mod modcode) * times, (getRGB(3) Mod modcode) * times
			Dot x,y
		Next x
	Next y
	DrawToScreen
	Return b
EndFunction

Function import(img1, img2, modcode=4)
	mw=Max(ImageWidth(img1),ImageWidth(img2))
	mh=Max(ImageHeight(img1),ImageHeight(img2))
	out=MakeImage(mw,mh)
	DrawToImage out
	For y=1 To ImageHeight(out)
		For x=1 To ImageWidth(out)
			PickImageColor img1,x,y
			r1=getRGB(1)
			g1=getRGB(2)
			b1=getRGB(3)
			PickImageColor img2,x,y
			r2=getRGB(1)
			g2=getRGB(2)
			b2=getRGB(3)
			Color Int(r1/modcode)*modcode+(r2/84),Int(g1/modcode)*modcode+(g2/84),Int(b1/modcode)*modcode+(b2/84)
			Dot x,y
		Next x
	Next y
	DrawToScreen
	Return out
EndFunction
Kun haluat sisällyttää kuvan img2 kuvaan img1, kutsu funktiota import(img1,img2) ja tallenna paluuarvo (lopullinen kuva) kuvamuuttujaan. Esim:

Code: Select all

kuva1=LoadImage("kuva1.png")
kuva2=LoadImage("kuva2.png")
kaksikuvaa = import(kuva1,kuva2)
Kun haluat purkaa tämän kuvan, kutsu export-funktiota. Saat piilotetun kuvan (import -funktion 'img2' -kuvan) paluuarvona. Esim:

Code: Select all

piilotettu = export(kaksikuvaa)
Lopputuloksen voit sitten tallentaa vaikkapa komennolla SaveImage tai piirtää näytölle DrawImage -komennolla.
***Laitoin vielä ekaan viestiin että tämän löytää paremmin tulevaisuudessa***
(suora copypaste)

User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Tiedoston salausmenetelmiä

Post by esa94 » Sat Jan 01, 2011 5:20 pm

Eipä tuo minusta pikaisen koodianalyysin jälkeen kovin paljoa steganografialta näytä.

Toki voin olla väärässä, pitänee katsoa Windowsin puolella.

DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 3:18 pm

Re: Tiedoston salausmenetelmiä

Post by DJ-Filbe » Sat Jan 01, 2011 5:58 pm

esa94 wrote:Eipä tuo minusta pikaisen koodianalyysin jälkeen kovin paljoa steganografialta näytä.

Toki voin olla väärässä, pitänee katsoa Windowsin puolella.
Olet väärässä. Katsoin enkunkielisestä wikipediasta artikkelin ja purin tällä menetelmällä wikipedian esimerkin mukaisesti kuvasta toisen kuvan. Sitten tein vielä käänteisen algoritmin, että kaksi kuvaa voi 'yhdistää' niin, että saan ne taas auki samalla ohjelmalla.
Mutta!
Olet siinä suhteessa oikeassa, että tuossa ei ole funktiota kaikenlaisten tiedostojen piilottamiseksi kuvaan.

User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Tiedoston salausmenetelmiä

Post by esa94 » Sat Jan 01, 2011 6:17 pm

No ei ihmekään kun luin exportia ikään kuin se olisi import :V

On kai tuo ihan oikein. Itse käyttäisin varmaan hieman eri tekniikkaa ja kieltä mutta eipä CB:llä varmaan parempaan pysty (paitsi tietysti PutPixelin ja GetPixelin käyttö saattaisi nopeuttaa)

Post Reply