• 有参数交换数据
  • 无参数交换数据
  • 异或加密(文本与二进制)
    • 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)相关推荐

  1. 使用异或交换数据的优缺点

    使用异或来交换数据只有缺点,没有优点! 家人们,我在刚开始学习到可以使用异或来交换数据的时候,我就潜意识的以为(或者是受身边影响)以为这个方法是最高效最好的,但是后来我就想到运算难道比赋值还快吗,结果 ...

  2. arcgis 经纬度转大地坐标_土地报备坐标txt(坐标交换数据)转shp遇到的坑及其Python(ArcPy/ArcGIS)实现...

    目录 土地报备坐标txt文件(坐标交换数据)转shp遇到的坑以及该功能的Python(ArcPy/ArcGIS)实现 一. 使用 Python(ArcPy) 绘制shp 什么是ArcPy 如何构造sh ...

  3. php无参数函数实现rce,浅谈无参数RCE

    0x00 前言 这几天做了几道无参数RCE的题目,这里来总结一下,以后忘了也方便再捡起来. 首先先来解释一下什么是无参数RCE: 形式: if(';' === preg_replace('/[^W]+ ...

  4. hppRNA-基于Snakemake的便捷无参数管道,可用于众多样品的RNA-Seq分析

    hppRNA-基于Snakemake的便捷无参数管道,可用于众多样品的RNA-Seq分析  王大鹏 生物信息学通报,第19卷,第4期,2018年7月,第622-626页,https: //doi.or ...

  5. OSS在private权限下的无参数访问(Nginx反向代理实现)

    本文主要介绍内容 oss默认权限策略是private,当修改到public-read或更高权限时会提示存在安全风险.如果需要访问oss资源需要在地址上添加签名内容,不利于地址的存储和使用.本文会介绍如 ...

  6. .Net Framework 4.5.1 ASP.NET MVC 5 下新建视图报“错误 运行所选代码生成器时出错 无法检索元数据 没有为该对象定义无参数构造函数”...

    当在控制器中新建视图的时候,选择的视图界面如下: 执行添加后报如下错误: 错误的内容为: 错误 运行所选代码生成器时出错 无法检索"XXX"的元数据 没有为该对象定义无参数构造函数 ...

  7. 《R语言数据挖掘:实用项目解析》——第2章,第2.9节无参数方法

    本节书摘来自华章出版社<R语言数据挖掘:实用项目解析>一书中的第2章,第2.9节无参数方法,作者[印度]普拉迪帕塔·米什拉(Pradeepta Mishra),更多章节内容可以访问云栖社区 ...

  8. 线程同步工具(七)在并发任务间交换数据

    声明:本文是< Java 7 Concurrency Cookbook >的第三章, 作者: Javier Fernández González 译者:郑玉婷 在并发任务间交换数据 Jav ...

  9. Dev控件用法 aspxTreeList 无刷新 aspxGridView 数据

    Dev控件用法 aspxTreeList 无刷新 aspxGridView 数据 主要是利用 ASPxTreeList 点击事件回发服务器进行数据重新绑定 ASPxTreeList: ? 1 2 &l ...

最新文章

  1. python应用实例论文_番外篇——Python多进程应用实例一则
  2. 疯狂python讲义视频 百度云-疯狂Python讲义 PDF 含源码工具版
  3. Ubuntu学习——第一篇
  4. php ajax 分页phpapi,ajax分页_php ajax分页代码
  5. python3远程连接_Python3 SSH远程连接服务器的方法示例
  6. ZK的实际应用:MVVM –以编程方式更新视图
  7. ***使用PHP实现文件上传和多文件上传
  8. Android 第三章 SQLite 数据库
  9. iOS 关于使用xib创建cell的两种初始化方式
  10. [CLR团队公告]CLR基础研究团队纲领
  11. Adobe reader 的书签问题
  12. 利用python编写个性二维码制作工具(支持微信名片二维码),并打包成EXE可执行文件。——001
  13. 微分几何为何必然兴起?
  14. PPT里面如何插入斜体文字
  15. FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程
  16. 回归中的相关度和决定系数
  17. 微信小程序反编译 PC端
  18. ERJ | 马来西亚三城室内环境微生物/代谢产物与初中生哮喘的关联
  19. AXI_Round_Robin_Arbiter 设计 - AW、W通道部分
  20. SteamVR Unity工具包(二):激光和移动

热门文章

  1. buu-crypto-yxx
  2. 关于django—模型序列化器类详细内容
  3. optee的fast call的介绍
  4. scrapy详解及主要应用场景
  5. XSS编码问题以及绕过
  6. matlab中大figure怎样修改,操作Matlab的Figure窗口(一)
  7. 快速定位关键爆破点的几种方法
  8. MoeCTF 2021Re部分------time2go
  9. 题目3:文本文件单词的检索与计数(实验准备)
  10. 【CTF大赛】2021 DASCTF July cybercms 一探再探