Top Banner
“Image and Audio Steganography” B.Tech Project Report Submitted in partial fulfillment of the requirements for the degree of Bachelor of Technology, Computer Science and Engineering Submitted By: Rohit Jaiswal CSE – 06000025 SUPERVISOR: Mr. Rajeev Srivastava (Reader) Department of Computer Science and Engineering Institute of Technology Banaras Hindu University, Varanasi - 221005
53
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Project Report- Steganography

“Image and Audio Steganography”

B.Tech Project ReportSubmitted in partial fulfillment of the requirements for the degree of

Bachelor of Technology, Computer Science and Engineering

Submitted By:Rohit Jaiswal

CSE – 06000025

SUPERVISOR:

Mr. Rajeev Srivastava(Reader)

Department of Computer Science and EngineeringInstitute of Technology

Banaras Hindu University, Varanasi - 221005

Page 2: Project Report- Steganography

DEPARTMENT OF COMPUTER ENGINEERINGINSTITUTE OF TECHNOLOGYBANARAS HINDU UNIVERSITY

Varanasi – 221005, INDIA

Rajeev Srivastava Reader Computer Science and Engineering

Ref. No. IT/CSE/2007-08/ Dated: ______________

CERTIFICATE

This is to certify that Rohit Jaiswal ( Roll no. 06000025), student of the Department of Computer Science & Engineering , Institute of Technology, Banaras Hindu University, Varanasi worked for his B.Tech. Minor Project entitled “Image and Audio Steganography” under my supervision from beginning of fourth semester of B.Tech. program 2006-2010.

The report submitted by him embodies the literature from various reputed resources and is an authentic record of the work carried out by them under my supervision and guidance.

(Rajeev Srivastava)ReaderDepartment of Computer Science & EngineeringInstitute Of TechnologyBanaras Hindu University

Page | 2

Page 3: Project Report- Steganography

ACKNOWLEDGEMENT

It has indeed been a great privilege for me to have Mr. Rajeev Srivastava,

Department of Computer Science and Engineering, Institute of Technology,

Banaras Hindu University, as my mentor for this project. His awe-inspiring

personality, superb guidance and constant encouragement are the motive force

behind this project work. I take this opportunity to express my utmost gratitude to

him. I am also indebted to him for his timely and valuable advice.

I am highly grateful to Prof. A.K.Tripathi, Head, Department of Computer

Science and Engineering, Institute of Technology, Banaras Hindu University for

providing necessary facilities and encouraging me during the course of work.

I am thankful to all technical and non-teaching staff of the Department of

Computer Science and Engineering for their constant assistance and co-operation.

( Rohit Jaiswal )Roll No. : 06000025B.Tech (Part II) Semester IVDepartment of Computer Science & EngineeringInstitute Of Technology ,Banaras Hindu University

Page | 3

Page 4: Project Report- Steganography

Contents

1. Abstract ...........................................................................................................5

2. Chapter 1: Introduction.....................................................................................6Steganography and Cryptography……………………………………...6Scope of Steganography………………………………………………...7

3. Chapter 2: Technologies Used…….................................................................8 Visual C#.NET 8.0 or higher……………………………………………8

Macromedia Flash 8……………………………………………………..8

4. Chapter 3: Theoretical Background……..........................................................9Analysis of Digital Image………………………………………………...9Analysis of Digital Audio………………………………………………..12

5. Chapter 4: Analysis and Design….……….......................................................14Context Diagram………………………………………………………...14

Data Flow Diagram.........................................................................15 Encoding………………………………………………………….15

Decoding………………………………………………………….16

6. Chapter 5. Algorithms………………………………………………………………17

7. Chapter 6: Software Implementation……........................................................23Functions…………………………………………………………………23Functions Map…………………………………………………………..24

8. Chapter 7: Inputs and Outputs………….........................................................25

9. Chapter 8:Conclusion and Future Work...........................................................34

8. References......................................................................................................35

9. Appendix…………………………......................................................................36 Keywords……………...……………………………………………………….36 Source Code............................................................................................37

Page | 4

Page 5: Project Report- Steganography

ABSTRACT

Steganography is the art and science of writing hidden messages in such a way that no one apart from the sender and intended recipient even realizes there is a hidden message. There are often cases when it is not possible to send messages openly or in encrypted form. This is where steganography can come into play. While cryptography provides privacy, steganography is intended to provide secrecy. This project deals with hiding of text behind multimedia, i.e. digital images, wave audio, real media audio, etc. Cryptographic cipher is used before hiding text to make this procedure more secure. The GUI has been given a funky look by using flash.

IMPORTANT KEYWORDS

Steganography , Cryptography, Cover Medium , Plain Text, Cipher Text, Stego Key, Stego Medium

Page | 5

Page 6: Project Report- Steganography

IntroductionThe word steganography is of Greek origin and means "covered, or hidden writing". Steganography is the art and science of communicating in a way which hides the existence of the communication. By contrast, cryptography obscures the meaning of a message, but it does not conceal the fact that there is a message.

Steganography and Cryptography

Cryptography — the science of writing in secret codes — addresses all of the elements necessary for secure communication over an insecure channel, namely privacy, confidentiality, key exchange, authentication, and non-repudiation. But cryptography does not always provide safe communication. Consider an environment where the very use of encrypted messages causes suspicion. Consider the following text file; what else is it likely to be if not encrypted?

