[C#] 在 Javascript 與 C# 中 簡單使用 XOR 加解密

2021-01-20

最近因為一些需求,Javascript 那邊無法使用其他的 library ,網路上查了一下,最後使一個算是折衷的辦法就是使用 XOR 的方式,算是一種加密吧,不過這遠比 AES ,DES 等還要薄弱,不過這也是沒有辦法的辦法,總比赤裸裸的 base64 好吧,不過因為有一些中文的問題遇到一些狀況解決了就筆記一下…


直接給 code

Javascript :

// string 轉 base64 function EncodeB64(str) { return window.btoa(unescape(encodeURIComponent(str))); } // 還原base64 string function DecodeB64(str) { return decodeURIComponent(escape(window.atob(str))); } //Xor 加密 function XorEncrypt(data, salt) { data = EncodeB64(data); var salts = Array.from(salt); var output = []; for (var i = 0; i < data.length; i++) { var charCode = data.charCodeAt(i) ^ salts[i % salts.length].charCodeAt(0); output.push(String.fromCharCode(charCode)); } var result = output.join(""); return EncodeB64(result); } //Xor 解密 function XorDecrypt(data, salt) { data = DecodeB64(data); var salts = Array.from(salt); var output = []; for (var i = 0; i < data.length; i++) { var charCode = data.charCodeAt(i) ^ salts[i % salts.length].charCodeAt(0); output.push(String.fromCharCode(charCode)); } var res = output.join(""); return DecodeB64(res); }

C# :

private static string EncodeBase64(string str) { return System.Convert.ToBase64String(Encoding.UTF8.GetBytes(str)); } private static string DecodeBase64(string str) { return Encoding.UTF8.GetString(Convert.FromBase64String(str)); } /// <summary> /// XOR 解密 /// </summary> /// <param name="data">欲解密資料</param> /// <param name="salt">salt</param> /// <returns></returns> private static string XorDecrypt(string data, string salt) { data = DecodeBase64(data); var salts = salt.ToCharArray(); char[] output = new char[data.Length]; for (int i = 0; i < data.Length; i++) { output[i] = (char)(data[i] ^ salts[i % salts.Length]); } var res = new string(output); return DecodeBase64(res); } /// <summary> /// XOR 加密 /// </summary> /// <param name="data">欲加密資料</param> /// <param name="salt">salt</param> /// <returns></returns> private static string XorEncrypt(string data, string salt) { data = EncodeBase64(data); var salts = salt.ToCharArray(); char[] output = new char[data.Length]; for (int i = 0; i < data.Length; i++) { output[i] = (char)(data[i] ^ salts[i % salts.Length]); } return EncodeBase64(new string(output)); }

使用案例1 - 我用 javascript 加密,使用 C# 這邊解密

var encString = @"OiQ7PjUpTSw1XUYvPREADh4iXFE="; Console.WriteLine(XorDecrypt(encString, "iamsalt")); //HELLODONMA許 var salt = 'iamsalt'; var encrypted = XorEncrypt("HELLODONMA許", salt); console.log(encrypted); //OiQ7PjUpTSw1XUYvPREADh4iXFE=

使用案例2 -  使用 C# 加密,javascript 解密

var test = "許當麻麻麻DONMA"; Console.WriteLine(XorEncrypt(test, "iamsalt")); //XyoEC1RZI1tXDwJWWhYYVlsREFsmLFgiJzQpSQ== var salt = 'iamsalt'; var decrypted = XorDecrypt("XyoEC1RZI1tXDwJWWhYYVlsREFsmLFgiJzQpSQ==", salt); console.log(decrypted); //許當麻麻麻DONMA

大概這樣,基本上碰到一些坑,不過現在都整理好了,有需要的人直接 CP 就可以用了..

https://zh.wikipedia.org/wiki/%E5%BC%82%E6%88%96%E5%AF%86%E7%A0%81

https://github.com/KyleBanks/XOREncryption

http://levy.work/2017-03-24-black-magic-js-atob-with-utf8/


當麻許的碎念筆記 2014 | Donma Hsu Design.