位操作的应用:无参数交换数据,异或加密,循环移位加密【位操作】(56)
- 有参数交换数据
- 无参数交换数据
- 异或加密(文本与二进制)
- key 为单个字符
- key 为字符串
- 循环移位加密(文本与二进制)
有参数交换数据
#include <stdio.h>void MySwap(int* pa, int* pb)
{int tmp = *pa;*pa = *pb;*pb = tmp;
}int main()
{int a = 3;int b = 5;printf("a = %d\t b = %d\n", a, b);MySwap(&a, &b);printf("a = %d\t b = %d\n", a, b);return 0;
}
运行结果为:
#include <stdio.h>void MySwap(int* pa, int* pb)
{*pa = *pa + *pb;*pb = *pa - *pb;*pa = *pa - *pb;
}int main()
{int a = 3;int b = 5;printf("a = %d\t b = %d\n", a, b);MySwap(&a, &b);printf("a = %d\t b = %d\n", a, b);return 0;
}
运行结果为:
无参数交换数据
#include <stdio.h>void MySwap(int* pa, int* pb)
{*pa = *pa ^ *pb;*pb = *pb ^ *pa;*pa = *pa ^ *pb;
}int main()
{int a = 3;int b = 5;printf("a = %d\t b = %d\n", a, b);MySwap(&a, &b);printf("a = %d\t b = %d\n", a, b);return 0;
}
运行结果为:
使用 ^ 进行数据交换能够避免出现溢出。
无参数交换数据是数据交换的最高境界。
异或加密(文本与二进制)
key 为单个字符
注意,加密过程中相同字符异或有’\0’的出现。要滤过以防数据截断,因为我们依然会它当成字符串进行处理。
key 为字符串
#include <stdio.h>
#include <string.h>void encode(char *buf, char ch) //异或加密
{int len = strlen(buf);for (int i = 0; i < len; i++)buf[i] ^= ch;
}void decode(char* buf, char ch) //异或解密
{int len = strlen(buf);for (int i = 0; i < len; i++)buf[i] ^= ch;
}int main()
{char buf[] = "i love c++";//要加密的数据printf("buf = %s\n",buf);char ch = 'a';encode(buf, ch); //数据加密printf("buf = %s\n", buf);decode(buf, ch); //数据解密printf("buf = %s\n", buf);return 0;
}
运行结果为:
在这里需要注意的是,字符ch不能和我们加密的数据出现相同的字符,否则加密之后无法解密。取 ^ 之后的值为 0 ,也会导致字符串结束。
代码演示:
#include <stdio.h>
#include <string.h>void encode(char *buf, char ch)
{int len = strlen(buf);for (int i = 0; i < len; i++)buf[i] ^= ch;
}void decode(char* buf, char ch)
{int len = strlen(buf);for (int i = 0; i < len; i++)buf[i] ^= ch;
}int main()
{char buf[] = "i love c++";//要加密的数据printf("buf = %s\n",buf);char ch = 'o';encode(buf, ch); //数据加密printf("buf = %s\n", buf);decode(buf, ch); //数据解密printf("buf = %s\n", buf);return 0;
}
运行结果为:
我们可以看到加密和解密失败。
所以我们需要对于代码进行优化:
代码演示:
#include <stdio.h>
#include <string.h>void encode(char *buf, char ch)
{int len = strlen(buf);for (int i = 0; i < len; i++){if (buf[i] == ch)continue;buf[i] ^= ch;}}void decode(char* buf, char ch)
{int len = strlen(buf);for (int i = 0; i < len; i++){if (buf[i] == ch)continue;buf[i] ^= ch;}
}int main()
{char buf[] = "i love c++";//要加密的数据printf("buf = %s\n",buf);char ch = 'o';encode(buf, ch); //数据加密printf("buf = %s\n", buf);decode(buf, ch); //数据解密printf("buf = %s\n", buf);int a = 12345;a ^= a;printf("a= %d\n", a);return 0;
}
运行结果为:
我们看到加密解密成功并且验证了任何一个值的 ^ 为0。
我们接下来增加一下难度:我们通过密文输入密码进行查看原来的数据。
加密图解说明:
通过上面过程对于数据进行加密,数据的长度控制主循环的结束。
代码演示:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void encode(char* buf, char* px)
{int len = strlen(buf);int n = strlen(px);int j = 0;for (int i = 0; i < len; i++){if (buf[i] == px[j]){j++;}else{buf[i] ^= px[j];if (j == n)j = 0;}}
}void decode(char* buf, char* px)
{int len = strlen(buf);int n = strlen(px);int j = 0;for (int i = 0; i < len; i++){if (buf[i] == px[j]){j++;}else{buf[i] ^= px[j];if (j == n)j = 0;}}
}int main()
{char buf[] = "i love c++";//要加密的数据char xx[] = "19990909";encode(buf, xx); //数据加密char buf1[1024];printf("请输入解密密码:"); //输入密码scanf("%s", buf1);printf("buf = %s\n", buf);decode(buf, buf1); //数据解密printf("buf = %s\n", buf);return 0;
}
运行结果为:
成功解密:
解密失败演示:
如果是对于二进制进行加密,如果出现 ^ 结果为0则不会对于结果造成影响。
循环移位加密(文本与二进制)
位运算的加密应用,这才是真正意义上的加密的开始。
我们对图片进行循环移位加密:
需要加密的图片:
先把需要加密的图片放在程序操作的文件目录中:
代码演示:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>void encode(char* buf, int n) //加密循环左移一位
{for (int i = 0; i < n; i++){unsigned char ch = buf[i];buf[i] = (ch << 1) | (ch >> 7);}
}int main()
{FILE* pfr = fopen("01.png", "rb+");if (NULL == pfr)exit(-1);FILE* pfw = fopen("02.png", "wb+");if (NULL == pfw)exit(-1);char buf[1024];int n = 0;while ((n = fread(buf, 1, 1024, pfr)) > 0){encode(buf,n);fwrite(buf, 1, n, pfw);}fclose(pfr);fclose(pfw);return 0;
}
运行结果为:
我们可以看到加密成功。
接下来我们进行解密操作。
代码演示:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>void encode(char* buf, int n) //加密循环左移一位
{for (int i = 0; i < n; i++){unsigned char ch = buf[i];buf[i] = (ch << 1) | (ch >> 7);}
}void decode(char* buf, int n) //解密循环右移一位
{for (int i = 0; i < n; i++){unsigned char ch = buf[i];buf[i] = (ch >> 1) | (ch << 7);}
}int main()
{FILE* pfr = fopen("02.png", "rb+");if (NULL == pfr)exit(-1);FILE* pfw = fopen("03.png", "wb+");if (NULL == pfw)exit(-1);char buf[1024];int n = 0;while ((n = fread(buf, 1, 1024, pfr)) > 0){decode(buf,n);fwrite(buf, 1, n, pfw);}fclose(pfr);fclose(pfw);return 0;
}
运行结果为:
我们可以看到揭秘成功。
注意:
循环移位加密不用担心会出现 0 的情况,因为数据中不会出现 0,所以循环移位也不会出现 0 。
位操作的应用:无参数交换数据,异或加密,循环移位加密【位操作】(56)相关推荐
- 使用异或交换数据的优缺点
使用异或来交换数据只有缺点,没有优点! 家人们,我在刚开始学习到可以使用异或来交换数据的时候,我就潜意识的以为(或者是受身边影响)以为这个方法是最高效最好的,但是后来我就想到运算难道比赋值还快吗,结果 ...
- arcgis 经纬度转大地坐标_土地报备坐标txt(坐标交换数据)转shp遇到的坑及其Python(ArcPy/ArcGIS)实现...
目录 土地报备坐标txt文件(坐标交换数据)转shp遇到的坑以及该功能的Python(ArcPy/ArcGIS)实现 一. 使用 Python(ArcPy) 绘制shp 什么是ArcPy 如何构造sh ...
- php无参数函数实现rce,浅谈无参数RCE
0x00 前言 这几天做了几道无参数RCE的题目,这里来总结一下,以后忘了也方便再捡起来. 首先先来解释一下什么是无参数RCE: 形式: if(';' === preg_replace('/[^W]+ ...
- hppRNA-基于Snakemake的便捷无参数管道,可用于众多样品的RNA-Seq分析
hppRNA-基于Snakemake的便捷无参数管道,可用于众多样品的RNA-Seq分析 王大鹏 生物信息学通报,第19卷,第4期,2018年7月,第622-626页,https: //doi.or ...
- OSS在private权限下的无参数访问(Nginx反向代理实现)
本文主要介绍内容 oss默认权限策略是private,当修改到public-read或更高权限时会提示存在安全风险.如果需要访问oss资源需要在地址上添加签名内容,不利于地址的存储和使用.本文会介绍如 ...
- .Net Framework 4.5.1 ASP.NET MVC 5 下新建视图报“错误 运行所选代码生成器时出错 无法检索元数据 没有为该对象定义无参数构造函数”...
当在控制器中新建视图的时候,选择的视图界面如下: 执行添加后报如下错误: 错误的内容为: 错误 运行所选代码生成器时出错 无法检索"XXX"的元数据 没有为该对象定义无参数构造函数 ...
- 《R语言数据挖掘:实用项目解析》——第2章,第2.9节无参数方法
本节书摘来自华章出版社<R语言数据挖掘:实用项目解析>一书中的第2章,第2.9节无参数方法,作者[印度]普拉迪帕塔·米什拉(Pradeepta Mishra),更多章节内容可以访问云栖社区 ...
- 线程同步工具(七)在并发任务间交换数据
声明:本文是< Java 7 Concurrency Cookbook >的第三章, 作者: Javier Fernández González 译者:郑玉婷 在并发任务间交换数据 Jav ...
- Dev控件用法 aspxTreeList 无刷新 aspxGridView 数据
Dev控件用法 aspxTreeList 无刷新 aspxGridView 数据 主要是利用 ASPxTreeList 点击事件回发服务器进行数据重新绑定 ASPxTreeList: ? 1 2 &l ...
最新文章
- python应用实例论文_番外篇——Python多进程应用实例一则
- 疯狂python讲义视频 百度云-疯狂Python讲义 PDF 含源码工具版
- Ubuntu学习——第一篇
- php ajax 分页phpapi,ajax分页_php ajax分页代码
- python3远程连接_Python3 SSH远程连接服务器的方法示例
- ZK的实际应用:MVVM –以编程方式更新视图
- ***使用PHP实现文件上传和多文件上传
- Android 第三章 SQLite 数据库
- iOS 关于使用xib创建cell的两种初始化方式
- [CLR团队公告]CLR基础研究团队纲领
- Adobe reader 的书签问题
- 利用python编写个性二维码制作工具(支持微信名片二维码),并打包成EXE可执行文件。——001
- 微分几何为何必然兴起?
- PPT里面如何插入斜体文字
- FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程
- 回归中的相关度和决定系数
- 微信小程序反编译 PC端
- ERJ | 马来西亚三城室内环境微生物/代谢产物与初中生哮喘的关联
- AXI_Round_Robin_Arbiter 设计 - AW、W通道部分
- SteamVR Unity工具包(二):激光和移动