Я пишу FTP-программу, которая требует шифрования Blowfish между компьютером с прямым порядком байтов и компьютером с прямым порядком байтов. Вот код, который я использую для шифрования. Как видите, он учитывает Endianness уже в коде. Проблема в том, что когда я шифрую на одной машине, а затем дешифрую на машине с другим порядком байтов, результат получается неправильным.
В настоящее время я просто записываю зашифрованную строку в файл, а затем читаю ее на другом компьютере (совместно используемой памяти) для простого теста.
Вот два вспомогательных метода, которые я создал (довольно просто):
//Encrypts string and return encrpted string
void encrypt(Blowfish* BF, unsigned char* whatToEncrypt, int size, unsigned char* encryptionKey){
char* tmp = (char*)malloc(sizeof(char)*(PASSWORD_LENGTH+1));
memcpy(tmp, encryptionKey, (PASSWORD_LENGTH+1));
//Set BF Password
BF->Set_Passwd((char*)tmp);
BF->Encrypt((void *)whatToEncrypt, size);
}
//decrypts enrypted string and returns a string
void decrypt(Blowfish* BF, unsigned char* whatToDecrypt, int size, unsigned char* encryptionKey){
char* tmp = (char*)malloc(sizeof(char)*(PASSWORD_LENGTH+1));
memcpy(tmp, encryptionKey, (PASSWORD_LENGTH+1));
//Set BF Password
BF->Set_Passwd(tmp);
//decrypt
BF->Decrypt((void *)whatToDecrypt, size);
}
Код машины 1:
int main(){
Blowfish BF;
unsigned char* test = new unsigned char[8];
for (int i = 0; i < 8; i++){
test[i] = 'a'+i;
}
unsigned char* test_key = new unsigned char[9];
for (int i = 0; i < 8; i++){
test_key[i] = 'f';
}
test_key[8] = '\0';
cout << "test: " << test<<endl;
encrypt(&BF, test, 8, test_key);
cout << "test: " << test<<endl;
FILE* in = fopen("example.txt", "w");
for (int i = 0; i < 8; i++){
fputc(test[i], in);
}
fclose(in);
}
Код машины 2:
int main(){
FILE* in = fopen("example.txt", "r");
Blowfish BF;
unsigned char* test = new unsigned char[9];
for (int i = 0; i < 8; i++){
test[i] = fgetc(in);
}
test[8] = '\0';
fclose(in);
unsigned char* test_key = new unsigned char[9];
for (int i = 0; i < 8; i++){
test_key[i] = 'f';
}
test_key[8] = '\0';
cout << "test: " << test<<endl;
decrypt(&BF,test, 8, test_key);
cout << "test: " << test<<endl;
}
Как видите, ключ жестко запрограммирован, поэтому он такой же, но результат все равно неправильный. Я попытался вручную назначить WordByte в каждой комбинации (в blowfish.h) между двумя машинами, но безуспешно.
Задача ещё не решена.
Других решений пока нет …