C 字符串模二加加解密

来源:互联网 发布:delphi 算法 编辑:程序博客网 时间:2024/06/02 02:14

其实加密算法有很多种,前边我讲到过BASE 64、32、16、BCD,说到底都是要跟机器码进行打交道,即二进制码,无论用什么样的加密算法,都要将数据变成二进制数据后再处理,转来转去再转回来,这个模二加算法其实很简单。大体的过程是这样的:

字符—->二进制—->十进制—–>异或(加密)—->二进制—->十进制—->异或(解密)—->字符

我直接上代码吧!

#include "stdafx.h"#include "string.h"#pragma warning(disable:4996) //防止 strncpy()提示不安全void Ten_Two(int *Ten,int Tlen, unsigned char * data);void  Sencond_Ten(unsigned char *q, int len);void Str_Two(unsigned char *p,int strLen,unsigned char *q);void Two_Str(unsigned char *outData,int Tlen,unsigned char *str);int _tmain(int argc, _TCHAR* argv[]){    unsigned char inData[]="1a76%s*@Shen雪冰"; //原始数据    int strLen= strlen((char *)inData); //原字符串数据的长度    printf("\n-----------------------------加密前字符串:\n");    printf("%s",inData);    printf("\n----------------------------------------------\n");    unsigned char *outData=new unsigned char[strLen*8+1];//创建原始数据  二进制大小的数组 +1存放'\0'    //unsigned char *p=inData;    //unsigned char yh=0xFF; //这里可以任意指定8位二进制数字 可random,解密的时候也要用这个解密    //unsigned char k=0x80;  //解密按位与运算 128 10000000    //unsigned char *q=outData;    //字符转二进制    Str_Two(inData,strLen,outData); //字符转二进制    int TwoLen=strlen((char *)outData)-1; //二进制数据的长度    printf("\n----------------------------------------------------原始数据二进制:\n");    for(int i=0;i<TwoLen;i++)        printf("%c",outData[i]);    printf("\n-------------------------------------------------------------------------:\n");    Sencond_Ten(outData,TwoLen);//原数据加密后二进制转十进制 十进制再转二进制    printf("\n-----------------------------加密原始数据  二进制异或后-------------------------\n");    for(int i=0;i<TwoLen;i++)        printf("%c",outData[i]);    printf("\n-----------------------------------------------------------------------------\n");    Sencond_Ten(outData,TwoLen);//加密后二进制转十进制  十进制再转二进制    printf("\n----------------------------------------------------再转成原始数据二进制:\n");    for(int i=0;i<TwoLen;i++)        printf("%c",outData[i]);    printf("\n-------------------------------------------------------------------\n\n");    unsigned char *str=new unsigned char [TwoLen/8]; //解密后字符    Two_Str(outData,TwoLen,str); //二进制转字符    printf("\n-----------------------------解密后字符串:\n");    for(int i=0;i<TwoLen/8;i++)        printf("%c",str[i]);    printf("\n----------------------------------------------\n");    getchar();    delete str;    str=NULL;    delete outData;    outData=NULL;    return 0;}void  Sencond_Ten(unsigned char *q, int len){    //二进制转十进制    unsigned char *qHead=q;  //记录q的头指针    unsigned char k=0x80;//-128    unsigned char yh=0xFF; //255    int c=strlen((char *)q)-1;    int count=0; //计算 10进制数的 数量    char str1[9]="";    int *Ten=new int [len/8];    int Tlen=len/8;    int *Thead=Ten; //记录Ten的头指针    for(int i=0;i<c;i=i+8)    {        //2转10        int l=0;        strncpy(str1,(const char*)q+i,8);        for(int j=0;j<8;j++)         {               l+=(str1[j]-'0')<<(7-j);         }           //10进制做异或运算        *Ten=l^yh; //加密  字节模2加  即 异或        // printf(":%d\t",*Ten);        Ten++;      }    //将指针转向头    Ten=Thead;    Ten_Two(Ten,Tlen,q);    delete Ten;    Ten=NULL;}void Ten_Two(int *Ten,int Tlen,unsigned char * q){    //十进制数转二进制数     int b=0;    int len=Tlen;    unsigned char  k = 0;    for (int i = 0; i < len; i++)    {        k = 0x80;        b=Ten[i];        for (int j=1; j<=8; j++, k >>= 1)        {            if (b & k)            {                //  printf("1");                *q='1';                q++;            }            else            {                //  printf("0");                *q='0';                q++;            }        }        //printf(" \n");    }    q++;    *q=0;}void Str_Two(unsigned char *p,int strLen,unsigned char *q){    unsigned char *qHead=q;  //记录q的头指针    unsigned char *pHead=p;  //记录p的头指针    unsigned char k=0x80;  //解密按位与运算 128 10000000    for (int i = 0; i < strLen; i++,p++)    {        k = 0x80;        for (int j=1; j<=8; j++, k >>= 1)        {            if (*p & k)            {                //  printf("1");                *q='1';                q++;            }            else            {                //printf("0");                *q='0';                *q++;            }        }        //printf(" \n");    }    q++;    *q=0; //结束字符串    q=qHead; //指向头指针    p=pHead;//指向头指针}void Two_Str(unsigned char *outData,int TwoLen,unsigned char *str){    char Twostr[9]=""; //存放每个字符 8bit    int kk=0; //记录字符串的数量    for(int i=0;i<TwoLen;i=i+8)    {        int l=0;        strncpy(Twostr,(const char*)outData+i,8);//把每一个字符的8bit 复制给outData        for(int j=0;j<8;j++)         {               l+=(Twostr[j]-'0')<<(7-j); //转换成十进制            str[kk]=l;        }        ++kk;    }    str[kk]='\0';}