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';}
阅读全文
0 0
- C 字符串模二加加解密
- 字符串加密解密函数 (C#)
- 字符串加密解密类[封装][C#]
- C++/VC/MFC字符串/文件加解密
- C++/VC/MFC字符串/文件加解密
- [华为OJ--C++]023-字符串加解密
- [C/C++]基础字符串的加密解密算法
- C#-一个简单实用的字符串加密解密类
- 用C写的 简单字符串加密和解密算法
- C#-字符串的加解密,DES标准,DESCryptoServiceProvider---ShinePans
- 字符串的加密和解密(C语言)
- 加密解密字符串
- 字符串加密解密函数
- 字符串加密解密
- .net字符串加密解密
- JavaScript字符串加密解密
- 字符串加密解密类
- 字符串加密解密函数
- 在IDEA上使用lombok
- js鼠标拖拽事件
- HTTP请求方式比较
- 任意android 手机支持daydream
- 交换排序之冒泡排序与快速排序
- C 字符串模二加加解密
- centos6.5 系统安装 git
- Use youtube-dl下载YouTube视频
- Oracle全家桶(VirtualBox+OEL+Oracle11gR2)快捷搭建数据库服务器
- Go语言_Go_Golang 逐行读取文件
- Grafana最新版本4.3.1安装(后端使用mysql)
- java注解
- database:mysql.h: No such file or directory
- 实时改变配置文件的思路