1. 程式人生 > 實用技巧 >密碼學系列——異或加密

密碼學系列——異或加密

前言

繼續更新本系列,介紹常用的異或加密。

正文

異或加密的原理非常簡單。

原理:

0 ^ 0 = 0
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1

就是1和1那麼得到的結果是0,0和0得到的結果是0,只有1和0或者0和1得到的結果才是1,所以叫做異或。

很多時候我們不希望我們請求的時候進行明文顯示,而又不能像密碼一樣完全是不可逆加密,有些是需要雙向的對稱加密的。

但是很多對稱加密效率還是低了點。有時候我們有些資料可能只需要簡單的加密處理,資料沒那麼重要,那麼如何處理呢?這時候就可以用上這個。

看下:

function encryption(text) {
 var secretkey = "";
 var x = 
"GkzXQ0eKC1WG5Rky8n5rH7qWV5U2tbLkOYtl9RRwGIiwYZTY37Ne0jiENQadTEjT2GdjUqIpybwLqGpBRau6KneCIZ9Z8hl28MQiS5J0574eN6iN4kdokYDk8vmvyHQRlSrbBORaSSmeyCp7H8mQUQAiaK0VS27h0i9bPLfhKFb6wJOYVSJD3uRXpOc1Tn1sXtPYcP7lJpZyuFW32bDV3KYVfhK6aDE88Xu90pe9XcLcvZr7nlqtMFOtJGv8yXxR9zghb6lyKeSEBBgv1LeZVWFGNKS3L0yG5Mxts3XUSEEkVDw4HFyyTyNTlRaRJagho470PGg156xlooFepmqVpEKsF9wCzFbHX450p4GA2GoptfN0zvuSuP1VMAo6U5xGJKRuvq5jZOpU2l1Rd2EVLPes5LAD5ADjc9dRc4z6JKVLHWyIEWDBCzJB7VHVtxChqKzHg2LjznfcaPx6tqrD43nPLYe2dDO4cfWligvMB7TywihzrYQzSfJ1KxLVECtx";
 // 得到隨機數字
 var randnum = Math.ceil(Math.random() * (x.length-text.length));
 for (var i = 0; i < text.length; i++) {
 var key1 = text.charCodeAt(i);
 var key2 = x.charCodeAt(randnum + i);
 var chart = String.fromCharCode(key1 ^ key2);
 secretkey += chart;
 }
 return {
 randnum: randnum * 699,
 secretkey: secretkey
 };
}

上面做的就是異或加密,只是在正式環境中不要這樣寫,不規範,怎麼說呢,比如說x應該是傳入的沒有的話再做預設值,如果x的值小於text的話,那麼應該丟擲異常。。。。好吧這不是重點。

在js中,利用charCodeAt獲取到charCode,然後就可以進行異或加密了,那麼後臺如何寫呢?

後臺解密程式碼 C#:
public static string encrypt(string str,int number)
{

StringBuilder builder = new StringBuilder();
var encrypt = 
"GkzXQ0eKC1WG5Rky8n5rH7qWV5U2tbLkOYtl9RRwGIiwYZTY37Ne0jiENQadTEjT
2GdjUqIpybwLqGpBRau6KneCIZ9Z8hl28MQiS5J0574eN6iN4kdokYDk8vmvyHQRlSrbBORaSSm
eyCp7H8mQUQAiaK0VS27h0i9bPLfhKFb6wJOYVSJD3uRXpOc1Tn1sXtPYcP7lJpZyuFW32bDV3KYVfhK6aD
E88Xu90pe9XcLcvZr7nlqtMFOtJGv8yXxR9zghb6lyKeSEBBgv1LeZVWFGNKS3L0yG5Mxts3XUSEEkVDw4HFyyTyNTlRaR
Jagho470PGg156xlooFepmqVpEKsF9wCzFbHX450p4GA2GoptfN0zvuSuP1VMAo6U5xGJKRuvq5jZOpU2l1Rd2EVLPes5LAD5ADjc9
dRc4z6JKVLHWyIEWDBCzJB7VHVtxChqKzHg2LjznfcaPx6tqrD43nPLYe2dDO4cfWligvMB7TywihzrYQzSfJ1KxLVECtx";
 number = number / 699;
 char[] chars = str.ToCharArray();
 for (var i = 0; i < chars.Length; i++)
 {
 char temp = (char)(chars[i] ^ encrypt[number + i]);
 builder.Append(temp);
 }
 return builder.ToString();
}

只要拿到數字後再進行一次異或就好。

原理很簡單,比如說我們的明文是1,那麼和一個1,或者之後得到是0。如果得到是0,那麼我再次異或一次後,那麼就是0和1進行異或,得到就是1了。

上述只供原理參考,因為如果是httpget 請求的話,那麼要再次進行base64加密,否則瀏覽器自己會對一些特殊字元轉義。

如果是一些需要快速加解密且沒有什麼大的資訊保安可以使用異或加密。

該系列未結,續。