qANQR1DBwU4D/TlT68XXuiUQCADfj2o4b4aFYBcWumA7hR1Wvz9rbv2BR6WbEUsyZBIEFtjyqCd96qF38sp9IQiJIKlNaZfx2GLRWikPZwchUXxB+AA5+lqsG/ELBvRac9XefaYpbbAZ6z6LkOQ+eE0XASe7aEEPfdxvZZT37dVyiyxuBBRYNLN8Bphdr2zvz/9Ak4/OLnLiJRk05/2UNE5Z0a+3lcvITMmfGajvRhkXqocavPOKiin3hv7+Vx88uLLem2/fQHZhGcQvkqZVqXx8SmNw5gzuvwjV1WHj9muDGBY0MkjiZIRI7azWnoU93KCnmpR60VO4rDRAS5uGl9fioSvze+q8XqxubaNsgdKkoD+tB/4u4c4tznLfw1L2YBS+dzFDw5desMFSo7JkecAS4NB9jAu9K+f7PTAsesCBNETDd49BTOFFTWWavAfEgLYcPrcn4s3EriUgvL3OzPR4P1chNu6sa3ZJkTBbriDoA3VpnqG3hxqfNyOlqAkamJJuQ53Ob9ThaFH8YcE/VqUFdw+bQtrAJ6NpjIxi/x0FfOInhC/bBw7pDLXBFNaXHdlLQRPQdrmnWskKznOSarxq4GjpRTQo4hpCRJJ5aU7tZO9HPTZXFG6iRIT0wa47AR5nvkEKoIAjW5HaDKiJriuWLdtN4OXecWvxFsjR32ebz76U8aLpAK87GZEyTzBxdV+lH0hwyT/y1cZQ/E5USePP4oKWF4uqquPee1OPeFMBo4CvuGyhZXD/18Ft/53Y

WIebvdiCqsOoabK3jEfdGExce63zDI0==MpRf

The message above is a sentence in English that is encrypted using Pretty Good Privacy (PGP), probably the most commonly used e-mail encryption software today.

The advantage of steganography over cryptography alone is that messages do not attract attention to themselves, to messengers, or to recipients. Whereas the goal of cryptography is to make data unreadable by a third party, the goal of steganography is to hide the data from a third party. Often, steganography and cryptography are used together to ensure security of the covert message.

Page | 6

CHAPTER 1

Page 7: Project Report- Steganography

SCOPE OF STEGANOGRAPHY

Steganography is a very interesting and advantageous science these days and has following uses:

Digital WatermarkingTo protect a copyright on information. Photo collections, sold on CD, often have hidden messages in the photos which allow detection of unauthorized use. The same technique applied to DVDs is even more effective, since the industry builds DVD recorders to detect and disallow copying of protected DVDs.

The simplest and oldest are used in map making, where cartographers sometimes add a tiny fictional street to their maps, allowing them to prosecute copycats.

A similar trick is to add fictional names to mailing lists as a check against unauthorized resellers.

Steganography doesn't just apply to written forms of communication. Radio and TV messages, from World War II to today, can be used to hide coded or hidden messages. Some government sources suspect that Osama bin Laden's pre-recorded videos that are re-played on TV stations around the world contain hidden messages.

Even biological data, stored on DNA, may be a candidate for hidden messages, as biotech companies seek to prevent unauthorized use of their genetically engineered material. The technology is already in place for this: three New York researchers successfully hid a secret message in a DNA sequence and sent it across the country.

Steganography can also be used to allow communication within an underground community.

Steganography is used by some modern printers, including HP and Xerox brand color laser printers. Tiny yellow dots are added to each page. The dots are barely visible and contain encoded printer serial numbers, as well as date and time stamps.

Page | 7

Page 8: Project Report- Steganography

TECHNOLOGIES USED

Visual Studio.NET version 2.0 or higher or Visual C#.NET 8.0 or higher

C# is an object-oriented programming language developed by Microsoft as part of the .NET initiative and later approved as a standard by ECMA (ECMA-334) and ISO (ISO/IEC 23270). Anders Hejlsberg leads development of the C# language, which has a procedural, object-oriented syntax based on C++ and includes influences from aspects of several other programming languages (most notably Delphi and Java) with a particular emphasis on simplification.

In this project all the framework has been designed in C#. It deals with the main Algorithms of this project.

Macromedia Flash Professional 8.0

Flash is commonly used to create animation, advertisements, various web page components, to integrate video into web pages, and more recently, to develop rich Internet applications. Files in the SWF (pronounced: Swif) format, traditionally called "Flash movies" or "Flash games", usually have a .swf file extension and may be an object of a web page, strictly "played" in a standalone Flash Player, or incorporated into a Projector, a self-executing Flash movie (with the .exe extension in Microsoft Windows).

In this project Flash has been used to give the application a stylish look and some animaions. The SWF movies has been associated with the basic platform of C# and has become the background of GUI.

Page | 8

