使用 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&);
};

閱讀更多»

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 的話,則可以進一步簡化成:

閱讀更多»

C++11 新的容器:array、沒排序的 set 與 map

C++11 應該算是 C++ 改變最大的版本,而針對 C++11 的東西其實 Heresy 已經寫了不少了,但是實際上還是沒有能把想記錄的東西都寫過一遍。

而這一篇呢,則是來寫一下 C++11 新加入的六種容器:

閱讀更多»

C++20 std::format part 3 – 自定義型別的處理

這系列應該是最後一篇了。在講完了基本的使用、還有一些其他的函式,最後這邊來講一下要怎麼針對自己定義的型別、或是官方沒支援的型別做處理、讓他可以用在 std::format 上。

不過 Heresy 這邊也必須講一下,Heresy 自己沒有找到針對這部分比較完整的說明、範例,所以其實這裡的東西大多是網路上找了很多範例、自己拼湊出來的,其實也不太能保證都正確,只能說在 MSVC 上可以正常運作。

如果哪裡有寫錯的話,也希望可以告知一下。

閱讀更多»