Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Q5 (Data Hiding) [2 Marks] Assume that you have a cover image file \"mona lisa.j

ID: 3747374 • Letter: Q

Question

Q5 (Data Hiding) [2 Marks] Assume that you have a cover image file "mona lisa.jpg" (refer to the Figure-Q5). You should download the image file from the CANVAS. The image has 2196 pixels horizontally and 2860 pixels vertically. In other words, the image width is 2196 pixels and height is 2860 pixels. You need to hide your student number in the image file using LSB Image steganography technique and produce the stego image file "stego mona lisa.jpg". Use any programming language (ex: JAVA, Python, etc.) to perform this task. Demonstrate your code during tutorials within WEEK 10 to 12. 2860 pixels 2196 pixels Pixels to hide your student number are provided in Iable-05. Each pixel represents RGB (RED, GREEN and BLUE) value. You are required to demonstrate the followings: 1. Convert your student number into binary. 2. Hide a bit of the binary string of your student number in the least significant bits (LSBs) of RED value in a pixel. Generate new RED values for the specified pixels. Produce the stego image file using new RED values. 3. 4. 5. Do you find any difference between the actual image and the new image after embedding secret message? Justify your answer.

Explanation / Answer

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

import javax.swing.JTextArea;

import javax.swing.JScrollBar;

import javax.swing.JScrollPane;

import javax.swing.BorderFactory;

/*

*Class Steganography_View

*/

public class Steganography_View extends JFrame

{

//sie variables for window

private static int WIDTH = 500;

private static int HEIGHT = 400;

//elements for JPanel

private JTextArea input;

private JScrollBar scroll,scroll2;

private JButton encodeButton,decodeButton;

private JLabel image_input;

//elements for Menu

private JMenu file;

private JMenuItem encode;

private JMenuItem decode;

private JMenuItem exit;

/*

*Constructor for Steganography_View class

*@param name Used to set the title on the JFrame

*/

public Steganography_View(String name)

{

//set the title of the JFrame

super(name);

//Menubar

JMenuBar menu = new JMenuBar();

JMenu file = new JMenu("File"); file.setMnemonic('F');

encode = new JMenuItem("Encode"); encode.setMnemonic('E'); file.add(encode);

decode = new JMenuItem("Decode"); decode.setMnemonic('D'); file.add(decode);

file.addSeparator();

exit = new JMenuItem("Exit"); exit.setMnemonic('x'); file.add(exit);

menu.add(file);

setJMenuBar(menu);

// display rules

setResizable(true); //allow window to be resized: true?false

setBackground(Color.lightGray); //background color of window: Color(int,int,int) or Color.name

setLocation(100,100); //location on the screen to display window

setDefaultCloseOperation(EXIT_ON_CLOSE);//what to do on close operation: exit, do_nothing, etc

setSize(WIDTH,HEIGHT); //set the size of the window

setVisible(true); //show the window: true?false

}

/*

*@return The menu item 'Encode'

*/

public JMenuItem getEncode() { return encode; }

/*

*@return The menu item 'Decode'

*/

public JMenuItem getDecode() { return decode; }

/*

*@return The menu item 'Exit'

*/

public JMenuItem getExit() { return exit; }

/*

*@return The TextArea containing the text to encode

*/

public JTextArea getText() { return input; }

/*

*@return The JLabel containing the image to decode text from

*/

public JLabel getImageInput() { return image_input; }

/*

*@return The JPanel displaying the Encode View

*/

public JPanel getTextPanel() { return new Text_Panel(); }

/*

*@return The JPanel displaying the Decode View

*/

public JPanel getImagePanel() { return new Image_Panel(); }

/*

*@return The Encode button

*/

public JButton getEButton() { return encodeButton; }

/*

*@return The Decode button

*/

public JButton getDButton() { return decodeButton; }

/*

*Class Text_Panel

*/

private class Text_Panel extends JPanel

{

/*

*Constructor to enter text to be encoded

*/

public Text_Panel()

{

//setup GridBagLayout

GridBagLayout layout = new GridBagLayout();

GridBagConstraints layoutConstraints = new GridBagConstraints();

setLayout(layout);

input = new JTextArea();

layoutConstraints.gridx = 0; layoutConstraints.gridy = 0;

layoutConstraints.gridwidth = 1; layoutConstraints.gridheight = 1;

layoutConstraints.fill = GridBagConstraints.BOTH;

layoutConstraints.insets = new Insets(0,0,0,0);

layoutConstraints.anchor = GridBagConstraints.CENTER;

layoutConstraints.weightx = 1.0; layoutConstraints.weighty = 50.0;

JScrollPane scroll = new JScrollPane(input,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,

JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

layout.setConstraints(scroll,layoutConstraints);

scroll.setBorder(BorderFactory.createLineBorder(Color.BLACK,1));

add(scroll);

encodeButton = new JButton("Encode Now");

layoutConstraints.gridx = 0; layoutConstraints.gridy = 1;

layoutConstraints.gridwidth = 1; layoutConstraints.gridheight = 1;

layoutConstraints.fill = GridBagConstraints.BOTH;

layoutConstraints.insets = new Insets(0,-5,-5,-5);

layoutConstraints.anchor = GridBagConstraints.CENTER;

layoutConstraints.weightx = 1.0; layoutConstraints.weighty = 1.0;

layout.setConstraints(encodeButton,layoutConstraints);

add(encodeButton);

//set basic display

setBackground(Color.lightGray);

setBorder(BorderFactory.createLineBorder(Color.BLACK,1));

}

}

/*

*Class Image_Panel

*/

private class Image_Panel extends JPanel

{

/*

*Constructor for displaying an image to be decoded

*/

public Image_Panel()

{

//setup GridBagLayout

GridBagLayout layout = new GridBagLayout();

GridBagConstraints layoutConstraints = new GridBagConstraints();

setLayout(layout);

image_input = new JLabel();

layoutConstraints.gridx = 0; layoutConstraints.gridy = 0;

layoutConstraints.gridwidth = 1; layoutConstraints.gridheight = 1;

layoutConstraints.fill = GridBagConstraints.BOTH;

layoutConstraints.insets = new Insets(0,0,0,0);

layoutConstraints.anchor = GridBagConstraints.CENTER;

layoutConstraints.weightx = 1.0; layoutConstraints.weighty = 50.0;

JScrollPane scroll2 = new JScrollPane(image_input,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,

JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

layout.setConstraints(scroll2,layoutConstraints);

scroll2.setBorder(BorderFactory.createLineBorder(Color.BLACK,1));

image_input.setHorizontalAlignment(JLabel.CENTER);

add(scroll2);

decodeButton = new JButton("Decode Now");

layoutConstraints.gridx = 0; layoutConstraints.gridy = 1;

layoutConstraints.gridwidth = 1; layoutConstraints.gridheight = 1;

layoutConstraints.fill = GridBagConstraints.BOTH;

layoutConstraints.insets = new Insets(0,-5,-5,-5);

layoutConstraints.anchor = GridBagConstraints.CENTER;

layoutConstraints.weightx = 1.0; layoutConstraints.weighty = 1.0;

layout.setConstraints(decodeButton,layoutConstraints);

add(decodeButton);

//set basic display

setBackground(Color.lightGray);

setBorder(BorderFactory.createLineBorder(Color.BLACK,1));

}

}

/*

*Main Method for testing

*/

public static void main(String args[])

{

new Steganography_View("Steganography");

}

}