1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
| #include <cstdlib>
#include <iostream>
#include <fstream>
#include <math.h>
#include <gmpxx.h>
using namespace std;
// Chiffrage
// -- selon une clé char
void crypt(char *text, int length, char *key, char *crypted) {
int j = 0;
for (int i = 0; i < length; i++) {
// Lis la clé en boucle
if (i%strlen(key) == 0) {
j=0;
}
// XOR
crypted[i] = text[i] ^ key[j];
j++;
}
}
// -- selon une clé en binary mpz_class
void crypt(char *text, int length, mpz_class key, char *crypted) {
int j = 0;
// Met dans un string (nombre base 10) le grand nombre
// pour être utilisé lors du XOR
string keychar = key.get_str(10);
cout << keychar << endl;
//const char *keychar = keystring.c_str();
//sprintf(keychar, "%39.0i", key);
for (int i = 0; i < length; i++) {
// Lis la clé en boucle
if (i%keychar.length() == 0) {
j=0;
}
// XOR
crypted[i] = text[i] ^ keychar[j];
j++;
}
}
// Puissance avec des mpz_class
mpz_class gmppow(mpz_class X, mpz_class Y) {
mpz_class final=X;
for (mpz_class i=1; i < Y; i++) {
final = final*X;
}
return final;
}
// Conversion d'un char hex en mpz_class (int donc binaire)
mpz_class convert_key_binary(char *key) {
mpz_class result;
result = 0;
for (unsigned int i = 0; i < strlen(key); i++) {
mpz_class tmp;
// On lit de droite à gauche (inverser)
char car = key[ i ];
switch ( car ) {
case '0': tmp = 0; break;
case '1': tmp = 1; break;
case '2': tmp = 2; break;
case '3': tmp = 3; break;
case '4': tmp = 4; break;
case '5': tmp = 5; break;
case '6': tmp = 6; break;
case '7': tmp = 7; break;
case '8': tmp = 8; break;
case '9': tmp = 9; break;
case 'a': tmp = 10; break;
case 'b': tmp = 11; break;
case 'c': tmp = 12; break;
case 'd': tmp = 13; break;
case 'e': tmp = 14; break;
case 'f': tmp = 15; break;
default : cout << "Error"; return 0;
}
// Aditionne selon la règle de la position car*(16^pos)
result += tmp*( gmppow(mpz_class(16), ((strlen(key)-1)-i)) );
}
return result;
}
int main(int argc, char *argv[])
{
// Prend en paramètre fichier src, fichier dst
if (argc != 3) {
cout << "Usage: " << argv[0] << " <fichier src> <fichier dst>" << endl;
system("PAUSE");
return 0;
}
else {
cout << "Fichier d'entree: \t" << argv[1] << endl;
cout << "Fichier en sortie: \t" << argv[2] << endl;
}
char *filename_in = argv[1];
char *filename_out = argv[2];
// Ouverture des fichiers
fstream file_in(filename_in, ios::in|ios::binary);
fstream file_out(filename_out, ios::out|ios::binary);
if (!file_in || !file_out) {
cout << "Impossible d'ouvrir !";
system("PAUSE");
return 0;
}
// Clé en char hex
//char *key = "9cdfb439c7876e703e307864c9167a15";
string keyString;
cout << "Entrez la clef de chiffrage: ";
getline(cin, keyString);
char *key = (char *) keyString.c_str();
int tmplen = strlen(key);
// Teste si la longueur est puissance de 2
if ( ((tmplen & -tmplen) xor tmplen) != 0 ) {
cout << "La longueur de la cle doit etre une puissance de 2." << endl;
system("PAUSE");
return 0;
}
// Convertit la clé en binaire gros int (mpz_class)
mpz_class keyhex = convert_key_binary(key);
cout << keyhex << endl;
// Variable de lecture
int iter = 0;
const int tranche = 192;
char buffer[tranche];
// Determine la longueur du fichier
file_in.seekg(0, ios::end);
int file_inlength = file_in.tellg();
file_in.seekg(0, ios::beg);
// Lis par tranche de tranche octets
while (iter*tranche < file_inlength) {
// Octet actuel
int readByte;
readByte = tranche;
// Faut-il reduire la tranche de read/write
if (iter*tranche+tranche > file_inlength)
readByte = file_inlength-iter*tranche;
strcpy(buffer, "");
// Lis une tranche d'octets, chiffre et écrit
file_in.read(buffer, readByte);
char tmp[readByte];
crypt(buffer, readByte, keyhex, tmp);
file_out.write(tmp, readByte);
iter++;
}
// Ferme les fichiers
file_in.close();
file_out.close();
cout << "\nFini\n";
system("PAUSE");
return 0;
} |
Partager