---
# System prepended metadata

title: OpenSSL
tags: [雲林科大]

---

#    安裝OpenSSL
在 macOS 上使用 Homebrew 安裝 OpenSSL 是一個簡單的過程。以下是基本步驟：


##    Windows安裝
[OPENSSL](https://www.cjkuo.net/window_install_openssl/)





1. 首先，打開你的終端應用程序。

2. 如果你還沒有安裝 Homebrew，你需要先安裝它。在終端中執行以下命令來安裝 Homebrew（如果已安裝，則跳過此步驟）：
   ```bash
   /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
   ```
   安裝過程中可能會要求你輸入你的 macOS 用戶密碼。

3. 安裝好 Homebrew 之後，就可以安裝 OpenSSL 了。在終端中執行以下命令來安裝 OpenSSL：
   ```bash
   brew install openssl
   ```

4. 安裝完成後，你可以使用以下命令來確認 OpenSSL 是否成功安裝並查看安裝的版本：
   ```bash
   openssl version
   ```

有時候，系統可能還會安裝有其他版本的 OpenSSL，或者你可能需要配置特定的應用程序來使用 Homebrew 安裝的 OpenSSL 版本。在這種情況下，你可能需要設定環境變量或者在編譯時指定 OpenSSL 的路徑。可以使用 `brew info openssl` 命令來查看有關如何使用安裝的 OpenSSL 的更多信息，包括配置指引和路徑信息。

#    OpenSSL 加密方式

### 步驟 1: 創建明文文件

我們將創建一個名為 `example.txt` 的文件，其內容為 "Hello, this is a test."。

### 步驟 2: 執行加密和解密

您將會使用 OpenSSL 命令進行以下操作：

首先，我們先創建一個名為 `example.txt` 的文件並輸入示例文本。

```sh
echo "Hello, this is a test." > example.txt
```

以下是加密和解密過程的命令教學：

#### DES 加密

```sh
openssl des-ecb -e -in example.txt -out encrypted_des.out -k password
```

這個命令會使用 DES 加密算法和 ECB 模式將 `example.txt` 加密並將加密結果儲存到 `encrypted_des.out`。

#### DES 解密

```sh
openssl des-ecb -d -in encrypted_des.out -out decrypted_example.txt -k password
```

此命令將使用您提供的密碼解密 `encrypted_des.out` 並將解密的文本保存到 `decrypted_example.txt`。

#### TDES 加密

```sh
openssl des-ede3 -e -in 3DES.txt -out encrypted_tdes.out -k password
```

類似地，這將使用 3DES 算法加密文件。

#### TDES 解密

```sh
openssl des-ede3 -d -in encrypted_tdes.out -out decrypted_example.txt -k password
```

#### AES-128-ECB 加密

```sh
openssl aes-128-ecb -e -in example.txt -out encrypted_extra.txt -k password
```

這個命令使用 AES-128 加密和 ECB 模式。

#### AES-128-ECB 解密

```sh
openssl aes-128-ecb -d -in  encrypted_extra.txt -out decrypted_example.txt -k password
```



#### 生成 RSA 私鑰

```sh
openssl genrsa -out rsa_privatekey.pem -passout pass:password -des3 1024
```

這將生成一個 1024 位的 RSA 私鑰。

#### 生成 RSA 公鑰

```sh
openssl rsa -in rsa_privatekey.pem -passin pass:password -pubout -out rsa_publickey.pem
```

這將根據您的私鑰生成公鑰。

#### 利用公開金鑰加密

```sh
openssl rsautl -encrypt -pubin -inkey rsa_publickey.pem -in example.txt -out encrypted_rsa.txt
```

#### 利用私密金鑰解密

```sh
openssl rsautl -decrypt -inkey rsa_privatekey.pem -in encrypted_rsa.txt -out decrypted_example.txt
```

#### CHACHA加密

```sh
openssl enc -chacha20 -e -in CHA.txt -out ciphertext.bin -k password
```

#### CHACHA解密

```sh
openssl enc -chacha20 -d -in encrypted_cha.bin -out decrypted.txt -k password
```


## 產生憑證

### 步驟 1: 創建私鑰

打開終端或命令提示符，運行以下命令來生成一個新的RSA私鑰：

```shell
openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048
```

這將創建一個2048位的RSA私鑰文件`private.key`。

### 步驟 2: 生成證書簽名請求（CSR）

使用私鑰生成CSR。CSR是向CA申請證書時需要提交的。

```shell
openssl req -new -key private.key -out certificate.csr
```

運行此命令後，系統會提示您輸入證書的詳細信息，如國家名稱、組織名稱等。這些信息在證書簽名過程中被用作證書的主題。

### 步驟 3: 創建自簽名證書（可選）

如果您不需要第三方CA簽名的證書，可以創建一個自簽名證書。使用以下命令：

```shell
openssl req -x509 -sha256 -days 365 -key private.key -in certificate.csr -out certificate.crt
```

這將創建一個有效期為365天的自簽名證書`certificate.crt`。

### 步驟 4: 將CSR提交給CA（如果需要第三方簽名的證書）

如果您需要一個由CA簽名的證書，您需要將步驟3生成的`certificate.csr`文件提交給CA。CA處理您的請求後，會給您一個簽名的證書。

### 額外步驟：查看證書內容

您可以使用以下命令查看證書的詳細信息：

```shell
openssl x509 -in certificate.crt -text -noout
```



#    0312作業
要實現混合加密方法，您可以按照以下步驟操作。這個過程結合了非對稱加密（如RSA）和對稱加密（如AES）的優點，既保障了加密過程的安全性，也確保了效率。

### 1. 生成RSA密鑰對

首先，您需要有一對RSA密鑰（一個公鑰和一個私鑰）。您已經有了公鑰和私鑰，如果沒有，可以使用以下OpenSSL命令生成：

```bash
openssl genrsa -out private_key.pem 4096
openssl rsa -pubout -in private_key.pem -out public_key.pem
```

### 2. 選擇一個對稱加密算法並生成密鑰

接下來，選擇一個對稱加密算法，例如AES，然後生成一個隨機的密鑰。這個密鑰將用於加密實際的數據。您可以使用OpenSSL或其他工具生成這個密鑰，也可以在您的程序中直接生成。

例如，生成一個256位的AES密鑰：

```bash
openssl rand -out aes_key.bin 32 # 生成一個256位（32字節）的隨機密鑰
```

### 3. 使用對稱密鑰加密數據

使用生成的對稱密鑰（AES密鑰）來加密實際的數據。可以使用OpenSSL的命令行工具，或在您的程序中使用一個加密庫來做這件事。

```bash
openssl enc -aes-256-cbc -salt -in your_data.txt -out your_data.enc -pass file:./aes_key.bin
```

這裡`your_data.txt`是您要加密的數據，`your_data.enc`是加密後的數據。

### 4. 使用RSA公鑰加密對稱密鑰

既然數據已經用對稱密鑰加密，現在使用RSA公鑰來加密這個對稱密鑰。這樣，只有擁有對應私鑰的接收者才能解密出這個對稱密鑰，進而用它解密數據。

```bash
openssl rsautl -encrypt -pubin -inkey public_key.pem -in aes_key.bin -out encrypted_aes_key.bin
```

### 5. 分發加密數據和加密後的對稱密鑰

現在，您可以安全地分發加密後的數據(`your_data.enc`)和加密後的對稱密鑰(`encrypted_aes_key.bin`)。接收方需要私鑰來解密對稱密鑰，然後用這個對稱密鑰來解密數據。

### 6. 接收方解密對稱密鑰和數據

接收方首先使用RSA私鑰解密出對稱密鑰，然後用這個對稱密鑰解密數據。

解密對稱密鑰：

```bash
openssl rsautl -decrypt -inkey private_key.pem -in encrypted_aes_key.bin -out decrypted_aes_key.bin
```

使用解密後的對稱密鑰解密數據：

```bash
openssl enc -d -aes-256-cbc -in your_data.enc -out decrypted_data.txt -pass file:./decrypted_aes_key.bin
```

通過這個流程，您可以安全高效地加密和傳輸大量數據。使用

RSA加密對稱密鑰，而對稱密鑰則用來加密實際的數據，結合了兩種加密方法的優勢。

#    0319實作1
在公鑰基礎設施（PKI）中，根證書交叉認證指的是兩個獨立PKI之間建立信任關係的過程，其中一個PKI的根證書由另一個PKI簽名，反之亦然。這樣，兩個PKI中的用戶可以相互驗證對方的證書，從而實現跨PKI的信任。下面是如何通過OpenSSL實現兩個PKI之間的根證書交叉認證的步驟：

### 預備步驟
確保你已經有兩個PKI，每個PKI都有自己的根證書和私鑰。我們將它們稱為PKI A和PKI B。

#### 步驟 1: 創建私鑰

打開終端或命令提示符，運行以下命令來生成一個新的RSA私鑰：

```shell
openssl genpkey -algorithm RSA -out rootA.key -pkeyopt rsa_keygen_bits:2048
```

這將創建一個2048位的RSA私鑰文件`rootA.key`。

#### 步驟 2: 生成證書簽名請求（CSR）

使用私鑰生成CSR。CSR是向CA申請證書時需要提交的。

```shell
openssl req -new -key rootA.key -out rootA.csr
```
####    創建自簽署的根證書

```
openssl req -x509 -sha256 -new -nodes -key rootA.key -days 3650 -out rootA.crt

```

### 步驟 1: 為PKI A的根證書生成證書簽名請求（CSR）

1. 使用PKI A的根私鑰生成CSR。假設PKI A的根私鑰文件為`rootA.key`，你可以使用以下命令生成CSR：

```shell
openssl req -new -key rootA.key -out rootA.csr
```

### 步驟 2: 使用PKI B的根證書和私鑰簽名PKI A的CSR

1. 假設PKI B的根證書文件為`rootB.crt`，根私鑰文件為`rootB.key`，使用PKI B的根私鑰對PKI A的CSR進行簽名：

```shell
openssl x509 -req -days 365 -in rootA.csr -CA rootB.crt -CAkey rootB.key -CAcreateserial -out crossCertA.crt
```

這將創建一個由PKI B簽名的PKI A的根證書，我們稱之為交叉證書`crossCertA.crt`。

### 步驟 3: 為PKI B的根證書生成證書簽名請求（CSR）

1. 與步驟1類似，使用PKI B的根私鑰生成CSR。假設PKI B的根私鑰文件為`rootB.key`：

```shell
openssl req -new -key rootB.key -out rootB.csr
```

### 步驟 4: 使用PKI A的根證書和私鑰簽名PKI B的CSR

1. 假設PKI A的根證書文件為`rootA.crt`，根私鑰文件為`rootA.key`，使用PKI A的根私鑰對PKI B的CSR進行簽名：

```shell
openssl x509 -req -days 365 -in rootB.csr -CA rootA.crt -CAkey rootA.key -CAcreateserial -out crossCertB.crt
```

這將創建一個由PKI A簽名的PKI B的根證書，我們稱之為交叉證書`crossCertB.crt`。

### 完成

至此，你已經完成了兩個PKI之間的根證書交叉認證。`crossCertA.crt`和`crossCertB.crt`分別是由對方PKI簽名的根證書。將這些交叉證書導入到各自的信任存儲中，可以使兩個PKI的用戶相互驗證對方的證書，從而實現跨PKI的信任。
#    0319實作2

使用證書進行加密主要是指使用證書中的公鑰進行加密，以確保只有持有對應私鑰的人能夠解密信息。這個過程通常涉及公鑰加密和私鑰解密。在我們的場景中，如果你想讓只有兩個人（持有兩個交叉認證根證書的私鑰的人）能夠共享加密的秘密，你可以按照以下步驟操作：


### 步驟 1: 提取接收者的公鑰

首先，你需要從接收者的證書中提取公鑰。假設接收者的證書為 `receiver.crt`：

```shell
openssl x509 -pubkey -noout -in crossCertB.crt > rootB_pub.key
```

### 步驟 2: 使用接收者的公鑰加密數據


1. **手動生成對稱密鑰**：

   為簡化流程，我們可以直接使用 OpenSSL 生成一個隨機的對稱密鑰，並同時使用這個密鑰來加密我們的數據（`secret.txt`）。我們將直接在命令行中完成這個步驟，而不是將密鑰保存到一個文件中。這意味著我們會在一個命令中生成密鑰，並將其用於加密文件，但這個密鑰不會直接被存儲為一個文件。不過，為了後續步驟，我們需要將密鑰保存下來，所以這裡我們會先生成一個密鑰，然後用它來加密文件。

   首先，生成一個256位的隨機密鑰：

   ```shell
   openssl rand -base64 32 > symmetric.key
   ```

   這個命令會生成一個256位的隨機數，然後保存在 `symmetric.key` 文件中。

2. **使用該對稱密鑰加密文件**：

   接下來，使用生成的密鑰來加密你的文件。我們將使用 AES-256-CBC 算法：

   ```shell
   openssl enc -aes-256-cbc -salt -in secret.txt -out secret.txt.enc -pass file:symmetric.key
   ```

   這會創建一個加密的版本 `secret.txt.enc`。

### 使用接收者的公鑰加密對稱密鑰

既然我們已經有了 `symmetric.key` 文件，我們可以使用接收方的公鑰來加密這個密鑰。

1. **加密對稱密鑰**：

   假設你已經按照前面的步驟提取了接收方（rootB）的公鑰到 `rootB_pub.key`：

   ```shell
   openssl rsautl -encrypt -inkey rootB_pub.key -pubin -in symmetric.key -out encrypted_key.bin
   ```

   這將使用 `rootB` 的公鑰加密對稱密鑰，並保存加密後的密

這樣，只有接收者才能使用他們的私鑰解密 `encrypted_key.bin` 中的對稱密鑰。

### 步驟 3: 接收者使用私鑰解密對稱密鑰

接收者首先需要使用自己的私鑰解密對稱密鑰：

```shell
openssl rsautl -decrypt -inkey rootB.key -in encrypted_key.bin -out decrypted_symmetric.key
```

### 步驟 4: 使用對稱密鑰解密數據

然後，接收者可以使用解密後的對稱密鑰來解密 `secret.txt.enc`：

```shell
openssl enc -aes-256-cbc -d -in secret.txt.enc -out secret_decrypted.txt -pass file:decrypted_symmetric.key
```

這樣，只有擁有接收者私鑰的人才能解密並訪問 `secret.txt` 的內容，實現了只有兩個人共

享這個秘密的目的。

##    HMAC

- HEX 格式的金鑰

    方法 1：使用 `openssl rand` 產生隨機 HEX 金鑰

    ```sh
    openssl rand -hex 16  # 產生 16 bytes (128-bit) 的金鑰
    ```

    **範例輸出 (隨機生成的 16 字節密鑰)**：
    ```
    a3f1c4b72e8d0a5f3c9d7b6a2e1c8f4b
    ```
    如果你想要產生 **32 bytes (256-bit) 密鑰**
    ```sh
    openssl rand -hex 32
    ```

    **範例輸出 (隨機生成的 32 字節密鑰)**：
    ```
    5e4a3f9c2b8d1e0a7c6d3b9f1a4c8e2d5f1b7a3c9d0e6a2
    ```
    
    方法 2：手動將普通金鑰轉換為 HEX**
    
    如果你已經有一個金鑰（例如 `b"my_secret_key"`），你可以使用 `xxd` 或 `hexdump` 來轉換：
    ```sh
    echo -n "my_secret_key" | xxd -p
    ```

    **輸出**：
    ```
    6d795f7365637265745f6b6579
    ```
    

- 使用以下 OpenSSL 指令：

  ```sh
  echo -n "Hello, world!" | openssl dgst -sha256 -hmac "secret_key"
  ```
  ```sh
  echo -n "Hello, world!" | openssl dgst -sha512 -hmac "secret_key"
  ```
  
  
- 使用 HEX 格式的金鑰

    ```sh
    echo -n "message" | openssl dgst -sha256 -mac HMAC -macopt hexkey:5f4dcc3b5aa765d61d8327deb882cf99
    ```


 - **範例輸出**
    ```
    (stdin)= 8c7dd922ad47494fc02c388e12c00eac
    ```
    
- Windows環境建議作法：建立一個UTF-8的文字檔
`openssl dgst -sha256 -hmac "secret_key" text.txt`
- 使用Python：
    ```python
    import hmac
    import hashlib

    message = b"message"
    key = "secret_key".encode("utf-8")

    hmac_result = hmac.new(key, message, hashlib.sha256).hexdigest()
    print(hmac_result)
    ```








