# 安裝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) ```