.EXE file ( built in C#)

Functions( built in C#)

.SWF file( built in Flash)

CHAPTER 2

Page 9: Project Report- Steganography

THEORETICAL BACKGROUNDANALYSIS OF DIGITAL IMAGE

An image file is merely a binary file containing a binary representation of the color or light intensity of each picture element (pixel) comprising the image. Images typically use either 8-bit or 24-bit color.

When using 8-bit color, there is a definition of up to 256 colors forming a palette for this image, each color denoted by an 8-bit value.

A 24-bit color scheme, as the term suggests, uses 24 bits per pixel and provides a much better set of colors. In this case, each pixel is represented by three bytes, each byte representing the intensity of the three primary colors red, green, and blue (RGB), respectively. The color orange, for example, would be displayed with red set to 100% , green set to 50% and no blue .

The size of an image file, then, is directly related to the number of pixels and the granularity of the color definition. A typical 640x480 pix image using a palette of 256 colors would require a file about 307 KB in size (640 • 480 bytes), whereas a 1024x768 pix high-resolution 24-bit color image would result in a 2.36 MB file (1024 • 768 • 3 bytes).

To avoid sending files of this enormous size, a number of compression schemes have been developed over time, notably Bitmap (BMP), Graphic Interchange Format (GIF), and Joint Photographic Experts Group (JPEG) file types. Not all are equally suited to steganography, however.

GIF and 8-bit BMP files employ what is known as lossless compression, a scheme that allows the software to exactly reconstruct the original image. JPEG, on the other hand, uses lossy compression, which means that the expanded image

Page | 9

CHAPTER 3

Page 10: Project Report- Steganography

is very nearly the same as the original but not an exact duplicate. Lossless compression is much better suited to applications where the integrity of the original information must be maintained, such as steganography. While JPEG can be used for stego applications, it is more common to embed data in GIF or BMP files.

The simplest approach to hiding data within an image file is called Least Significant Bit (LSB) insertion. In this method, we can take the binary representation of the hidden_data and overwrite the LSB of each byte within the cover_image. If we are using 24-bit color, the amount of change will be minimal and indiscernible to the human eye. As an example, suppose that we have three adjacent pixels (nine bytes) with the following RGB encoding:

10010101 00001101 1100100110010110 00001111 1100101010011111 00010000 11001011

Now suppose we want to "hide" the following 9 bits of data (the hidden data is usually compressed prior to being hidden): 101101101. If we overlay these 9 bits over the LSB of the 9 bytes above, we get the following (where bits in bold have been changed):

10010101 00001100 1100100110010111 00001110 1100101110011111 00010000 11001011

Note that we have successfully hidden 9 bits but at a cost of only changing 4, or roughly 50%, of the LSBs.

A 640x480 pixel image, the size of a small computer monitor, can hold over 400,000 characters. That's a whole novel hidden in one modest photo! This poject involves following formats of images:

Bitmap Images (.bmp)Joint Photographic Experts Group (.jpg)Portable Network Graphics (.png)Tagged Image File Format (.tif)Windows Meta Files (.wmf)

Page | 10

Page 11: Project Report- Steganography

BMP Image File FormatFile Header

Data Size(Bytes)File Type(BM in case of BMP files) 2File Size 4Reserved Byte(Always 0) 1Reserved Byte(Always 0) 1Bf of BitsSize of Info Header 4Width of Bitmap 2Height of Bitmap 2No of planes(1 for BMP) 1Bit Count(Bits/Pixel, Must be 1, 4, 8, 24) 1Type of Compression used(none) 2Size of Image Data in Bytes 2Horizontal Resolution in Pixels/Meter 2Vertical Resolution in Pixels/Meter 2No of Color’s Indexes Used 2Important Color Indexes 2

Reading Pixel Values

Data Size(Bytes)R(Red) 1B(Blue) 1G(Green) 1Reserved Word for RGB 1

Page | 11

Page 12: Project Report- Steganography

ANALYSIS OF DIGITAL AUDIO

Digital audio differs from traditional analog sound in that it is a discrete rather than continuous signal. A discrete signal is created by sampling a continuous analog signal at a specified rate. For example, the standard sampling rate for CD digital audio is about 44kHz. The following figure illustrates a continuous analog sound wave being sampled to produce digital audio. Note the sinusoidal nature of a sound wave.

We emphasize the discrete nature of a digital signal in the diagram. However, standard sampling rates are usually set at a level where the resultant digital signal is visually indistinguishable from the original analog signal.

Digital audio is stored on a computer as a sequence of 0's and 1's. With the right tools, it is possible to change the individual bits that make up a digital audio file. Such precise control allows changes to be made to the binary sequence that are not discernible to the human ear. The secret message is embedded by slightly altering the binary sequence of a sound file.

The key innovation in recent years was to choose an innocent looking cover that contains plenty of random information, called white noise. You can hear white noise as a the nearly silent hiss of a blank tape playing. The secret message replaces the white noise, and if done properly it will appear to be as random as the noise was. Thus the basic design principle of steganographic systems is “replacing high entropy noise with a high entropy secret transmission” .

Page | 12

Page 13: Project Report- Steganography

Wave File Format

Wave Header

Data Size(Bytes)Header Name(RIFF) 4File Size 4Format Name(wave) 4Key Word(fmt) 4Channels(Mono = 1, Stereo = 2) 1Frequency 4Blank(Less Important Data) 6Bit Resolution 1Blank(Less Important Data) 12

Wave Data

Data Size(Bytes)Sound Length 1Frequency 1Sample Data Rest Of Wave File

Page | 13

Page 14: Project Report- Steganography

ANALYSIS AND DESIGN

CONTEXT DIAGRAM

Page | 14

COVER MEDIUM(Image or Audio File)

PLAIN TEXT OR TEXT FILE

(Text to be Hidden) STEGNO KEY

STEGNO-ENCODINGTOOL

STEGNOMEDIUM

STEGNO-DECODING TOOL

.DAT FILE CONTAINING

HIDDEN TEXT

CHAPTER 4

Page 15: Project Report- Steganography

DATA FLOW DIAGRAM

ENCODING

Page | 15

STEGNOKEY

Arithmetic coding

KeyInformation

PLAINTEXT

VigenereCipher

Encripted Text

Conversion into ASCII

form

BitStream

COVER MEDIUM

Read the Image in RGB values of

pixel in Bit form

Read the Audio in Frequency Values

in Byte form

Conversion into 8-bit

form

Using Key Information Encode Bit Stream in the Bit/Byte Stream of Cover Medium

STEGNO MEDIUM

Resultant Bit/ Byte Stream

Page 16: Project Report- Steganography

DECODING

Page | 16

Arithmetic coding Key

Information

VigenereCipher

Encripted Text

Conversion into ASCII

form

Bit Stream of Hidden Text

Conversion into 8-bit

form

ORIGINALTEXT

STEGNOKEY

STEGNO MEDIUM

Read the Audio in Frequency Values

in Byte form

Read the Image in RGB values of

pixel in Bit form

Using Key Information Decode Bit Stream in the Bit/Byte Stream

Page 17: Project Report- Steganography

ALGORITHMSENCODING

Least significant bit (LSB) coding is the simplest way to embed information in a digital Image or Audio file. By substituting the least significant bit of each sampling point in Audio and each pixel in Image with a binary message, LSB coding allows for a large amount of data to be encoded.

The following diagram illustrates how the message 'HEY' is encoded in a 16-bit CD quality sample using the LSB method:

In LSB coding, the ideal data transmission rate is 1 kbps per 1 kHZ.

Page | 17

CHAPTER 5

Page 18: Project Report- Steganography

ALGORITHM FOR ENCODING

STEP 1. //Information from Stegno Key

Input the key in string datatype;//Apply Arithmetic coding to the string keyfloat num = Arithmetic_coding( key);num=num*100;x=10*(1st digit of num);y=10*(2st digit of num);

STEP 2. //converting Plain Text into Bit Stream

//Input Text to be hidden in string datatype;string plaintext;//apply encription algorithm on this string string ciphertext = Vigenere_cipher(plaintext); convert ciphertext ASCII form;convert ASCII form Bit_stream;

STEP 3. //Hiding bitstream of input text in Image or Audio fileint n = length(plaintext);

//HIDING IN IMAGE FILE

get_resolution( image ) pxq;if (p==odd) p=p-1;if(q==odd) q=q-1;R value of 1x1 pixel = n;int g =1;int h=1;int m= bit lodation in Bit_stream;char C= R or G or B;for(int i=0;i<8n;i++){

If (m%3==1) C=R;If (m%3==1) C=G;If (m%3==1) C=B;

Page | 18

Page 19: Project Report- Steganography

Least significant digit of C value of (g+x)x(h+y) th pixel= Bit_stream[i];g = g+x;h = h+y;

} //HIDING IN AUDIO FILE

string audio_stream= sampled audio Byte_stream;audio_stream[0]= n;for(int i=0;i<8n;i++){

If (Bit_stream[i]==0)audio_stream[i++]=audio_stream[i++] AND “11111110”;

If (Bit_stream[i]==1)audio_stream[i]=audio_stream[i] OR “00000001”;

}

Page | 19

Page 20: Project Report- Steganography

ALGORITHM FOR DECODING

STEP 1. //Information from Stegno Key

Input the key in string datatype;//Apply Arithmetic coding to the string keyfloat num = Arithmetic_coding( key);num=num*100;x=10*(1st digit of num);y=10*(2st digit of num);

//from IMAGE file

STEP 2. //read stegno imageint n= R value of 1x1 pixel int g=0;int h=0;

STEP 3. for(int i=1; i<=n;i++){

g=g+x;h=h+y;string Bit_stream;

char C;

If (i%3==1) C=R;If (i%3==1) C=G;If (i%3==1) C=B;

Bit_stream[i--]=least significant digit of C value of (gxh) pixel

}

// from Audio file

STEP 2. //read stegno audiostring audio_stream= sampled stegno audio Byte_stream;int n = audio_stream[0];

Page | 20

Page 21: Project Report- Steganography

STEP 3. for(int i=1;i<8n;i++){

Bit_stream[i]=least significant digit of audio_stream[i];}

STEP 4. //converting Bit Stream into Plain Text

string ciphertext ;convert Bit_stream ASCII form;convert ASCII form ciphertext;//apply dencription algorithm on this string string plaintext = inverse_Vigenere_cipher(ciphertext); PRINT plaintext;

Page | 21

Page 22: Project Report- Steganography

Vigenere Cipher

Plain text: ATTACKATDAWNKey: LEMONLEMONLECipher text: LXFOPVEFRNHR

The person sending the message chooses a keyword and repeats it until it matches the length of the plaintext, for example, the keyword "LEMON" makes :Key: LEMONLEMONLE

Page | 22

Page 23: Project Report- Steganography

IMPLEMENTATIONFUNCTIONS

private void axShockwaveFlash1_FSCommand() This functions is used to make connection between Flash GUI (i.e. SWF movie) and C# codes. It also performs encoding and decoding operation for audio medium.

private void generate_bincodes() It is used to convert the string into binary codes or bit stream.This function uses the class stack to perform this task.

private void text_encrypt() It is used to encrypt the plain text using vigenere cipher.

private string text_decrypt() It is used to decrypt the text which is generated from the stegno medium.

private float get_key() This function is used to manipulate the stegno key.

public Bitmap encrypt() This is the function responsible for hiding encryted text in the image file

public string decrypt() This is the function responsible for decoding the stegno medium.

Page | 23

CHAPTER 6

Page 24: Project Report- Steganography

FUNCTION MAP

Page | 24

EXE file(built in

SWF file(built in Flash)

axShockwaveFlash1_FSCommand()

CLASSDECODE

encrypt()

decrypt()

get_key()

CLASSENCODE

CLASSStegnos

text_ encrypt()

text_ decrypt()

gen_binary_code()

CLASSStack

Page 25: Project Report- Steganography

INPUTS AND OUTPUTS

ENCODING

Page | 25

CHAPTER 7

Page 26: Project Report- Steganography

Page | 26

Page 27: Project Report- Steganography

Page | 27

Page 28: Project Report- Steganography

Page | 28

Page 29: Project Report- Steganography

Page | 29

Page 30: Project Report- Steganography

DECODING

Page | 30

Page 31: Project Report- Steganography

Page | 31

Page 32: Project Report- Steganography

Page | 32

Page 33: Project Report- Steganography

CONCLUSION AND FUTURE WORKSteganography is a really interesting subject and outside of the mainstream cryptography and system administration that most of us deal with day after day. “You never know if a message is hidden”, this is the dilemma that empowers steganography. As more emphasis is placed on the areas of copyright protection, privacy protection, and surveillance, we believe that steganography will continue to grow in importance as a protection mechanism.

This project deals with Steganography in Image and Audio files using Least Significant Bit (LSB) coding. This project can uplifted by considering following measures:

A more sophisticated approach can be implemented by using a pseudo-random number generator to spread the message over the sound file in a random manner.

This project can be extended by using other media files like video and other complex formats of audio and image.

Page | 33

CHAPTER 8

Page 34: Project Report- Steganography

REFERENCES

“Steganography: How to Send a Secret Message By Bryan Clair”http://www.strangehorizons.com/2001/20011008/steganography.shtml

“A detailed look at SteganographicTechniques and their use in an Open-SystemsEnvironment”http://www.scribd.com/word/full/20529?access_key=34h2xr3z7wokx

Steganography from Wikipediahttp://en.wikipedia.org/wiki/Steganography

Image Steganography and Steganalysishttp://www.ims.nus.edu.sg/Programs/imgsci/files/memon/sing_stego.pdf

Microsoft Tutorials for C# Express edition

Page | 34

Page 35: Project Report- Steganography

APPENDIX

KEYWORDS AND DEFINITIONS

Steganography: The art and science of hidden writing.

Cryptography : The science of writing in secret codes.

Cover Medium: file in which we will hide the hidden_data

Plain Text : Data to be hidden.

Cipher Text : The encrypted data to be hidden.

Stego Key : Data is hidden by using this string

Stego Medium : The final resultant file after hiding data.

Bit Stream : The binary code generated from the string.

Page | 35

Page 36: Project Report- Steganography

SOURCE CODE

PROGRAM.CS

using System;using System.Collections.Generic;using System.Windows.Forms;

namespace Steganography{ static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Stegnos()); } }}

