From ee1fe605ce0df9c05db0aa557a1ecece7686caae Mon Sep 17 00:00:00 2001 From: Micke Nordin Date: Sun, 10 Jan 2010 00:25:20 +0100 Subject: [PATCH] initial commit --- Makefile | 14 ++++++ main.cpp | 45 +++++++++++++++++++ mnenc.cpp | 65 +++++++++++++++++++++++++++ mnenc.hpp | 42 +++++++++++++++++ mnencd.cpp | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mnencd.o | Bin 0 -> 58552 bytes password.cpp | 60 +++++++++++++++++++++++++ password.hpp | 39 ++++++++++++++++ 8 files changed, 407 insertions(+) create mode 100755 Makefile create mode 100644 main.cpp create mode 100644 mnenc.cpp create mode 100644 mnenc.hpp create mode 100644 mnencd.cpp create mode 100644 mnencd.o create mode 100644 password.cpp create mode 100644 password.hpp diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..3fdbbe9 --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +encryptor : main.o password.o mnenc.o + g++ -o mnenc -g -Wall main.o password.o mnenc.o + +main.o: main.cpp password.hpp mnenc.hpp + g++ -c -g -Wall main.cpp + +password.o: password.cpp password.hpp + g++ -c -g -Wall password.cpp + +encryptor.o: mnenc.cpp mnenc.hpp + g++ -c -g -Wall mnenc.cpp + +clean: + rm *.o mnenc diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..6ec947d --- /dev/null +++ b/main.cpp @@ -0,0 +1,45 @@ +// main.cpp +// +// Copyright 2010 Micke Nordin +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301, USA. + + + +#include "mnenc.hpp" +#include "password.hpp" + +int main(int argc, char** argv) +{ + mnenc menc = mnenc(); + if(argc == 1) { + menc.genkey("MittMaster lösenord0092992££$$€"); + std::cout << "Genererar key från hårdkodad lösenord\n"; + } else { + menc.genkey(argv[1]); + std::cout << "Genererar key från medskickat lösenord\n"; + + } + std::string dec ="HarTestarJag LITE0123456789]][[[++++099"; + std::string key = menc.get_key(); + std::string enc = menc.encrypt(key, dec); + password pw = password(enc, dec, key); + pw.to_string(); + pw.to_file("Passwdtest.txt"); + pw.from_file("Passwdtest.txt"), + pw.to_string(); + return 0; +} diff --git a/mnenc.cpp b/mnenc.cpp new file mode 100644 index 0000000..92d6dc2 --- /dev/null +++ b/mnenc.cpp @@ -0,0 +1,65 @@ +// mnenc.cpp +// +// Copyright 2010 Micke Nordin +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301, USA. + + + +#include +#include +#include +#include +#include +#include "mnenc.hpp" + +mnenc::mnenc() { + key = ""; +} + +void mnenc::genkey(std::string str) { + key = str + str + str + str + str + str + str + str + str; +} + +std::string mnenc::encrypt(std::string key, std::string str) { + for(int i=0; i < (signed) str.size(); i++) { + str[i]=str[i]^key[i]; + } + return str; +} + +std::string mnenc::decrypt(std::string key, std::string passwd) { + for(int i=0; i < (signed) passwd.size(); i++) { + passwd[i] = key[i] ^ passwd[i]; + } + return passwd; +} +std::string mnenc::get_key() { + if(key != "") { + return key; + } else { + std::cerr << "Error: No key generated."; + return key; + } +} + + + + + + + + diff --git a/mnenc.hpp b/mnenc.hpp new file mode 100644 index 0000000..28ecd83 --- /dev/null +++ b/mnenc.hpp @@ -0,0 +1,42 @@ +// mnenc.hpp +// +// Copyright 2010 Micke Nordin +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301, USA. + + +#ifndef _mnenc_h_included_ +#define _mnenc_h_included_ +#include +#include +#include +#include +#include + + +class mnenc{ + private: + std::string key; + + public: + mnenc(); + void genkey(std::string str); + std::string encrypt(std::string key, std::string str); + std::string decrypt(std::string key, std::string passwd); + std::string get_key(); +}; + +#endif diff --git a/mnencd.cpp b/mnencd.cpp new file mode 100644 index 0000000..52cdace --- /dev/null +++ b/mnencd.cpp @@ -0,0 +1,142 @@ +// mdaemon.cpp +// +// Copyright 2010 Micke Nordin +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301, USA. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mnenc.hpp" +#include "password.hpp" + +std::string remove_char(std::string str, char c) { + std::string::size_type k = 0; + while((k=str.find(c,k))!=str.npos) { + str.erase(k, 1); + } + return str; +} + +std::string remove_chars(std::string str) { + std::string chars = " \t\n\b\a-?+\\{[]}'*'"; + for(int i = 0; i < (signed) chars.size(); i++) { + str = remove_char(str, chars[i]); + } + + return str; +} + +std::string make_filename(std::string user, std::string app) { + return remove_chars(app + user); +} +std::string get_password(std::string masterpasswd, std::string user, std::string app) { + mnenc menc = mnenc(); + menc.genkey(masterpasswd); + std::string key = menc.get_key(); + password pw = password("", "", key); + pw.from_file(make_filename(user, app)); + return menc.decrypt(key, pw.get_enc()); +} + +void put_password(std::string masterpasswd, std::string passwd, std::string user, std::string app) { + mnenc menc = mnenc(); + menc.genkey(masterpasswd); + std::string key = menc.get_key(); + password pw = password(menc.encrypt(key, passwd ), "", key); + pw.to_file(make_filename(user, app)); +} + +std::string do_something(std::string str) { + //Nothing here yet + return "Blahonga"; +} + +std::string m_read() { + std::string str; + std::ifstream is("fife"); + getline(is, str); + is.close(); + return str; +} + +void m_send(std::string message) { + std::ofstream os("fife"); + os << message; + os.close(); +} + + +int main(int argc, char** argv) { + /* Our process ID and Session ID */ + pid_t pid, sid; + + /* Fork off the parent process */ + pid = fork(); + if (pid < 0) { + exit(EXIT_FAILURE); + } + /* If we got a good PID, then + we can exit the parent process. */ + if (pid > 0) { + exit(EXIT_SUCCESS); + } + + /* Change the file mode mask */ + umask(0); + + /* Open any logs here */ + + /* Create a new SID for the child process */ + sid = setsid(); + if (sid < 0) { + /* Log the failure */ + exit(EXIT_FAILURE); + } + + + + /* Change the current working directory */ + if ((chdir("/home/micke/.fifo")) < 0) { + /* Log the failure */ + exit(EXIT_FAILURE); + } + + /* Close out the standard file descriptors */ + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + + /* Daemon-specific initialization goes here */ + + mkfifo("./fife", 0777); + + /* The Big Loop */ + while (1) { + m_send(do_something(m_read())); + sleep(1); /* wait 1 second*/ + } + unlink("fife"); + exit(EXIT_SUCCESS); +} diff --git a/mnencd.o b/mnencd.o new file mode 100644 index 0000000000000000000000000000000000000000..f284cdeab325f235bdae3ae56700661f5e0d4c91 GIT binary patch literal 58552 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 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301, USA. + +#include "password.hpp" +#include +#include +password::password(std::string enc, std::string dec, std::string k) { + encryptedpw = enc; + decryptedpw = dec; + key = k; +} +void password::to_string() { + std::cout << "Encrypted: " << encryptedpw << std::endl; + std::cout << "Decrypted: " << decryptedpw << std::endl; +} + +bool password::to_file(std::string filename) { + bool worked = false; + std::ofstream keyfile; + if(keyfile.open(filename.c_str())) { + keyfile << encryptedpw; + keyfile.close(); + worked = true; + } + return worked; +} + +bool password::from_file(std::string filename) { + bool worked = false; + std::ifstream keyfile(filename.c_str()); + std::string k = ""; + std::string line = ""; + if (keyfile.is_open()) { + while (! keyfile.eof() ) { + getline (keyfile,line); + k += line; + } + keyfile.close(); + worked = true; + } + key = k; + return worked; +} + diff --git a/password.hpp b/password.hpp new file mode 100644 index 0000000..51ba65c --- /dev/null +++ b/password.hpp @@ -0,0 +1,39 @@ +// password.hpp +// +// Copyright 2010 Micke Nordin +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301, USA. + + +#ifndef _password_h_included_ +#define _password_h_included_ +#include + +class password { + private: + std::string encryptedpw; + std::string decryptedpw; + std::string key; + public: + password(std::string enc, std::string dec, std::string k); + void to_string(); + std::string get_enc() {return encryptedpw;} + std::string get_dec() {return decryptedpw;} + std::string get_key() {return key;} + bool to_file(std::string filename); + bool from_file(std::string filename); +}; +#endif -- 1.7.9.5