云时代,我们的信息我们做主

开源项目:分离码算法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)的实现代码,配套的有测试的代码,可以方便实现和部署。

大数据时代,云计算和云存储服务的开展,保障信息的安全尤为重要。信息的安全存储安全和信息安全对比,信息安全更重要,存储的还有备份,信息泄密了,自己还不知道,就尤为可怕了。没有安全的云时代,多少有点空。

本项目旨在信息安全的技术开发和实现,为信息安全提供一点方法和思路。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值