コード例 #1
0
ファイル: run_steg.py プロジェクト: rohit01/stegosoft
 def __init__(self, parent=None):
     QtGui.QWidget.__init__(self, parent)
     self.flag = QtCore.Qt.WindowFlags(3)
     QtGui.QWidget.setWindowFlags(self, self.flag)
     self.ui = Ui_stegosoft_gui()
     self.ui.setupUi(self)
     self.crypto = cryptography(self)
     self.ui.tableWidget_for_hide_message_files.setShowGrid(False)
     working_directory = os.path.abspath("./")
     help_file_url = "file://" + "%20".join(working_directory.split(" ")) + "/documentation/documentation.html"
     self.ui.webView_help.load(QtCore.QUrl(help_file_url))
     QtCore.QObject.connect(
         self.ui.pushButton_browse_master_file, QtCore.SIGNAL("clicked()"), self.select_file_browse_master
     )
     QtCore.QObject.connect(
         self.ui.pushButton_browse_carrier_file, QtCore.SIGNAL("clicked()"), self.select_file_browse_carrier
     )
     QtCore.QObject.connect(
         self.ui.pushButton_add_message_file, QtCore.SIGNAL("clicked()"), self.select_file_add_message_file
     )
     QtCore.QObject.connect(
         self.ui.pushButton_remove_message_file, QtCore.SIGNAL("clicked()"), self.remove_message_file
     )
     QtCore.QObject.connect(self.ui.pushButton_hide_submit, QtCore.SIGNAL("clicked()"), self.hide_submit)
     QtCore.QObject.connect(self.ui.pushButton_unhide_submit, QtCore.SIGNAL("clicked()"), self.unhide_submit)
     QtCore.QObject.connect(self.ui.pushButton_show_message_files, QtCore.SIGNAL("clicked()"), self.extract_header)
     self.ui.checkBox_use_password.clicked.connect(self.is_password_needed)
     self.hide_password_character_status = "No"
     self.hide_confirm_password_character_status = "No"
     self.unhide_password_character_status = "No"
     QtCore.QObject.connect(
         self.ui.lineEdit_hide_password,
         QtCore.SIGNAL("selectionChanged()"),
         self.lineEdit_hide_clear_and_set_password_character,
     )
     QtCore.QObject.connect(
         self.ui.lineEdit_hide_confirm_password,
         QtCore.SIGNAL("selectionChanged()"),
         self.lineEdit_hide_confirm_clear_and_set_password_character,
     )
     QtCore.QObject.connect(
         self.ui.lineEdit_unhide_password,
         QtCore.SIGNAL("selectionChanged()"),
         self.lineEdit_unhide_clear_and_set_password_character,
     )
