开源项目:分离码算法c++和js实现
项目发布:https://code.csdn.net/zhangliuxue/flcode/tree/master
1概述
信息的安全需要多方面的保证,服务器端,传输通道,用户端的信息安全。信息的安全存在多种泄密的途径,服务器端泄密,传输端泄密,用户端泄密的问题。
一般的加密通信有服务器来主导完成的,分离码提供了前端加密的技术手段,web服务前端,可以简单的加密把结果通过服务器传送或者保存在服务器端,加密和解密的过程由前端完成,为信息安全提供了一种简单的方法。
算法设计思路:
用简单的数学转换来实现信息的编码,编码的结果分为编码、编码对应位数、码表三部分,利用信息的分解实现信息的安全。
分离码编码后的结果包括以下三个部分:
1、码表
运算字符置换为数,数转化为字符的表,要求字符不能相同。
2、位记录
整形数经过运算转换的字符位数。
3、编码结果
整形书转换后的结果。
2信息安全
信息的安全可以从以下方面来考虑:
1、信息的加密
2、信息的存储
3、信息的传输
信息的加密对于https而言,一个站点或者一个域采用同样的证书,证书的强度在于密码的强度保证的,一旦密码破解,有关该站点的信息传输通道都是不安全的。
服务的安全除了传输的安全机制,还有数据保存的安全机制,数据库的安全机制,服务器的安全机制。
用户的信息如果单一靠服务保证,用户信息对于服务是透明的话,用户的信息根本就没有安全可言。
用户的信息传输如果靠统一的安全先到来保证,千万信息用一个密码来保证传输安全,其实风险也很多。单一信道的信息容易被截获,用单一密钥加密,密钥的复杂度在设计中远远达不到信息安全设计的解空间,安全在某种程度上被夸大。有些网站的证书设计时的密码相对简单,证书一般不会更换,相对的安全性就打了折扣。
Web服务是常用服务,https在一定程度上保证了信息传输的安全要求,但对用户信息存储安全没有保证,这些依托服务提供者采用其他的方式保证。采用同意的密钥来保存,存在这不可更换的缺点;采用不同的密钥来加密,有设计密钥的保存问题。
本项目旨在提供一个可以满足个性化安全需求的算法,特别可以针对web服务的前端提供一种js加密和解密的方法。信息加密后的结果由三部分组成,可以实现多通道的信息传输,从而保证传输的安全。多通道的信息截获和匹配难度比单一信道难的多。
分离码算法在信息安全的传输方式如下:
1、每用户设计自己的码表;
2、服务器调用该用户的码表加密信息;
3、码表在信息传输过程中不传输;
4、信息在用户端解密;
5、上传信息方向操作,同样码表不传输。
安全等级:
1、传输层安全等级高;
2、服务器端安全等级一般;
3、用户端信息安全一般。
另一种方式:
1、信息在用户侧加解密;
2、服务器保存加密信息;
安全等级:
1、服务器信息安全高,信息泄密和服务器关系不大;
2、用户信息解码在用户侧解决,安全都高。
3、解决云端信息的安全存储问题。
3分离码使用
分离码编码后的结果包括以下三个部分:
1、码表
运算字符置换为数,数转化为字符的表,要求字符不能相同。
2、位记录
整形数经过运算转换的字符位数。
3、编码结果
整形书转换后的结果。
分离码计算简单,主要利用简单的数学变换来完成。用于通信和安全领域,可以保证信息的安全。
分离码编解码实例。
测试网页如下:
测试结果:
源字符串:
分离码开源项目很好
编码字符串
BzExD3CKXVw21meL02CHbAF3xCXVr2KmKL82BnqL
码表
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-
转换位
6,6,6,6,6,6,4
解码字符串
%e5%88%86%e7%a6%bb%e7%a0%81%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%be%88%e5%a5%bd
分离码开源项目很好
通过设置不同的码表实现编码的改变。
源字符串
分离码开源项目很好
编码字符串
CAFyE4DLYWx32nfM13DIcBG4yDYWs3LnLM93CorM
码表
123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-0
转换位
6,6,6,6,6,6,4
解码字符串
%e5%88%86%e7%a6%bb%e7%a0%81%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%be%88%e5%a5%bd
分离码开源项目很好
3代码设计
分离码设计介绍如下,采用c++和javascript开发。
3.1 C++设计
/*
模块:分离码
功能:
分离码是一种信息编解码技术,主要利用数学的不同进制转换来形成,结合码表和数学的进制转换,提出码位分离的编解码方法。
版权:
上海泥娃通信科技有限公司
email: zhangliuxue@126.com
*/
#pragma once
#include "math.h"
#include "malloc.h"
#include "string.h"
#include "iostream"
#include "string"
#include "map"
#include "vector"
using namespace std;
//进制转换结构描述:jz表示多少进制,letters表示进制的字符串,iCodeTable表示字符代表的数
typedef struct JzStatus
{
int jz;
string letters;
std::map<char,int> iCodeTable;
}JzStatus;
union i_c
{
unsigned int iVal;
unsigned char cVal[sizeof(unsigned int)];
};
#define uint32 unsigned int
#define BigtoLittle32(A) ((( (uint32)(A) & 0xff000000) >> 24) | \
(((uint32)(A)& 0x00ff0000) >> 8) | \
(((uint32)(A)& 0x0000ff00) << 8) | \
(((uint32)(A)& 0x000000ff) << 24))
bool IsBigEndian()
{
union NUM
{
int a;
char b;
}num;
num.a = 0x1234;
if (num.b == 0x12)
{
return true;
}
return false;
}
//初始化
void InitJz(JzStatus &st)
{
if (st.letters.empty())
st.letters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-";
st.jz = st.letters.size();
for (int i = 0; i < st.jz; i++)
{
st.iCodeTable[st.letters[i]] = i;
}
}
//获取字符串表示的整数
unsigned int GetJzInt(JzStatus &st,const char *cValue,size_t iL)
{
unsigned int i = 0;
for (size_t k =0; k<iL; k++)
{
i = i + st.iCodeTable[cValue[k]] *(unsigned int) pow((double)st.jz, (int)k);
}
return i;
}
//获取整数表示的字符串,并给出字符串的长度
char * GetJzChar(JzStatus &st,unsigned int iValue,int &k)
{
char * p = (char*)malloc(2);
unsigned int i = iValue;
memset(p, 0, 2);
while (i != 0)
{
i = iValue /st.jz;
p[k] = st.letters[iValue %st.jz];
if (i > 0)
{
k++;
p = (char*)realloc(p,k + 2);
}
iValue = i;
}
p[k + 1] = '\0';
k ++;
return p;
}
/*
编码:输入消息,转换为字符串序列和位数序列
*/
string EncodeJz(JzStatus &st,const char*msg,size_t len,std::vector<unsigned char>&iSer)
{
int i = len/sizeof(unsigned int);
int j = len %sizeof(unsigned int);
string outstr;
for (int k = 0; k < i; k++)
{
int p=0;
memcpy(&p, (void*)&msg[k*sizeof(int)],sizeof(int));
int m = 0;
char * tmp = GetJzChar(st, p, m);
outstr.append(tmp);
delete[] tmp;
iSer.emplace_back(m);
}
if (j>0)
{
int p=0;
memcpy(&p, (void*)&msg[i*sizeof(int)],j);
int m = 0;
char * tmp = GetJzChar(st, p, m);
outstr.append(tmp);
iSer.emplace_back(m);
delete[] tmp;
}
return std::move(outstr);
}
/*
解码
*/
vector<unsigned char> DecodeJz(JzStatus &st,const string &msg,const size_t&len,const std::vector<unsigned char>&iSer)
{
vector<unsigned char> p1;
size_t offset = 0;
const char * tp = msg.c_str();
int po = 0;
i_c ic;
for (auto &x : iSer)
{
unsigned int m = GetJzInt(st, &tp[offset], x);
ic.iVal = m;
for (int h = 0; h < sizeof(int);h++)
p1.emplace_back(ic.cVal[h]);
offset += x;
}
return std::move( p1);
}
3.2 Javascript设计
/*
模块:分离码
功能:
分离码是一种信息编解码技术,主要利用数学的不同进制转换来形成,结合码表和数学的进制转换,提出码位分离的编解码方法。
版权:
上海泥娃通信科技有限公司
email: zhangliuxue@126.com
*/
//初始化
function InitJz(st)
{
st.iCodeTable =new Object();
if (st.letters == undefined || st.letters=="")
//st.letters = "0123456789abcdefghijklmnopqrstuv";
st.letters ="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-";
st.jz = st.letters.length;
for (var i = 0; i < st.jz; i++)
{
st.iCodeTable[st.letters[i]] = i;
}
}
//获取字符串表示的整数
function GetJzInt(st,cValue,offset, iL)
{
var i = 0;
for ( k =0; k<iL; k++)
{
i = i + st.iCodeTable[cValue[offset+k]] * Math.pow(st.jz, k);
}
return i;
}
//获取整数表示的字符串,并给出字符串的长度
function GetJzChar(st,iValue)
{
var i = iValue;
var p = "";
var k = 0;
while (i != 0)
{
i = parseInt(iValue / st.jz);
p += st.letters[parseInt(iValue % st.jz)];
iValue = i;
if (i >= st.jz) {
k++;
}else
{
p += st.letters[parseInt(iValue % st.jz)];
k++;
break;
}
}
k++;
var e = {};
e.str = p;
e.m = k;
return e;
}
function chartoint(c,st,len)
{
var iv="";
for(var i=st+len-1;i>=st;i--)
{
iv += c[i];
}
return parseInt(iv,16);
}
/*
编码:输入消息,转换为字符串序列和位数序列
*/
function EncodeJz(st,msg,iSer)
{
var len = msg.length;
var i = Math.floor(len / 4);
var j = len % 4;
var outstr="";
for (var k = 0; k < i; k++)
{
var p =chartoint(msg,k*4,4);
var m = 0;
if (p != NaN)
{
var tmp = GetJzChar(st, p);
outstr += tmp.str;
iSer.push(tmp.m);
}
}
if (j>0)
{
var p =chartoint(msg,k*4,j);
var m = 0;
var tmp = GetJzChar(st, p);
outstr += tmp.str;
iSer.push(tmp.m);
}
return outstr;
}
/*
解码
*/
function DecodeJz( st, msg, len, iSer)
{
var p1="";
var offset = 0;
for (xin iSer)
{
var m = GetJzInt(st, msg, offset, iSer[x]);
var p = m.toString(16);
if ( p . length % 2 != 0 ){p = "0" + p ;}
m ="";
for (var i=0;i<p.length/2;i++)
{
var tmp = p.substr(i * 2, 2);
m = tmp +m;
}
p1 += m.toString(16);
offset += iSer[x];
}
return p1;
}
function Encode16(str)
{
var rstr=""
for (i = 0; i < str.length; i++) {
if(str.charAt(i)=='%')
{
rstr += str.charAt(i + 1);
rstr += str.charAt(i + 2);
i = i + 2;
}else
{
rstr +=str.charCodeAt(i).toString(16)
}
}
return rstr;
}
function Encode()
{
var st = new Object();
var mb = document.getElementById("mb").value;
if (mb != undefined && mb!="")
{
st.letters = mb;
}
InitJz( st);
//var zlx = '分离码是一种信息编解码技术,主要利用数学的不同进制转换来形成,结合码表和数学的进制转换,提出码位分离的编解码方法。';
var zlx = document.getElementById("ss").value;
var code = encodeURI(zlx);
var s_str = Encode16(code);
var co = new Array();
var m_str = "";
for (var i = 0; i < s_str.length/2; i++)
{
co.push(s_str.substr(i * 2, 2));
m_str+="%"+s_str.substr(i * 2, 2);
}
var m = decodeURI(m_str);
var iSer = new Array();
var zxj = EncodeJz(st, co, iSer);
document.getElementById("dd").value = zxj;
var pp = DecodeJz(st, zxj, zxj.length, iSer);
var msg = "";
for (var i = 0; i < pp.length / 2; i++) {
msg +="%" + pp.substr(i * 2, 2);
}
document.getElementById("dl").value = iSer.toString();
document.getElementById("d1").value = msg;
document.getElementById("de").value = unescape(decodeURI(msg));
}
function Decode()
{
var st = new Object();
var mb = document.getElementById("mb").value;
if (mb != undefined && mb != "") {
st.letters = mb;
}
InitJz(st);
var zxj = document.getElementById("dd").value;
var iSer = document.getElementById("dl").value.split(",");
for (xin iSer)
{
iSer[x] =parseInt( iSer[x]);
}
var pp = DecodeJz(st, zxj, zxj.length, iSer);
var msg = "";
for (var i = 0; i < pp.length / 2; i++) {
msg +="%" + pp.substr(i * 2, 2);
}
document.getElementById("d1").value = msg;
try{
document.getElementById("de").value = unescape(decodeURI(msg));
}catch(e)
{
document.getElementById("de").value = e.message;
}
}
4项目综述
分离码开源项目部署在csdn站点,项目提供两种语言(c++、js)的实现代码,配套的有测试的代码,可以方便实现和部署。
大数据时代,云计算和云存储服务的开展,保障信息的安全尤为重要。信息的安全存储安全和信息安全对比,信息安全更重要,存储的还有备份,信息泄密了,自己还不知道,就尤为可怕了。没有安全的云时代,多少有点空。
本项目旨在信息安全的技术开发和实现,为信息安全提供一点方法和思路。