密码学系列——异或加密
前言
继续更新本系列,介绍常用的异或加密。
正文
异或加密的原理非常简单。
原理:
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加密,否则浏览器自己会对一些特殊字符转义。
结
如果是一些需要快速加解密且没有什么大的信息安全可以使用异或加密。
该系列未结,续。