ビッグ エンディアン コンピュータとリトル エンディアン コンピュータの間で Blowfish 暗号化を必要とする FTP プログラムを作成しています。これが、暗号化を行うために使用しているコードです。 ご覧のとおり、コード内ですでにエンディアンが考慮されています。問題は、あるマシンで暗号化してから異なるエンディアンのマシンで復号化すると、結果が間違っていることです。
現在、単純なテストケースのために、暗号化された文字列をファイルに書き込んでから、他のマシン (共有メモリ) に読み込んでいます。
私が作成した 2 つのヘルパー メソッドを次に示します (かなり単純明快です)。
//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;
}
ご覧のとおり、キーはハードコードされているため同じですが、出力は依然として間違っています。2 台のマシン間のすべての組み合わせ (blowfish.h 内) で手動で WordByte を割り当てようとしましたが、うまくいきませんでした。