FORM1.CS

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;

namespace Steganography{ public partial class Stegnos : Form { public Stegnos() { InitializeComponent(); this.axShockwaveFlash1.FSCommand += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEventHandler(axShockwaveFlash1_FSCommand); } string code_text; string myTextFile = "", myPassword = "", myText = ""; public string myImageFile = ""; int index=0; string mybinarycode_final = "",myAudioFile=""; string final_text = "";

Page | 36

Page 37: Project Report- Steganography

string sampleStr = ""; Stream outputstream; int chkval = 0;

private void axShockwaveFlash1_FSCommand(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e) { if (e.command == "exit") Application.Exit(); if (e.command == "password") { myPassword = e.args.ToString(); } if (e.command == "savetextfile") { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "Binary Files (*.dat)|*.dat"; if (dlg.ShowDialog() == DialogResult.OK) { StreamWriter fwriter = File.CreateText(dlg.FileName); fwriter.WriteLine(final_text); fwriter.Close(); }

} if(e.command == "savedfile") { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "Bitmap (*.bmp)|*.bmp|Portable Network Graphics (*.png)|*.png|Tagged Image File Format (*.tif)|*.tif|Windows MetaFile (*.wmf)|*.wmf|Windows Audio (*.wav)|*.wav"; if (dlg.ShowDialog() == DialogResult.OK) { System.Drawing.Imaging.ImageFormat format = System.Drawing.Imaging.ImageFormat.Bmp; if (dlg.FilterIndex == 2) format = System.Drawing.Imaging.ImageFormat.Png; if (dlg.FilterIndex == 3) format = System.Drawing.Imaging.ImageFormat.Tiff; if (dlg.FilterIndex == 4) format = System.Drawing.Imaging.ImageFormat.Wmf; if (dlg.FilterIndex == 5) { chkval = 1;

Page | 37

Page 38: Project Report- Steganography

BinaryWriter messageWriter = new BinaryWriter(new MemoryStream()); FileStream fs = new FileStream(myAudioFile, FileMode.Open); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, (int)fs.Length); messageWriter.Write(buffer); messageWriter.Seek(0, SeekOrigin.Begin); Stream WaveStream = messageWriter.BaseStream; /*SaveFileDialog dlg1 = new SaveFileDialog(); dlg1.Filter = "wav|*.wav"; if (dlg1.ShowDialog() == DialogResult.OK) { StreamWriter fwriter = File.CreateText(dlg1.FileName); fwriter.Close(); }*/

outputstream = new FileStream(dlg.FileName, FileMode.Create); BinaryWriter writer = new BinaryWriter(outputstream); String str = ""; byte[] ch = new byte[100]; WaveStream.Read(ch, 0, 100); writer.Write(ch); generate_bincodes(); char[] message = mybinarycode_final.ToCharArray(); int messageLength = mybinarycode_final.Length; int msglnth = messageLength; byte[] newByte = new byte[1]; int sampleint = 4; int count = 0; int messagecount = 0; //int streamcount = 44; for(int i=0;i<6;i++) { WaveStream.Read(ch, 0, 1); writer.Write((byte)(msglnth % 10)); msglnth = msglnth / 10; } float keygen = get_key(myPassword); int advancesteps = (int)(keygen * 100); if (advancesteps <50) advancesteps = 50; if ((fs.Length - 100) < messageLength * advancesteps) { MessageBox.Show("Audio File is too small to hide this message");

Page | 38

Page 39: Project Report- Steganography

Application.Exit(); } while (messagecount < messageLength) { sampleint = WaveStream.ReadByte(); if (count % advancesteps == 0) { if (message[messagecount] == '1') { if (sampleint % 2 == 0 && sampleint < 255) { sampleint++; } else sampleint = 255; } else if (messagecount < messageLength) { if (sampleint % 2 == 1 && sampleint < 255) { sampleint++; } else sampleint = 254; } messagecount++; }

count++; writer.Write((byte)sampleint); } while ((sampleint = WaveStream.ReadByte()) >= 0) { writer.Write((byte)sampleint);

} writer.Close(); }

if (chkval != 1) { Image img = new Bitmap(pictureBox1.Image); this.SuspendLayout(); pictureBox1.Image.Dispose(); pictureBox1.Image = null; this.ResumeLayout(); img.Save(dlg.FileName, format); } }

Page | 39

Page 40: Project Report- Steganography

} if (e.command == "decodeaudiofile") { BinaryWriter messageWriter = new BinaryWriter(new MemoryStream()); FileStream fs = new FileStream(e.args, FileMode.Open); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, (int)fs.Length); messageWriter.Write(buffer); messageWriter.Seek(0, SeekOrigin.Begin); Stream WaveStream = messageWriter.BaseStream; byte[] header = new byte[100]; WaveStream.Read(header, 0, 100); String outputstr = ""; int count = 0; int messagecount = 0; float keygen = get_key(myPassword); int advancesteps = (int)(keygen * 100); if (advancesteps < 50) advancesteps = 50; int msglnth=0; int pow=1; for (int i = 0; i < 6; i++) { msglnth += WaveStream.ReadByte() * pow; pow = pow * 10; } while (messagecount < msglnth) { int newdata = WaveStream.ReadByte(); if (count % advancesteps == 0) { if (newdata % 2 == 0) outputstr += '0'.ToString(); else outputstr += '1'.ToString(); messagecount++; } count++; } WaveStream.Close(); //MessageBox.Show(outputstr); int length_text = outputstr.Length; char[] original_val = outputstr.ToCharArray(); string coded_text = ""; int sum = 0; for (int i = 0; i <= length_text - 7; i = i + 8) { sum = 0;

Page | 40

Page 41: Project Report- Steganography

char[] binvalue = { '0', '0', '0', '0', '0', '0', '0', '0' }; for (int j = 0; j <= 7; j++) binvalue[j] = original_val[i + j]; for (int j = 0; j <= 7; j++) { sum += (binvalue[j] - 48) * (int)(Math.Pow((double)2, (double)(7 - j))); } coded_text += ((char)sum).ToString(); } final_text = text_decrypt(coded_text.Length, myPassword.Length, coded_text.ToCharArray(), myPassword.ToCharArray()); } if (e.command == "textfile") { myTextFile = e.args.ToString(); BinaryWriter messageWriter = new BinaryWriter(new MemoryStream()); FileStream fs = new FileStream(e.args, FileMode.Open); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, (int)fs.Length); messageWriter.Write(buffer); messageWriter.Seek(0, SeekOrigin.Begin); Stream MessageStream = messageWriter.BaseStream; int MessageBuffer; byte msg; while ((MessageBuffer = MessageStream.ReadByte()) >= 0) { msg = (byte)MessageBuffer; sampleStr += ((char)msg).ToString(); } text_encrypt(sampleStr.Length, myPassword.Length, sampleStr.ToCharArray(), myPassword.ToCharArray()); /*string text_line; while ((text_line = freader.Read().ToString()) != null) { char[] textline = text_line.ToCharArray(); int length_text = text_line.Length; char[] passwd = myPassword.ToCharArray(); int length_key = myPassword.Length; text_encrypt(length_text, length_key, textline, passwd); } freader.Close();*/ } if (e.command == "decodeimagefile") { Bitmap bitmap = (Bitmap)(new Bitmap(e.args)); string originalText = ""; float key = get_key(myPassword);

Page | 41

Page 42: Project Report- Steganography

int codex = (int)((key * 1000000)%1000); int codey = (int)(key * 1000); int width = bitmap.Width; int height = bitmap.Height; if (codex > width) { while (codex > width) codex -= width; } if (codey > height) { while (codey > height) codey -= height; }

if(codex == 0) codex = 2; if(codey == 0) codey = 4;

decode myDecode = new decode(); originalText = myDecode.decrypt(codex, codey, bitmap); int length_text = originalText.Length; char[] original_val = originalText.ToCharArray(); string coded_text = ""; int sum = 0; for (int i = 0; i <= length_text - 7; i = i + 8) { sum = 0; char[] binvalue = { '0', '0', '0', '0', '0', '0', '0', '0' }; for (int j = 0; j <= 7; j++) binvalue[j] = original_val[i+j]; for (int j = 0; j <= 7; j++) { sum += (binvalue[j] - 48) * (int)(Math.Pow((double)2, (double)(7 - j))); } coded_text += ((char)sum).ToString(); } final_text = text_decrypt(coded_text.Length, myPassword.Length, coded_text.ToCharArray(), myPassword.ToCharArray());

Page | 42

Page 43: Project Report- Steganography

} if (e.command == "text") { myText = e.args.ToString(); int length_text = myText.Length; int length_key = myPassword.Length; char[] textline = myText.ToCharArray(); char[] passwd = myPassword.ToCharArray(); text_encrypt(length_text, length_key, textline, passwd); } if(e.command == "audiofile") { myAudioFile = e.args; } if (e.command == "imagefile") { myImageFile = e.args.ToString();

try { pictureBox1.Image = new Bitmap(myImageFile); } catch (Exception ex) { MessageBox.Show(ex.Message); } Bitmap bitmap = (Bitmap)pictureBox1.Image; int width = bitmap.Width; int height = bitmap.Height; float key = get_key(myPassword); int length = code_text.Length * 8; int blue = length % 100; int green = (length / 100) % 100; int red = (length / 10000) % 100; int codex = (int)((key * 1000000)%1000); int codey = (int)(key * 1000); if (codex > width) { while (codex > width) codex -= width; } if (codey > height) { while (codey > height) codey -= height; }

Page | 43

Page 44: Project Report- Steganography

Color pixelcolor; pixelcolor = bitmap.GetPixel(codex, codey); pixelcolor = Color.FromArgb(red, green, blue); length = code_text.Length * 8; generate_bincodes(); if(codex == 0) codex = 2; if(codey == 0) codey = 4; bitmap.SetPixel(codex, codey, pixelcolor); if (length > (width * height) - 1) { MessageBox.Show("Text too large !!!"); Application.Exit(); } char[] text = mybinarycode_final.ToCharArray(); encode myCode = new encode(); bitmap = myCode.encrypt(codex,codey,length,text,bitmap); } }

