Padding

如何創建正確的 Blowfish 填充?

  • September 28, 2016

我在 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:

http://pastebin.com/DvLt3MPg

我在 ecb 模式下使用 OpenSSL 庫進行 Blowfish 加密。

$$ … $$我究竟做錯了什麼?

您正在使用 ECB 模式並且沒有身份驗證。


但至於問題本身。

您的輸入長度是 29+1 字節,應該填充到 32 字節,這應該是ceil(32/3*4) = ceil(42.67) = 43base64 編碼時的字元,加上 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並且沒有辦法將它們區分開來。您可能需要考慮其他一些填充方法。(基本上,在填充本身中對填充的長度進行編碼,這意味著您可能需要填充一個完整的塊。)

引用自:https://crypto.stackexchange.com/questions/40288