首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

VC++ 加密演算法移植到 C#:關鍵語法對照與陷阱

     編輯:程式設計疑難解答

原始 VC++ 代碼片段


int nKeyLen = strKey.GetLength();
if (nKeyLen == 0) strKey = _T("xxsswww");
srand((unsigned)time(NULL));
int nRange = 256;
int nOffset = (rand() % nRange);
CString strDest = _T("");
strDest.Format(_T("%1.2x"), nOffset);
// ... 迴圈加密 ...

C# 移植要點對照表

VC++C#備註
strKey.GetLength()strKey.Length屬性非方法
_T("xxx")"xxx"C# 字串預設 Unicode
srand/randnew Random()實例化 Random,用 Next()
strDest.Format("%1.2x", val)string.Format("{0:X2}", val)十六進位大寫兩位
strKey[nKeyPos]strKey[nKeyPos]C# string 可直接索引取 char
^ (XOR)^運算子相同
CString 拼接 +=StringBuilder 或 +=建議 StringBuilder 效能佳

完整 C# 參考實作


public static string Encrypt(string strSrc, string strKey) {
    if (string.IsNullOrEmpty(strKey)) strKey = "xxsswww";
    var rnd = new Random();
    int nOffset = rnd.Next(256);
    var sb = new StringBuilder();
    sb.AppendFormat("{0:X2}", nOffset);

    int nKeyLen = strKey.Length;
    int nKeyPos = 0;

    for (int i = 0; i < strSrc.Length; i++) {
        int nSrcAsc = (strSrc[i] + nOffset) % 255;
        nKeyPos = (nKeyPos < nKeyLen - 1) ? nKeyPos + 1 : 1;
        nSrcAsc ^= strKey[nKeyPos];
        sb.AppendFormat("{0:X2}", nSrcAsc);
        nOffset = nSrcAsc;
    }
    return sb.ToString();
}

常見坑點提醒

  • 字元編碼:VC++ char 通常是 ANSI,C# char 是 UTF-16。若原演算法針對單位元組,C# 需先 Encoding.GetEncoding("GB2312").GetBytes() 轉 byte[] 再處理。
  • Random 種子:VC++ srand(time(NULL)) 每秒種子不同;C# new Random() 預設用時間種子,同秒內多次實例化會產生相同序列。建議**單例**或 RandomNumberGenerator(加密級)。
  • % 255 vs % 256:原代碼用 255,保持一致,否則解密失敗。

移植核心:**逐行對照語義,而非語法直譯**,特別注意字元編碼與隨機數行為差異。

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