private void generate_bincodes() { stack s = new stack();

char ch; int i=0, j=0, k, temp;

int myLength = code_text.Length; char[] codedText = code_text.ToCharArray();

while(i<myLength) {

int count = 0; s.initial(); temp = (int)codedText[i];

while(temp!=0) {

k = temp%2; s.push(k); count++; temp/=2;

}Page | 44

Page 45: Project Report- Steganography

if(count<8) for(int y=count;y<8;y++)

s.push(0); mybinarycode_final += s.display();

i++; j++;

}

}

private void text_encrypt(int length_text, int length_key, char[] text, char[] key) { int i = 0, j = 0; char temp; while (i < length_text) { if (j >= length_key) j = 0; if ((text[i] + key[j]) < 255) temp = (char)(text[i] + key[j]); else temp = (char)(text[i] + key[j] - 256); code_text += temp.ToString(); i++; j++; } } private string text_decrypt(int length_text, int length_key, char[] text, char[] key) { string final = ""; int i = 0, j = 0; char temp; while (i < length_text) { if (j >= length_key) j = 0; if ((text[i] - key[j]) < 255) temp = (char)(text[i] - key[j]); else temp = (char)(text[i] - key[j] - 256); final += temp.ToString(); i++; j++; } return (final); }

Page | 45

Page 46: Project Report- Steganography

private float get_key(string pwd) { int k = 0, i = 0, j = 0; float[] prob ={ 0.08f, 0.02f, 0.03f, 0.03f, 0.12f, 0.02f, 0.02f, 0.05f, 0.08f, 0.01f, 0.01f, 0.04f, 0.03f, 0.07f, 0.08f, 0.02f, 0.01f, 0.06f, 0.06f, 0.06f, 0.03f, 0.01f, 0.02f, 0.01f, 0.02f, 0.01f }; float[] range_to ={ 0.08f, 0.1f, 0.13f, 0.16f, 0.28f, 0.30f, 0.32f, 0.37f, 0.45f, 0.46f, 0.47f, 0.51f, 0.54f, 0.61f, 0.69f, 0.71f, 0.72f, 0.78f, 0.84f, 0.9f, 0.93f, 0.94f, 0.96f, 0.97f, 0.99f, 1.00f }; float[] range_from ={ 0.00f, 0.08f, 0.1f, 0.13f, 0.16f, 0.28f, 0.30f, 0.32f, 0.37f, 0.45f, 0.46f, 0.47f, 0.51f, 0.54f, 0.61f, 0.69f, 0.71f, 0.72f, 0.78f, 0.84f, 0.90f, 0.93f, 0.94f, 0.96f, 0.97f, 0.99f }; float low = 0.00f, high = 1.00f, diff = 1.00f; int x = 0; char[] mypassword = pwd.ToCharArray(); int pwdlength = pwd.Length; while (k < pwdlength) { if (((int)mypassword[k] >= 97) && ((int)mypassword[k] <= 122)) x = (int)mypassword[k] - 97; else if (((int)mypassword[k] >= 65) && ((int)mypassword[k] <= 90)) x = (int)mypassword[k] - 65; diff = high - low; high = low + diff * range_to[x]; low = low + diff * range_from[x]; k++; } return (low); } private void axShockwaveFlash1_Enter(object sender, EventArgs e) { }

}}

