C 字符串模二加加解密

其实加密算法有很多种,前边我讲到过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';

}
<think>首先,用户的问题是如何在LaTeX中实现modulo-2 addition)。通常指的是异或运算(XOR),在数学和计算机科学中很常见。 从用户提供的引用中,我可以看到引用[3]直接提到法:它说“法$$\oplus$$”,并解释为等同于异或运算。它还给出了一个LaTeX符号:$$\oplus$$,这对应于\oplus命令。 用户说:“我想查找在LaTeX中实现的方法”,所以我需要提供关于如何在LaTeX中写符号的指导。 关键点: - 通常用符号$\oplus$表示。 - 在LaTeX中,这个符号可以通过\oplus命令生成。 - 引用[3]确认了这一点:它说“法$$\oplus$$”,并解释为异或运算。 我的回答需要: - 使用中文,因为系统指令要求。 - 结构清晰,逐步解决问题。 - 保证真实可靠。 - 在行内数学表达式中使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - 正确使用LaTeX语法。 - 在回答末尾生成相关问题。 - 自然地添引用标识,例如[^1]。 回答结构: 1. 直接回答用户的问题:解释如何在LaTeX中实现2. 提供示例代码。 3. 解释符号的含义。 4. 如果需要,添额外的提示或上下文。 5. 生成相关问题。 从引用[3]: - 它说:“法$$\oplus$$。⊕\oplus⊕ 等同于“异或”运算。” - 这有点混乱,但似乎是用\oplus来表示。 其他引用: - 引用[1]是关于给公式颜色的。 - 引用[2]是关于粗公式的。 - 这些与用户的问题无关,所以我可以忽略它们,除非有相关点。 用户的问题很具体:LaTeX中实现的方法。所以,我应该专注于提供\oplus命令。 步骤: - 介绍:在LaTeX中,通常用符号$\oplus$表示。 - 给出示例:在行内或独立公式中如何写。 - 解释:这个符号代表法,等同于异或运算。 生成相关问题: - 系统指令要求生成相关问题。 - 例如:如何给这个符号颜色?如何粗?或者关于的其他方面。 确保真实可靠: - \oplus确实是LaTeX中用于direct sum或XOR的标准符号。 - 在数学上下文中,它常用于表示。 完整回答: - 开头:在LaTeX中,实现的方法很简单,使用\oplus命令。 - 示例: - 行内示例:例如,:$a \oplus b$ - 独立公式:如果需要一个单独的公式。 - 解释:这个符号表示法,等同于异或运算,即两个操作数按位相,结果相同为0,不同为1。 - 引用:自然地添引用,如引用[3]提到。 - 相关问题:生成2-3个相关问题。 引用标识: - 在末尾添[^3]来引用引用[3],因为它直接相关。 相关问题想法: 1. 如何在LaTeX中给符号颜色? 2. 如何符号? 3. 在计算机科学中的其他应用? 4. 如何输入其他数学符号如? 但保持相关。 </think> 在LaTeX中,实现modulo-2 addition)的方法很简单,通常等同于异或运算(XOR),在数学和计算机科学中常用符号$\oplus$表示。以下是详细步骤和解释: ### 实现方法 在LaTeX文档中,您可以使用`\oplus`命令来生成符号。这个命令可以在行内公式或独立公式中使用: - **行内公式**:使用`$...$`包裹,例如操作:$a \oplus b$,表示变量$a$和$b$的- **独立公式**:使用`$$...$$`包裹并单独成段,适用于更正式的数学表达: ```latex $$ c = a \oplus b $$ ``` 这将渲染为: $$ c = a \oplus b $$ ### 符号含义 - $\oplus$ 表示法,等同于异或运算:两个操作数按位相,结果相同为0,不同为1[^3]。 - 例如:$1 \oplus 1 = 0$,$1 \oplus 0 = 1$,$0 \oplus 0 = 0$。 ### 完整示例代码 在LaTeX文档中添以下代码来使用符号: ```latex \documentclass{article} \usepackage{amsmath} % 推荐使用amsmath包以获得更好的数学排版 \begin{document} 的行内示例:计算 $ x \oplus y $。 独立公式示例: $$ z = (x \oplus y) \oplus w $$ \end{document} ``` 编译后,输出效果如下: - 行内:的行内示例:计算 $x \oplus y$。 - 独立公式: $$ z = (x \oplus y) \oplus w $$ ### 注意事项 - **LaTeX语法正确性**:确保文档开头载了`amsmath`包(`\usepackage{amsmath}`),以便正确渲染符号。 - **兼容性**:`\oplus`是LaTeX标准数学符号,无需额外包支持,但`amsmath`能优化显示。 - 如果您需要给符号颜色或粗,可以参考引用[1]或[2]中的方法(如`\textcolor`或`\bm`),但这不改变实现核心。 如果您需要进一步修改符号样式(如颜色或粗细),我可以提供更具体的指导。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离水的鱼儿

一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值