diff --git a/.gitignore b/.gitignore
index 4d90da4e5050c8556186f981186d08439ed83fec..72195967286deafd34b13ce10f094288a077efe6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@
 *.swo
 playunfair
 *.out
+cypher
diff --git a/Makefile b/Makefile
index 35b6ece2bce2948645cfd67785724fc278704f56..2dfe385ce50a2b410d6dd713d70cd458eb510ec9 100644
--- a/Makefile
+++ b/Makefile
@@ -5,18 +5,23 @@ INCL = -I ./include
 
 DEPS = include/*
 
-OBJ = playfair.o playunfair.o
+OBJ = playfair.o
 
-EXEC = playunfair
+EXEC = playunfair cypher
 
-$(EXEC): $(OBJ)
-	$(CC) $(CFLAGS) -o $@ $^
+all: $(EXEC)
+
+playunfair: $(OBJ)
+	$(CC) $(CFLAGS) -o $@ $^ $@.o
+
+cypher: $(OBJ)
+	$(CC) $(CFLAGS) -o $@ $^ $@.o
 
 %.o: %.cpp $(DEPS)
 	$(CC) $(CFLAGS) -c -o $@ $< $(INCL)
 
-all: $(EXEC)
 
 clean:
-	rm -f $(OBJ) playunfair
+	rm -f $(OBJ) $(EXEC)
+
 
diff --git a/cypher.cpp b/cypher.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e4eb5e0b4906fe6d476a04cdcfa660d5f0aba182
--- /dev/null
+++ b/cypher.cpp
@@ -0,0 +1,51 @@
+#include "include/playunfair.h"
+#include <fstream>
+
+
+int main(int argc, char *argv[]){
+	if(argc!=3){
+		std::cout << "Uso: ./playunfair <file-in> <key>" << std::endl;
+		return 0;
+	}
+	std::fstream input, keyF;
+	char *inputName, *keyName;
+	std::string aux="", key, crip;
+	std::ostringstream text, keys;
+
+	inputName = argv[1];
+	keyName = argv[2];
+
+	input.open(inputName, std::ifstream::in);
+	if(!input.good()){
+		std::cout << "Nao foi possivel abrir o arquivo de entrada" << std::endl;
+		return 0;
+	}
+
+	while(std::getline(input, aux))
+		 text << aux;
+
+	//TODO: tirar caracteres especiais
+	crip = text.str();
+	parser(crip);
+	//std::cout << crip << std::endl;
+
+	keyF.open(keyName, std::ifstream::in);
+	if(!keyF.good()){
+		std::cout << "Nao foi possivel abrir o dicionario" << std::endl;
+		return 0;
+	}
+
+	//TODO: if filter returns accepted print key and text in file
+	std::getline(keyF, aux);
+	keys << aux;
+	key = keys.str();
+	crip = playfair(crip, key, CRYPT);
+	std::cout << crip << std::endl;
+	return 0;
+}
+
+void parser(std::string &text){
+	text.erase(std::remove(text.begin(), text.end(), ' '), text.end());
+	std::transform(text.begin(), text.end(), text.begin(), ::tolower);
+}
+
diff --git a/key.txt b/key.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fbcdd3e37b9c05f65ae70085ea9703b48492ae2c
--- /dev/null
+++ b/key.txt
@@ -0,0 +1 @@
+cachorro
diff --git a/playfair.cpp b/playfair.cpp
index 35bd6202a38ee70f6064f3ebbeebc00ccebb4b13..57cd9d637cc9c3c6c92b0100ae9cc1d324531f9e 100644
--- a/playfair.cpp
+++ b/playfair.cpp
@@ -32,12 +32,12 @@ std::string playfair(std::string text, const std::string key, int crypt){
 	crypt=crypt+5;//Avoid operator % on negative numbers
 	std::ostringstream ret;
 	std::vector< char > mKey(createKM(key));
-	for (int i=0; i<5; ++i){
+	/*for (int i=0; i<5; ++i){
 		for (int j=0; j<5; ++j){
 			std::cout << mKey[i*5 + j] << ' ';
 		}
 		std::cout << std::endl;
-	}
+	}*/
 	unsigned int indexT = 0;
 	while(indexT <text.size() ){