ENCODE.CS

Page | 46

Page 47: Project Report- Steganography

using System;using System.Collections.Generic;using System.Text;using System.Drawing;

namespace Steganography{ class encode:Stegnos { public Bitmap encrypt(int x, int y, int length, char[] text,Bitmap bitmap) {

Color pixelcolor = new Color();

int width = bitmap.Width; int height = bitmap.Height;

int[,] transformmatrix = new int[1300, 1300]; int[,] rotatematrix = new int[1300, 1300];

for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { transformmatrix[i, j] = 0; rotatematrix[i, j] = 0;

} }

transformmatrix[x, y] = 3; int row = 0, col = 0, xprob = 0, yprob = 0, xadd = 0, yadd = 0;

row = bitmap.Height; col = bitmap.Width;

xprob = x; yprob = y;

if (yprob % 2 == 1) yadd = yprob - 1; else yadd = yprob; if (xprob % 2 == 1) xadd = xprob - 1; else xadd = xprob; if (row % 2 == 0) row--; if (col % 2 == 0) col--;

Page | 47

Page 48: Project Report- Steganography

if (xadd == 0) xadd = 2; if (yadd == 0) yadd = 4;

int red, green, blue;

int flag = 0;

for (int i = 0; i < length; i++) { flag++; x += xadd; while (x >= col) x -= col; y += yadd; while (y >= row) y -= row; if (transformmatrix[x, y] != 0) { y++; if (y >= row) y = 0; }

pixelcolor = bitmap.GetPixel(x, y); red = pixelcolor.R; green = pixelcolor.G; blue = pixelcolor.B; if (text[i] == '0') { transformmatrix[x, y] = 2; rotatematrix[x, y] = flag % 3;

switch (rotatematrix[x, y]) { case 1: if (red == 0) { red = 2; } else if (red % 2 == 1) { if (red == 255) red--; else red++;

}

pixelcolor = Color.FromArgb(red, green, blue); bitmap.SetPixel(x, y, pixelcolor);

break; case 2:

Page | 48

Page 49: Project Report- Steganography

if (green == 0) { green = 2; }

else if (green % 2 == 1) { if (green == 255) green--; else green++; }

pixelcolor = Color.FromArgb(red, green, blue); bitmap.SetPixel(x, y, pixelcolor);

break; case 0: if (blue == 0) { blue = 2; }

else if (blue % 2 == 1) { if (blue == 255) blue--; else blue++; }

pixelcolor = Color.FromArgb(red, green, blue); bitmap.SetPixel(x, y, pixelcolor);

break; }

} else if (text[i] == '1') { transformmatrix[x, y] = 1; rotatematrix[x, y] = flag % 3;

switch (rotatematrix[x, y]) { case 1: if (red % 2 == 0) { if (red == 0) red++; else red--;

pixelcolor = Color.FromArgb(red, green, blue); bitmap.SetPixel(x, y, pixelcolor); }

Page | 49

Page 50: Project Report- Steganography

break; case 2: if (green % 2 == 0) { if (green == 0) green++; else green--; pixelcolor = Color.FromArgb(red, green, blue); bitmap.SetPixel(x, y, pixelcolor);

}

break; case 0: if (blue % 2 == 0) { if (blue == 0) blue++; else blue--; pixelcolor = Color.FromArgb(red, green, blue); bitmap.SetPixel(x, y, pixelcolor);

}

break; }

} } return (bitmap); } }}

