XOR 是一个神奇的运算符, 观察它的真值表, 很容易得到以下结论:

假设现有 a , b 变量, 则

a ^ 0 == a

a ^ 0xff == ~a (取反加1等于作为补码的a的真值的相反数的补码, 比如0xff 取反加1 为 -1 的相反数 1 的补码 0x1, 0x0 取反加1 等于 0 的相反数 0 的补码, XOR 和相反数挂钩了!)

a ^ a == 0

XOR 满足交换律和结合律

a ^ b == b ^ a

a ^ b ^ a == b ^ (a ^ a) == b ^ 0 == b

这样一来, 可以使用一个中间变量 b , 使得 a ^ b 的值可以复原为 a , 这不正符合动态加密的需求吗?

说这些很无聊, 观察以下程序:

请问输出是什么? 抱歉, 我选择死亡!

问尼玛啊, 直接 Run 后观察不就好了?

如果你的程序有这种类似的提示, 那么很抱歉, 你将带给黑客极其重要的线索, 他只需简单地一调试, 关键代码就被定位到啦!

比如使用x64dbg定位字符串

剩下的先不说了, 我们写一个加密的程序吧?

这样一来, 可以在代码中使用混淆的数据了, 注意把解密函数和密钥隐藏起来哦.

/**
*加密神器
*对 long 和字符串进行 XOR 加密
*/ #include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <tchar.h>
#include <string.h> unsigned int key; // 打印Usage
void printUsage(); // initializing
void init(); // encry
int encry(void *source, unsigned char key, unsigned short length); // get the hex type string
char *catX(const char *source, unsigned short length); // decode
char *decode(const char *source, unsigned char key);
void *ndecode(const void *source, unsigned char key, unsigned short length); ///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
int
main(int argc, const char **argv) {
init();
if (argc != 4) {
$Return:
printUsage();
return 0;
} if (sscanf(argv[3], "%x", &key) != 1) {
wprintf(L"key是一个 8 bit 十六进制数, 请检查!\n");
return 1;
} if (strcmp(argv[1], "-s") == 0) {
// eg: encry -s "支付失败!" 33
// 用户选择的是字符串加密
int length = strlen(argv[2]); wprintf(L"加密字符串 \"%S\" , 共 %d 个字节.\n", argv[2], length); char *str = (char *) malloc(length + 1);
if (str == NULL)
return 2;
if (strncpy(str, argv[2], length+1) == NULL){
return 1;
} if (encry(str, key, length) != 0)
return 1; wprintf(L"加密后显示为(key-0x%X):\n"
L"\"%S\"", key, (const char *)str);
puts(""); wprintf(L"加密前后的 ASCII 字串形式:\n"
"\"%S\"\n"
"\"%S\"\n", catX(argv[2], length), catX(str, length)); char *deco = decode(str, key);
wprintf(L"尝试解码:\n"
"\"%S\"", deco); free(str);
free(deco); } else if (strcmp(argv[1], "-n") == 0) {
// 用户选择的是 long 加密
long n = 0;
if (sscanf(argv[2], "%ld", &n) != 1) {
wprintf(L"请检查输入!\n");
return 1;
} wprintf(L"加密整数 %ld :\n", n);
encry(&n, key, sizeof(n));
printf("0x%lX\n", n);
wprintf(L"尝试解密:\n%ld\n", *(long *)ndecode(&n, key, sizeof(n))); } else {
goto $Return;
} return 0;
} void
init() {
// 本地化相关
setlocale(LC_CTYPE, "");
} void
printUsage() {
printf("%S", L"Usage:\n"
"\t encry -s <要加密的字符串> <key>\n"
"\t encry -n <要加密的整数> <key>\n");
} int
encry(void *source, unsigned char key, unsigned short length) {
if (source == NULL) {
printf("NULL Pointer Exception\n");
return -1;
}
int i = 0;
for (; i < length; i ++ ) {
((unsigned char *) source)[i] ^= key;
} return 0;
} char *
catX(const char *source, unsigned short length) {
if (source == NULL) {
return NULL;
}
int n = 4 * length, i = 0;
char *str = (char *) malloc(n + 1);
*str = '\0'; for (; i < length; i ++ ) {
unsigned char byte = source[i];
char tmp[5] = { 0 };
tmp[0] = '\\';
tmp[1] = 'x';
sprintf(&tmp[2], "%x", byte);
strcat(str, tmp);
} return str;
} char *
decode(const char *source, unsigned char key) {
if (source == NULL) {
printf("NULL Pointer Exception\n");
return NULL;
} int length = strlen(source);
char *str = (char *) malloc(length + 1);
strncpy(str, source, length + 1); while (*str != '\0') {
*str++ ^= key;
} return str - length;
} void *
ndecode(const void *source, unsigned char key, unsigned short length) {
if (source == NULL)
return NULL;
void *data = malloc(length); memcpy(data, source, length); int i = 0; for (; i < length; i ++ ) {
((char *) data)[i] ^= key;
} return data;
}
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////

  