コード例 #2
0
ファイル: run_steg.py プロジェクト: rohit01/stegosoft
class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.flag = QtCore.Qt.WindowFlags(3)
        QtGui.QWidget.setWindowFlags(self, self.flag)
        self.ui = Ui_stegosoft_gui()
        self.ui.setupUi(self)
        self.crypto = cryptography(self)
        self.ui.tableWidget_for_hide_message_files.setShowGrid(False)
        working_directory = os.path.abspath("./")
        help_file_url = "file://" + "%20".join(working_directory.split(" ")) + "/documentation/documentation.html"
        self.ui.webView_help.load(QtCore.QUrl(help_file_url))
        QtCore.QObject.connect(
            self.ui.pushButton_browse_master_file, QtCore.SIGNAL("clicked()"), self.select_file_browse_master
        )
        QtCore.QObject.connect(
            self.ui.pushButton_browse_carrier_file, QtCore.SIGNAL("clicked()"), self.select_file_browse_carrier
        )
        QtCore.QObject.connect(
            self.ui.pushButton_add_message_file, QtCore.SIGNAL("clicked()"), self.select_file_add_message_file
        )
        QtCore.QObject.connect(
            self.ui.pushButton_remove_message_file, QtCore.SIGNAL("clicked()"), self.remove_message_file
        )
        QtCore.QObject.connect(self.ui.pushButton_hide_submit, QtCore.SIGNAL("clicked()"), self.hide_submit)
        QtCore.QObject.connect(self.ui.pushButton_unhide_submit, QtCore.SIGNAL("clicked()"), self.unhide_submit)
        QtCore.QObject.connect(self.ui.pushButton_show_message_files, QtCore.SIGNAL("clicked()"), self.extract_header)
        self.ui.checkBox_use_password.clicked.connect(self.is_password_needed)
        self.hide_password_character_status = "No"
        self.hide_confirm_password_character_status = "No"
        self.unhide_password_character_status = "No"
        QtCore.QObject.connect(
            self.ui.lineEdit_hide_password,
            QtCore.SIGNAL("selectionChanged()"),
            self.lineEdit_hide_clear_and_set_password_character,
        )
        QtCore.QObject.connect(
            self.ui.lineEdit_hide_confirm_password,
            QtCore.SIGNAL("selectionChanged()"),
            self.lineEdit_hide_confirm_clear_and_set_password_character,
        )
        QtCore.QObject.connect(
            self.ui.lineEdit_unhide_password,
            QtCore.SIGNAL("selectionChanged()"),
            self.lineEdit_unhide_clear_and_set_password_character,
        )

    def lineEdit_hide_clear_and_set_password_character(self):
        if self.hide_password_character_status == "No":
            self.ui.lineEdit_hide_password.clear()
            self.ui.lineEdit_hide_password.setEchoMode(2)
            self.hide_password_character_status = "Yes"

    def lineEdit_hide_confirm_clear_and_set_password_character(self):
        if self.hide_confirm_password_character_status == "No":
            self.ui.lineEdit_hide_confirm_password.clear()
            self.ui.lineEdit_hide_confirm_password.setEchoMode(2)
            self.hide_confirm_password_character_status = "Yes"

    def lineEdit_unhide_clear_and_set_password_character(self):
        if self.unhide_password_character_status == "No":
            self.ui.lineEdit_unhide_password.clear()
            self.ui.lineEdit_unhide_password.setEchoMode(2)
            self.unhide_password_character_status = "Yes"

    def select_file_browse_master(self):
        filename = QtGui.QFileDialog.getOpenFileName(None, "Open a Master File", "/home", "Wav Format(*.wav)")
        if filename != "":
            self.ui.label_master_file_path.setText(filename)
            self.ui.label_master_file_size.setText(self.get_filesize(filename))
            self.ui.label_master_file_path.setAlignment(self.ui.label_master_file_size.alignment())

    def select_file_browse_carrier(self):
        filename = QtGui.QFileDialog.getOpenFileName(None, "Open a Carrier File", "/home", "Wav Format(*.wav)")
        if filename != "":
            self.ui.label_carrier_file_path.setText(filename)
            self.ui.label_carrier_file_size.setText(self.get_filesize(filename))
            self.ui.label_carrier_file_path.setAlignment(self.ui.label_master_file_size.alignment())

    def select_file_add_message_file(self):
        new_file = QtGui.QFileDialog.getOpenFileName(None, "Open a Message File", "/home", "All Files(*)")
        if new_file != "":
            no_of_rows = self.ui.tableWidget_for_hide_message_files.rowCount()
            i = 0
            self.message_filenames = []
            while i < no_of_rows:
                ith_file = self.ui.tableWidget_for_hide_message_files.takeItem(i, 3).data(0).toString()
                self.ui.tableWidget_for_hide_message_files.setItem(i, 3, QtGui.QTableWidgetItem(ith_file))
                if ith_file == new_file:
                    QtGui.QMessageBox.information(
                        self,
                        "Duplicate File!",
                        "You have already selected the file concerned.\nPlease select a different file to hide.",
                    )
                    return 1
                self.message_filenames.append(str(ith_file.split("/")[-1]))
                i = i + 1
            new_filename = self.resolve_duplicate_filenames(new_file.split("/")[-1], self.message_filenames)
            if new_filename != None:
                accept = QtGui.QMessageBox.warning(
                    self,
                    "File will be renamed when added!",
                    str(
                        "The file named '"
                        + new_file.split("/")[-1]
                        + "' already exists.\nIf added this file will be renamed to '"
                        + new_filename
                        + "' or similar.\nAre you sure you want to do this?"
                    ),
                    "Yes",
                    "No",
                )
                if accept == 1:
                    return 1
            self.ui.tableWidget_for_hide_message_files.insertRow(no_of_rows)
            self.ui.tableWidget_for_hide_message_files.setItem(
                no_of_rows, 0, QtGui.QTableWidgetItem(new_file.split("/")[-1])
            )
            self.ui.tableWidget_for_hide_message_files.setItem(
                no_of_rows, 1, QtGui.QTableWidgetItem(self.get_filesize(new_file))
            )
            if self.ui.checkBox_use_password.isChecked() == True:
                self.ui.tableWidget_for_hide_message_files.setItem(no_of_rows, 2, QtGui.QTableWidgetItem("Yes"))
            else:
                self.ui.tableWidget_for_hide_message_files.setItem(no_of_rows, 2, QtGui.QTableWidgetItem("No"))
            self.ui.tableWidget_for_hide_message_files.setItem(no_of_rows, 3, QtGui.QTableWidgetItem(new_file))

    def remove_message_file(self):
        row_number = self.ui.tableWidget_for_hide_message_files.currentRow()
        self.ui.tableWidget_for_hide_message_files.removeRow(row_number)

    def is_password_needed(self):
        no_of_rows = self.ui.tableWidget_for_hide_message_files.rowCount()
        if self.ui.checkBox_use_password.isChecked() == True:
            i = 0
            while i < no_of_rows:
                self.ui.tableWidget_for_hide_message_files.setItem(i, 2, QtGui.QTableWidgetItem("Yes"))
                i = i + 1
            self.ui.lineEdit_hide_password.setMaxLength(28)
            self.ui.lineEdit_hide_confirm_password.setMaxLength(28)
        else:
            i = 0
            while i < no_of_rows:
                self.ui.tableWidget_for_hide_message_files.setItem(i, 2, QtGui.QTableWidgetItem("No"))
                i = i + 1
            self.ui.lineEdit_hide_password.setMaxLength(28)
            self.ui.lineEdit_hide_confirm_password.setMaxLength(28)

    def get_filesize(self, filename):
        filesize = os.path.getsize(filename)
        if filesize < 1024:
            return " ".join([str(filesize), "B"])
        elif 1024 <= filesize < 1024 ** 2:
            filesize = int(round(filesize / 1024.0 ** 1))
            return " ".join([str(filesize), "KB"])
        elif 1024 ** 2 <= filesize < 1024 ** 3:
            filesize = int(round(filesize / 1024.0 ** 2))
            return " ".join([str(filesize), "MB"])
        elif filesize >= 1024 ** 3:
            filesize = int(round(filesize / 1024.0 ** 3))
            return " ".join([str(filesize), "GB"])

    def resolve_duplicate_filenames(self, input_filename, message_filenames, no_of_occurrence=0):
        resolved_filename = None
        input_filename = str(input_filename)
        if input_filename in message_filenames:
            if no_of_occurrence > 0:
                i = 0
                for item in message_filenames:
                    if item == input_filename:
                        i = i + 1
                if i <= no_of_occurrence:
                    return None
            i = 2
            resolved_filename = input_filename
            while resolved_filename in message_filenames:
                if ".".join(input_filename.split(".")[:-1]) != "":
                    resolved_filename = (
                        ".".join(input_filename.split(".")[:-1]) + "_" + str(i) + "." + input_filename.split(".")[-1]
                    )
                else:
                    resolved_filename = str(resolved_filename + "_" + str(i))
                i = i + 1
        return resolved_filename

    def hide_resolve_duplicate_filenames(self):
        no_of_rows = self.ui.tableWidget_for_hide_message_files.rowCount()
        i = 0
        self.message_filenames = []
        message_filenames = []
        while i < no_of_rows:
            ith_file = self.ui.tableWidget_for_hide_message_files.takeItem(i, 3).data(0).toString()
            self.ui.tableWidget_for_hide_message_files.setItem(i, 3, QtGui.QTableWidgetItem(ith_file))
            self.message_filenames.append(str(ith_file))
            message_filenames.append(str(ith_file).split("/")[-1])
            i = i + 1
        file_dict = {}
        i = 0
        while i < no_of_rows:
            new_filename = self.resolve_duplicate_filenames(
                self.message_filenames[i].split("/")[-1], message_filenames, 1
            )
            if new_filename != None:
                if self.message_filenames[i].split("/")[-1] in file_dict:
                    temp_filename = "./temp/resolve/" + new_filename
                    message_filenames.append(new_filename)
                    shutil.copy2(self.message_filenames[i], temp_filename)
                    self.message_filenames[i] = temp_filename
                else:
                    file_dict[self.message_filenames[i].split("/")[-1]] = "resolve"
            i = i + 1
        return 0

    def hide_submit(self):
        master_filename = str(self.ui.label_master_file_path.text())
        no_of_message_files = self.ui.tableWidget_for_hide_message_files.rowCount()
        if master_filename == "No File Selected":
            QtGui.QMessageBox.information(
                self,
                "Please Select a Master File!",
                "No Master File selected.\nPlease Select a Master file to continue.",
            )
            return 1
        if no_of_message_files == 0:
            QtGui.QMessageBox.information(
                self,
                "Please Add Some Message Files!",
                "You have not added a single message file.\nPlease add one or more message files to continue.",
            )
            return 1
        if (self.ui.checkBox_use_password.isChecked() == True) and (
            (self.hide_password_character_status == "No") or (self.hide_confirm_password_character_status == "No")
        ):
            QtGui.QMessageBox.information(
                self,
                "Please Enter a Password!",
                "Password must be entered if used for security.\nPlease Enter Password to continue.",
            )
            return 1
        elif (self.ui.checkBox_use_password.isChecked() == True) and (
            self.ui.lineEdit_hide_password.text() == "" and self.ui.lineEdit_hide_confirm_password.text() == ""
        ):
            print self.ui.lineEdit_hide_password.text()
            print self.ui.lineEdit_hide_confirm_password.text()
            QtGui.QMessageBox.information(
                self,
                "Null Password Entered!",
                "The password cannot be blank.\nPlease enter passwords correctly to continue.",
            )
            return 1
        elif (self.ui.checkBox_use_password.isChecked() == True) and (
            (self.ui.lineEdit_hide_password.text() != self.ui.lineEdit_hide_confirm_password.text())
        ):
            print self.ui.lineEdit_hide_password.text()
            print self.ui.lineEdit_hide_confirm_password.text()
            QtGui.QMessageBox.information(
                self,
                "Passwords do not Match!",
                "The passwords in both the boxes must be the same.\nPlease enter passwords correctly to continue.",
            )
            return 1

        output_filename = QtGui.QFileDialog.getSaveFileName(
            None, "Save the Carrier file as..", "master.wav", "Wav Format(*.wav)"
        )
        if output_filename != "":
            no_of_rows = self.ui.tableWidget_for_hide_message_files.rowCount()
            self.hide_resolve_duplicate_filenames()
            run_hide_program = ["./hide.out"]
            run_hide_program.append("".join(['"', str(master_filename), '"']))
            run_hide_program.append("".join(['"', str(output_filename), '"']))
            run_hide_program.append("".join(['"', str(no_of_rows), '"']))
            if self.ui.checkBox_use_password.isChecked() == False:
                run_hide_program.append("".join(['"', str(0), '"']))
                run_hide_program.append("".join(['"', str(0), '"']))
                i = 0
                while i < no_of_rows:
                    run_hide_program.append("".join(['"', str(os.path.getsize(self.message_filenames[i])), '"']))
                    run_hide_program.append(
                        "".join(['"', str(str(self.message_filenames[i]).split("/")[-1].__len__()), '"'])
                    )
                    run_hide_program.append("".join(['"', str(0), '"']))
                    run_hide_program.append("".join(['"', str(self.message_filenames[i]), '"']))
                    i = i + 1
            else:
                run_hide_program.append("".join(['"', str(1), '"']))
                self.hide_password = str(
                    self.crypto.encrypt(
                        str(self.ui.lineEdit_hide_password.text()), str(self.ui.lineEdit_hide_password.text())
                    )
                )
                print self.hide_password
                run_hide_program.append("".join(['"', self.hide_password, '"']))
                i = 0
                while i < no_of_rows:
                    encrypted_filename = "./temp/" + str(self.message_filenames[i]).split("/")[-1]
                    self.crypto.encrypt_file(self.message_filenames[i], encrypted_filename, self.hide_password)

                    run_hide_program.append("".join(['"', str(os.path.getsize(encrypted_filename)), '"']))
                    run_hide_program.append(
                        "".join(['"', str(str(self.message_filenames[i]).split("/")[-1].__len__()), '"'])
                    )
                    run_hide_program.append("".join(['"', str(1), '"']))
                    run_hide_program.append("".join(['"', encrypted_filename, '"']))
                    i = i + 1
            print " ".join(run_hide_program)
            success = os.system(" ".join(run_hide_program))
            for i in os.listdir("./temp/resolve/"):
                try:
                    os.remove("./temp/resolve/" + i)
                except:
                    pass
            for i in os.listdir("./temp/"):
                try:
                    os.remove("./temp/" + i)
                except:
                    pass
            if int(success) == 0:
                QtGui.QMessageBox.information(
                    self, "File Successfully Created!", "Hide Operation Completed Successfully.\nCongratulations!!."
                )
                return 0
            else:
                QtGui.QMessageBox.information(
                    self,
                    "Unexpected error!",
                    "Sorry the hide operation failed.\nPlease report your problems to developers by e-mail.",
                )
                return 1

    def unhide_submit(self):
        self.carrier_filename = str(self.ui.label_carrier_file_path.text())
        if self.carrier_filename == "No File Selected":
            QtGui.QMessageBox.information(
                self,
                "Please Select a Carrier File!",
                "No Carrier File selected.\nPlease Select a Carrier file to continue.",
            )
            return 1
        if self.extract_header() == 1:
            return 1

        self.output_folder = QtGui.QFileDialog.getExistingDirectory(None, "Select where to save the files", "")
        if self.output_folder != "":
            self.carrier_filename = self.ui.label_carrier_file_path.text()
            run_unhide_program = ["./unhide.out"]
            run_unhide_program.append("".join(['"', str(self.carrier_filename), '"']))
            if int(self.header[3]) != 0:
                run_unhide_program.append("".join(['"', "./temp/", '"']))
                if self.unhide_password_character_status == "Yes":
                    self.unhide_password = str(
                        self.crypto.encrypt(
                            str(self.ui.lineEdit_unhide_password.text()), str(self.ui.lineEdit_unhide_password.text())
                        )
                    )
                    run_unhide_program.append("".join(['"', self.unhide_password, '"']))
                print " ".join(run_unhide_program)
                success = os.system(" ".join(run_unhide_program))
                if int(success) == 0:
                    no_of_rows = self.ui.tableWidget_for_unhide_message_files.rowCount()
                    i = 0
                    self.message_filenames = []
                    while i < no_of_rows:
                        ith_file = self.ui.tableWidget_for_unhide_message_files.takeItem(i, 0).data(0).toString()
                        self.ui.tableWidget_for_unhide_message_files.setItem(i, 0, QtGui.QTableWidgetItem(ith_file))
                        self.message_filenames.append(str(ith_file))
                        self.unhide_password = str(
                            self.crypto.encrypt(
                                str(self.ui.lineEdit_unhide_password.text()),
                                str(self.ui.lineEdit_unhide_password.text()),
                            )
                        )
                        self.crypto.decrypt_file(
                            str("./temp/" + ith_file),
                            str(str(self.output_folder) + "/" + ith_file),
                            self.unhide_password,
                        )
                        i = i + 1
            else:
                run_unhide_program.append("".join(['"', "".join([str(self.output_folder), "/"]), '"']))
                success = os.system(" ".join(run_unhide_program))
            print " ".join(run_unhide_program)
            for i in os.listdir("./temp/resolve/"):
                try:
                    os.remove("./temp/resolve/" + i)
                except:
                    pass
            for i in os.listdir("./temp/"):
                try:
                    os.remove("./temp/" + i)
                except:
                    pass
            if int(success) == 0:
                QtGui.QMessageBox.information(
                    self,
                    "File(s) Successfully Extracted!",
                    "Unhide Operation Completed Successfully.\nCongratulations!!.",
                )
                return 0
            else:
                QtGui.QMessageBox.information(
                    self,
                    "Error!",
                    "Sorry the unhide operation failed.\nPlease ensure that you have entered the password correctly.\nIf problems still exists, report to developers by e-mail.",
                )
                return 1

    def extract_header(self):
        self.carrier_filename = str(self.ui.label_carrier_file_path.text())
        if self.carrier_filename == "No File Selected":
            QtGui.QMessageBox.information(
                self,
                "Please Select a Carrier File!",
                "No Carrier File selected.\nPlease Select a Carrier file to continue.",
            )
            return 1
        ### extract the header ###
        run_unhide_program = ["./extract.out"]
        run_unhide_program.append("".join(['"', str(self.carrier_filename), '"']))
        success = os.system(" ".join(run_unhide_program))
        self.header = []
        for line in open("./HeaderInfo.h", "r"):
            self.header.append(str(line).split("\n")[0])
        try:
            os.remove("./HeaderInfo.h")
        except:
            pass
        ### extracted ###
        if self.unhide_password_character_status == "Yes" and str(self.ui.lineEdit_unhide_password.text()) != "":
            self.unhide_password = str(
                self.crypto.encrypt(
                    str(self.ui.lineEdit_unhide_password.text()), str(self.ui.lineEdit_unhide_password.text())
                )
            )
            if int(self.header[3]) == 0:
                QtGui.QMessageBox.information(
                    self, "Incorrect Password!", "Please check the password you have entered."
                )
                return 1
            else:
                if self.unhide_password != self.header[6]:
                    QtGui.QMessageBox.information(
                        self, "Incorrect Password!", "Please check the password you have entered."
                    )
                    return 1
            i = 0
            no_of_rows = self.ui.tableWidget_for_unhide_message_files.rowCount()
            for filename in self.header[10::4]:
                if i >= no_of_rows:
                    self.ui.tableWidget_for_unhide_message_files.insertRow(i)
                self.ui.tableWidget_for_unhide_message_files.setItem(i, 0, QtGui.QTableWidgetItem(filename))
                i = i + 1
            i = 0
            for filesize in self.header[7::4]:
                self.ui.tableWidget_for_unhide_message_files.setItem(i, 1, QtGui.QTableWidgetItem(filesize))
                i = i + 1
            i = 0
            for encryption in self.header[9::4]:
                if int(encryption) != 0:
                    self.ui.tableWidget_for_unhide_message_files.setItem(i, 2, QtGui.QTableWidgetItem("Yes"))
                else:
                    self.ui.tableWidget_for_unhide_message_files.setItem(i, 2, QtGui.QTableWidgetItem("No"))
                i = i + 1
            row_number = i
            while i < no_of_rows:
                self.ui.tableWidget_for_unhide_message_files.removeRow(row_number)
                i = i + 1
        elif int(self.header[3]) != 0:
            QtGui.QMessageBox.information(self, "Incorrect Password!", "Please check the password you have entered.")
            return 1
        else:
            i = 0
            no_of_rows = self.ui.tableWidget_for_unhide_message_files.rowCount()
            for filename in self.header[8::4]:
                if i >= no_of_rows:
                    self.ui.tableWidget_for_unhide_message_files.insertRow(i)
                self.ui.tableWidget_for_unhide_message_files.setItem(i, 0, QtGui.QTableWidgetItem(filename))
                i = i + 1
            i = 0
            for filesize in self.header[5::4]:
                self.ui.tableWidget_for_unhide_message_files.setItem(i, 1, QtGui.QTableWidgetItem(filesize))
                i = i + 1
            i = 0
            for encryption in self.header[7::4]:
                if int(encryption) != 0:
                    self.ui.tableWidget_for_unhide_message_files.setItem(i, 2, QtGui.QTableWidgetItem("Yes"))
                else:
                    self.ui.tableWidget_for_unhide_message_files.setItem(i, 2, QtGui.QTableWidgetItem("No"))
                i = i + 1
            row_number = i
            while i < no_of_rows:
                self.ui.tableWidget_for_unhide_message_files.removeRow(row_number)
                i = i + 1
        print self.header