DECODE.CS

using System;using System.Collections.Generic;using System.Text;using System.Drawing;

Page | 50

Page 51: Project Report- Steganography

using System.Windows.Forms;

namespace Steganography{ class decode:Stegnos { public string decrypt(int x,int y,Bitmap bitmap) { string final = ""; Color pixelcolor = new Color();

pixelcolor = bitmap.GetPixel(x, y); int textlength = (pixelcolor.R * 10000) + (pixelcolor.G * 100) + pixelcolor.B; pixelcolor = Color.FromArgb(pixelcolor.R, pixelcolor.G, 0); bitmap.SetPixel(x, y, pixelcolor);

int width = bitmap.Width; int height = bitmap.Height;

int row = 0, col = 0, xprob = 0, yprob = 0, xadd = 0, yadd = 0;

row = bitmap.Height; col = bitmap.Width;

xprob = x; yprob = y;

if (yprob % 2 == 1) yadd = yprob - 1; else yadd = yprob; if (xprob % 2 == 1) xadd = xprob - 1; else xadd = xprob; if (row % 2 == 0) row--; if (col % 2 == 0) col--;

if (xadd == 0) xadd = 2; if (yadd == 0) yadd = 4;

int k = 0;

char[] outputstring = new char[textlength];

for (int i = 0; i < textlength; i++) {

Page | 51

Page 52: Project Report- Steganography

k++; x += xadd; while (x >= col) x -= col; y += yadd; while (y >= row) y -= row;

pixelcolor = bitmap.GetPixel(x, y); int red = pixelcolor.R; int green = pixelcolor.G; int blue = pixelcolor.B; switch (k % 3) { case 1: if (red == 0) { y++; if (y >= row) y = 0;

}

if (red % 2 == 0) outputstring[i] = '0'; else outputstring[i] = '1'; red = 0; pixelcolor = Color.FromArgb(red, green, blue); bitmap.SetPixel(x, y, pixelcolor);

break;

case 2: if (green == 0) { y++; if (y >= row) y = 0; } if (green % 2 == 0) outputstring[i] = '0'; else outputstring[i] = '1'; green = 0; pixelcolor = Color.FromArgb(red, green, blue); bitmap.SetPixel(x, y, pixelcolor);

break; case 0: if (blue == 0) { y++; if (y >= row) y = 0;

} if (blue % 2 == 0) outputstring[i] = '0';

Page | 52

Page 53: Project Report- Steganography

else outputstring[i] = '1'; blue = 0; pixelcolor = Color.FromArgb(red, green, blue); bitmap.SetPixel(x, y, pixelcolor);

break; }

} for (int i = 0; i < textlength; i++) { final += outputstring[i].ToString(); } return (final);

} }}

Page | 53