XOR 加密的更多相关文章

  1. XOR 加密简介

    本文介绍一种简单高效.非常安全的加密方法:XOR 加密. 一. XOR 运算 逻辑运算之中,除了 AND 和 OR,还有一种 XOR 运算,中文称为"异或运算". 它的定义是:两个 ...

  2. 使用Z3破解简单的XOR加密

    使用Z3破解简单的XOR加密 翻译:无名侠 原文地址: https://yurichev.com/blog/XOR_Z3/ 如果我们有一段用简单XOR加密过的文本,怎么寻找密钥呢?密钥的长度可能很长, ...

  3. xor加密的python实现

    #md5加密 import hashlib hash_md5 = hashlib.md5() x=input("Please input your text:") print( & ...

  4. c语言实现xor加密

    异或运算:^ 定义:它的定义是:两个值相同时,返回false,否则返回true.也就是说,XOR可以用来判断两个值是否不同. 特点:如果对一个值连续做两次 XOR,会返回这个值本身. ^ // 第一次 ...

  5. XOR加密作业

    思路 -1.对需要加密的内容进行MD5加密 -2.随机生产32位的十六进制密钥 -3.对密钥和MD5加密内容进行异或运算. 主要问题: -1.如何实现MD5加密 -2.如何随机生成32位16进制密钥 ...

  6. XOR+base64加密

    1.xor运算 1^0=1 0^0=0 1^1=0 23^32=55 55^32=23 23对32进行异或两次运算结果为23 2.XOR加密 设key=[]byte{1,2,3,4,5,6},src= ...

  7. 详解XOR(异或)运算加密

    逻辑运算之中,除了 AND 和 OR,还有一种 XOR 运算,中文称为"异或运算".它的定义是:两个值相同时,返回false,否则返回true.也就是说,XOR可以用来判断两个值是 ...

  8. php源码安全加密之PHP混淆算法.

    php源码安全加密的前世今生,本想发在教程区中.不知道怎么发,就写在这里面吧.PHP加密,解密是一直的话题,本人菜鸟,今天就简单向大家介绍一下并说说其中原理.提供一些加密的混淆算法.一\PHP的加密总 ...

  9. Flash 加密和破解

    关于Flash(swf),我们需要明确一点: ***Flash字节码的意义都是公开的 所以如果cracker真的有足够的耐心他最终还是可以破解掉你的Flash.我们能做的只是尽量提高Flash被破解的 ...

随机推荐

  1. input type=file上传控件老问题

    // 1.用INPUT控制上传文件时,点击INPUT控件出现文件选择框. // 2.如果在手机上使用时,一般不会出现这种较丑的 // 3.于是就自然想到将控件隐藏,然后用一个按钮代替,点击按钮时在函数 ...

  2. hdu 3790 最短路问题 (spfa练手)

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的.   Inp ...

  3. Docker中如何删除image(镜像)

    原文地址:http://yaxin-cn.github.io/Docker/how-to-delete-a-docker-image.html docker中删除images的命令是docker rm ...

  4. QML学习笔记(七)— 实现可拖拽、编辑、选中的ListView

    鼠标单击可选中当前项,头部呈绿色显示:按压当前项可进行拖拽更换列表项位置:点击数据可以进行编辑: GitHub:八至 作者:狐狸家的鱼 这里是自己定义的model,有些字体和颜色都是使用的全局属性, ...

  5. SourceInsight快捷键

    下载安装与设置 https://blog.csdn.net/k346k346/article/details/77412413 常用设置总结的还是比较全面的 问题: SourceInsight4.0中 ...

  6. (三)orcale体系结构

    https://www.cnblogs.com/chengxiao/p/5904783.html 一.什么是Oracle数据库? 众所周知,Oracle DataBase是一款关系型数据库管理系统(不 ...

  7. Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践

    转: Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践 阿里加多 0.1 2018.03.23 17:19* 字数 492 阅读 2613评论 2喜欢 1 一.前 ...

  8. Day035--Python--管道, Manager, 进程池, 线程切换

    管道 #创建管道的类: Pipe([duplex]):在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象,强调一点:必须在产生Process ...

  9. HR算法具体过程

    首先研究HR算法在概率分布估计中的实现,我们再考虑如何将其应用于频繁项挖掘中. 一.确定输入数据类型 def generate_uniform_distribution(k): raw_distrib ...

  10. 关于处理iis8.0中设置Request.BinaryRead 不允许操作的解决方法

    iis6.0解决方案: 起初我刚开始上传的是小文件运行都是正常的,后来我弄个文件大点的上传看程序运行怎么样?就上面的问题,在网上搜索正好找到跟我一样的问题,拿过来自己记录下.其中行62指的是:oUpF ...