使用 Crypto++ 進行資料的加解密

這篇算是簡單紀錄一下,前陣子透過 Crypto++ 這個 C++ 的函式庫(官網GitHub)來進行資料加密、解密的紀錄。不過由於 Heresy 和密碼學不熟,所以這邊不會去解釋原理或各種方法,單純是針對怎麼用來做紀錄。

Crypto++ 基本的 header 檔案是 cryptlib.h,主要的 namespace 是 CryptoPP,在使用的時候基本上一定會用到;但是之後根據要使用的演算法,則也還需要另要加上個別的 header 才行。

而在要使用 Crypto++ 加解密的時候,要先決定要用哪種運作模式(mode、官方文件)、以及哪種 block cipher,然後才產生用來加解密的處理器。

閱讀更多»

C++ 的 forward declaration

這邊稍微來講一下 C++ 的 forward declaration(維基百科C++ Reference)。

Forward declaration 的基本概念,以類別來說,就是先告訴編譯器有這樣一個類別存在(宣告),但是這個時候還先不告訴你他的實際內容(定義);在這個狀況下,這個類別會是「incomplete type」,可以有限度地使用。

如果兩個類別要使用到彼此的時候,通常就會需要用到這種技巧,下面就是 C++ Reference 給的一個例子:

class Vector; // forward declaration
 
class Matrix
{
  // ...
  friend Vector operator*(const Matrix&, const Vector&);
};
 
class Vector
{
  // ...
  friend Vector operator*(const Matrix&, const Vector&);
};

閱讀更多»

Windows 環境的 libcurl https 支援

cURL 是一個很知名的開源專案(官網),他主要的功能是用來存取包含 Http、FTP、SMTP 等在內通訊協定的命令提示字元工具,在 Linux 環境算是相當常用到的。

而同時,他也有 libcurl 這個 C 語言的函式庫(官網),讓開發者可以透過它還存取網路上的 資源。

而 Heresy 這次會要用他,主要是要去下載 https 的檔案,但是一開始用 CMake 來建置的時候,卻發現真的去開 https 的時候,卻出現了不支援的錯誤…

curl_easy_perform() failed: Unsupported protocol

閱讀更多»

C++ 23 可以回傳值或錯誤的 std::expected

之前在《更多元的函式回傳型別:optional 與 outcome》這篇文章中,曾經提過在函式需要回傳計算的結果,但是又可能需要回傳處理的狀態(包含錯誤)的時候,除了可以使用簡單的 C++17 的 std::optional 來處理沒有辦法回傳值的狀況外,下面就是一個簡單的例子:

#include <iostream>
#include <optional>
 
std::optional<int> compute_opt(const int input)
{
  if (input == 0 || input > 100)
    return std::nullopt;
 
  return 100 / input;
}
 
int main(int argc, char** argv)
{
  auto optRes = compute_opt(101);
  if (optRes)
    std::cout << "OK: " << *optRes << std::endl;
  else
    std::cout << "Error" << std::endl;
}

閱讀更多»

C++17 的 structured binding declaration

這篇來講一下,在 C++17 的時候,加入的一個還算滿好用的功能、structured binding declaration(文件)。

Structured binding declaration 在 Heresy 來看,主要的目的是讓開發者可以快速地將擁有多項資料的物件中拿出來使用。

像是以 std::tuple<> 來說,如果要把每一筆資料都拿出來的話,標準的作法是透過 std::get<>() 來一個一個拿,或是透過 std::tie() 來做一定程度的簡化。

而如果透過 structured binding declaration 的話,則可以進一步簡化成:

閱讀更多»