// 字节循环右移
unsigned char RorByte(unsigned char bData, size_t shift)
{unsigned char temp = bData >> (8 - shift);bData = bData << shift;bData = bData | temp;return bData;
}// 加密函数:先与密钥异或,然后取反,然后右移3位
void NaiveEncrypt(void *pData, size_t byteDataLen, const void *pKey, const size_t byteKeyLen)
{size_t uDataIndex = 0, uKeyIndex = 0;for (; uDataIndex < byteDataLen; uDataIndex++){((char *)pData)[uDataIndex] = ((char*)pData)[uDataIndex] ^ ((char *)pKey)[uKeyIndex];((char *)pData)[uDataIndex] = ~((char *)pData)[uDataIndex];RorByte(((unsigned char *)pData)[uDataIndex], 3);uKeyIndex++;if (uKeyIndex == byteKeyLen) uKeyIndex = 0;}
}// 解密函数:先右移5位,再取反,在与密钥异或
void NaiveDecrypt(void *pData, size_t byteDataLen, const void *pKey, const size_t byteKeyLen)
{size_t uDataIndex = 0, uKeyIndex = 0;for (; uDataIndex < byteDataLen; uDataIndex++){RorByte(((unsigned char *)pData)[uDataIndex], 5);((char *)pData)[uDataIndex] = ~((char *)pData)[uDataIndex];((char *)pData)[uDataIndex] = ((char *)pData)[uDataIndex] ^ ((char *)pKey)[uKeyIndex];uKeyIndex++;if (uKeyIndex == byteKeyLen) uKeyIndex = 0;}
}

使用起来也是非常简单

int main()
{// 这里用字符串演示,实际上可以加密任意字节流char data[] = "some plain text";size_t dataLen = strlen(data);char key[] = "123456";size_t keyLen = strlen(key);printf("加密前\n");for (size_t i = 0; i < dataLen; i++){printf("%02X ", (unsigned char)data[i]);}printf("\n\n");// 加密NaiveEncrypt(data, dataLen, key, keyLen);printf("加密后\n");for (size_t i = 0; i < dataLen; i++){printf("%02X ", (unsigned char)data[i]);}printf("\n\n");// 解密NaiveEncrypt(data, dataLen, key, keyLen);printf("解密后\n");for (size_t i = 0; i < dataLen; i++){printf("%02X ", (unsigned char)data[i]);}printf("\n\n");return 0;
}

基于异或,取反和循环移位实现一个简单的加密解密函数相关推荐

  1. python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析

    这篇文章主要介绍了python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析的实例,帮助大家更好的理解和学习使用python.感兴趣的朋友可以了解下 一.环境准备 python3.8.3 ...

  2. 异或加密的java算法_Java使用异或运算实现简单的加密解密算法实例代码

    Java简单的加密解密算法,使用异或运算 实例1: package cn.std.util; import java.nio.charset.Charset; public class DeEnCod ...

  3. 利用python爬取知乎评论_一个简单的python爬虫,爬取知乎

    一个简单的python爬虫,爬取知乎 主要实现 爬取一个收藏夹 里 所有问题答案下的 图片 文字信息暂未收录,可自行实现,比图片更简单 具体代码里有详细注释,请自行阅读 项目源码: 1 # -*- c ...

  4. java 异或加密 c语言解密,java对文件简单的加密解密(异或运算)

    package xxx; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; i ...

  5. 西门子触摸屏修改ip地址_基于博途V15 西门子S7-1200与触摸屏一个简单的例子

    本篇是<基于博途V15 西门子S7-1200 ...>系列的后续篇,看懂本篇文章之前请大家关注我,然后查找相关文章,学习之后再学习此篇.也请专业领域的大神批评指正. 感谢大家关注与支持! ...

  6. 位运算(按位与、按位或、异或、取反)以及原码、反码、补码

    参考:运算符的计算(按位与 按位或 异或 取反) 作者:一只青木呀 发布时间: 2020-07-23 18:13:55 网址:https://blog.csdn.net/weixin_45309916 ...

  7. 与() 、或(|)、异或(^) 、取反(~) 运算

    一.与(&) 参加运算的两个数据,按二进制位进行"与"运算. 运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; 例如:15& ...

  8. c语言负数左移右移_C语言位运算符:与、或、异或、取反,左移和右移

    C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...

  9. Wincc中,如何利用C脚本对变量进行置位+复位+取反操作?

    Wincc中,如何利用C脚本对变量进行置位+复位+取反操作? 1.常使用的C脚本函数如下表 1.1常见置位复位取反 举例说明: 对二进制变量 "TAG1_BOOL1" 进行置位.复 ...

最新文章

  1. 排序算法中——归并排序和快速排序
  2. WPS文本域替换不完全的问题
  3. 笔记本电脑怎样连接打印机_佳能无线便携打印机上市
  4. OpenCV使用VideoCapture界面读取一系列图像的实例(附完整代码)
  5. pymc3 贝叶斯线性回归_使用PyMC3估计的贝叶斯推理能力
  6. .net安全编程 阅读笔记(二)
  7. 操作系统进程间通信简述
  8. webgl与opengl技术资讯
  9. 跟我学制作javaEE网上书店销售管理系统(沙箱支付)springboot+vue
  10. vmware 桌面 服务器版,VMware Workstation
  11. EasyDarwin开源云平台接入海康威视EasyCamera摄像机之快照获取与上传
  12. sd卡驱动分析 linux,linux下SD卡驅動分析(一)
  13. 51单片机汇编语言点亮一位数码管,并计时(超详细分析汇编语言)
  14. 使用video.js遇到的坑。VIDEOJS: WARN: Player “player3“ is already initialised. Options will not be applied.
  15. 用Matlab把SMAP vegetation optical depth (VOD)数据转换成带投影信息EASE GRID2的tif文件
  16. JAVA连接FTP实例
  17. 3W+2H:学习和思考问题的有效方式
  18. 怎么选择Java培训机构?
  19. java 搞笑翻译_超级搞笑的英文翻译图文版!笑死我了
  20. 寻人风波——解决iphone4s无法接听的问题

热门文章

  1. 成功解决Exception “unhandled ImportError“cannot import name ‘imresize‘ from ‘imageio‘
  2. 成功解决ModuleNotFoundError: No module named '_pywrap_tensorflow_internal'
  3. Ubuntu18.04 CUDA与cudnn安装
  4. 17.splash_case02
  5. duilib bkimage 属性
  6. JavaWeb学习总结(六)—HttpServletResponse
  7. session 重写进入redis测试
  8. mysql(connector/ODBC)
  9. Mosquitto配置----日志设置
  10. (chap8 确认访问用户身份的认证) DIGES认证(摘要认证)