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);
// ... 迴圈加密 ...
| VC++ | C# | 備註 |
|---|---|---|
strKey.GetLength() | strKey.Length | 屬性非方法 |
_T("xxx") | "xxx" | C# 字串預設 Unicode |
srand/rand | new Random() | 實例化 Random,用 Next() |
strDest.Format("%1.2x", val) | string.Format("{0:X2}", val) | 十六進位大寫兩位 |
strKey[nKeyPos] | strKey[nKeyPos] | C# string 可直接索引取 char |
^ (XOR) | ^ | 運算子相同 |
CString 拼接 += | StringBuilder 或 += | 建議 StringBuilder 效能佳 |
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();
}
char 通常是 ANSI,C# char 是 UTF-16。若原演算法針對單位元組,C# 需先 Encoding.GetEncoding("GB2312").GetBytes() 轉 byte[] 再處理。srand(time(NULL)) 每秒種子不同;C# new Random() 預設用時間種子,同秒內多次實例化會產生相同序列。建議**單例**或 RandomNumberGenerator(加密級)。移植核心:**逐行對照語義,而非語法直譯**,特別注意字元編碼與隨機數行為差異。