最近因為一些需求,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));
}
///
/// XOR 解密
///
/// 欲解密資料
/// salt
///
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);
}
///
/// XOR 加密
///
/// 欲加密資料
/// salt
///
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/