如何創建正確的 Blowfish 填充?
我在 ecb 模式下使用 OpenSSL 庫進行 Blowfish 加密。消息已加密,但填充錯誤,因此我在解密時遇到問題。我究竟做錯了什麼?
我檢查了:
http://sladex.org/blowfish.js/
和爪哇。
應該是:
Kl9SMj1A42I48uWYTeBuD9rERDGhuvbbp07+4QwPhtk=
我明白了:
Kl9SMj1A42I48uWYTeBuD9rERDGhuvbbLUwFXarEOq39/f39
#include <iostream> #include <string> #include "Base64.h" #include <openssl/blowfish.h> int main() { // blowfish key const char *key = "topsecret"; const unsigned char* in = (const unsigned char*)"hello world how are you today"; BF_KEY bfKey; BF_set_key(&bfKey, strlen(key), (const unsigned char*)key); size_t InSize = strlen((char*)in) + 1; size_t OutSize = ((InSize + 7) / 8) * 8; unsigned char *out = (unsigned char *)malloc(OutSize); unsigned char *outnext = out; //Encryption while (InSize >= 8) { BF_ecb_encrypt(in, outnext, &bfKey, BF_ENCRYPT); in += 8; outnext += 8; InSize -= 8; } if (InSize > 0) { // Cope with non-octal length unsigned char buf8[8]; memcpy(buf8, in, InSize); for (int i = InSize; i < 8; i++) { buf8[i] = ((int)'0'); } BF_ecb_encrypt(buf8, outnext, &bfKey, BF_ENCRYPT); } std::cout << Base64::base64_encode(out, strlen((char *)out)) << std::endl; std::cin.get(); return 0; }
Base64:
我在 ecb 模式下使用 OpenSSL 庫進行 Blowfish 加密。
$$ … $$我究竟做錯了什麼?
您正在使用 ECB 模式並且沒有身份驗證。
但至於問題本身。
您的輸入長度是 29+1 字節,應該填充到 32 字節,這應該是
ceil(32/3*4) = ceil(42.67) = 43
base64 編碼時的字元,加上 1=
到四捨五入。您連結到的站點的輸出似乎具有該長度,但您的程式碼輸出看起來像 48 個字元或 36 個字節。額外的字節似乎從某個地方出現。使用此呼叫生成輸出
base64_encode
:unsigned char *out = (unsigned char *)malloc(OutSize); base64_encode(out, strlen((char *)out))
長度由 確定
strlen
。但是out
緩衝區中的數據是否以零字節結束?我在任何地方都看不到那個終止符,所以它可能是那個strlen
,因此base64_encode
讀過了緩衝區。檢查strlen
輸出是什麼,與OutSize
.無論如何,密碼的輸出也可能包含零字節,所以我認為你根本不應該在
strlen
這裡使用。此外,您使用的填充會破壞明文的長度。也就是說,
foobar
並且foobar0
填充到相同的字元串,foobar00
並且沒有辦法將它們區分開來。您可能需要考慮其他一些填充方法。(基本上,在填充本身中對填充的長度進行編碼,這意味著您可能需要填充一個完整的塊。)