首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

模擬安全認證資訊加密解密流程實作

     編輯:關於C++

專案概述

本專案 Encryption_Demo 以程式碼模擬「採用安全認證的資訊加密流程圖」與「解密流程圖」,旨在教學示範完整加密流程的運作邏輯,僅限於程式內部資料傳遞模擬,不涉及實際網路傳輸。

核心流程圖說明

圖一 加密流程圖

圖一:採用安全認證的資訊加密流程圖

圖二 解密流程圖

圖二:採用安全認證技術的資訊解密過程圖

圖三 加密文字說明

圖三:加密流程文字說明

圖四 解密文字說明

圖四:解密流程文字說明

關鍵技術細節:位元組陣列偏移量計算

程式核心在於精確計算各區塊在合併密文中的位移。採用算法如下:

  • MD5 雜湊:固定 16 位元組
  • DES 分組加密:Key 與 IV 各 8 位元組
  • RSA 簽名/加密:簽名長度 128 位元組,加密後輸出 1152 位元組

加密端資料結構分析

// 合併密文結構
加密後的會話密文 (RsaEncryptData) : 1152 bytes
摘要簽章資料 (CombinData)         : 144 bytes (128+8+8)
中間加密資料 (EncryptionData)      : 總長度 - 1152 - 144

解密端時間戳記結構

檔案雜湊長度 : 16 bytes
接收時間     : 23 bytes (固定格式:yyyy-MM-dd HH:mm:ss-ms)
簽名長度     : 128 bytes
總計         : 167 bytes

時間戳記產生關鍵程式碼

public static byte[] GetTimeNow() {
    DateTime now = DateTime.Now;
    UTF8Encoding utf = new UTF8Encoding();
    string month = now.Month < 10 ? "0" + now.Month : now.Month.ToString();
    string day = now.Day < 10 ? "0" + now.Day : now.Day.ToString();
    string ms;
    if (now.Millisecond < 10) ms = "00" + now.Millisecond;
    else if (now.Millisecond < 100) ms = "0" + now.Millisecond;
    else ms = now.Millisecond.ToString();

    string full = $"{now.Year}-{month}-{day} {now.ToLongTimeString()}-{ms}";
    // 例:2004-11-09 13:04:28-108
    return utf.GetBytes(full); // 固定 23 位元組
}

檔案讀取與區塊拆解兩種做法

方法一:一次讀入陣列,再用 Buffer.BlockCopy 拆解

int length = (int)fs.Length - 1296; // 1152 + 144
byte[] Encrypt_Two = new byte[length];
Buffer.BlockCopy(fileContent, 1152, Encrypt_Two, 0, length);

方法二:直接從 FileStream 定位讀取

byte[] Encrypt_One = new byte[1152];
fs.Read(Encrypt_One, 0, 1152); // 從開頭讀取

// 讀取中間段
int length = (int)fs.Length - 1296;
byte[] Encrypt_Two = new byte[length];
fs.Position = 1152; // 移動至偏移量
fs.Read(Encrypt_Two, 0, length);

注意:fs.Read(buffer, offset, count) 中 offset 是陣列寫入起始位置,count 是讀取位元組數,不可寫成 fs.Read(Encrypt_Two, length, length) 否則會報錯。

金鑰管理與測試流程

程式將所有功能封裝於靜態類別,測試需三組金鑰對:傳送者 (A)、接收者 (B)、時間戳服務器 (DTS)。

  • 加密端:使用 DTS 私鑰 1 次、A 私鑰 2 次、B 公鑰 1 次
  • 解密端:使用 DTS 公鑰 1 次、A 公鑰 2 次、B 私鑰 1 次

預設金鑰存放於 Encryption Demo\bin\Release 目錄下三個資料夾,亦可透過介面按鈕「產生一組金鑰」自行建立。

操作步驟示意

金鑰產生介面

金鑰產生介面

步驟一

步驟一:開啟檔案並提交至 DTS

步驟二

步驟二:加密處理(需正確選擇金鑰檔)

步驟三

步驟三:解密還原

擴充建議

若需更換演算法(如 AES/Rijndael、SHA-512),必須重新計算所有位元組偏移量。原始碼註解較簡略,歡迎進一步優化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved