我是靠谱客的博主 单身哈密瓜,最近开发中收集的这篇文章主要介绍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存放''
//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-------------------------------------------------------------------nn");
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(":%dt",*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]='';
}

最后

以上就是单身哈密瓜为你收集整理的C 字符串模二加加解密的全部内容,希望文章能够帮你解决C 字符串模二加加解密所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部