吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2814|回复: 0
收起左侧

[C&C++ 转载] 两道 xor 逆算法小练习

[复制链接]
Git_man 发表于 2017-5-21 19:20
01  异或
    异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。

    3 ^ 4 = 7  ;  3 ^ 7 = 4  ; 4 ^ 7 = 3

    下面两个 xor 题目全当小练习

02  xor_1

一道别人出的 Crypto 题
[C++] 纯文本查看 复制代码
#include<bits/stdc++.h>
using namespace std;

void f()
{
	string a;
	cin>>a;
	a[0]='H';
	string key="a7shw9o10e63nfi19dk";
	int l=a.length();
	char b[l+1];
	b[0]=a[0]^0x1;
	for(int i=1;i<l;i++)
	{
		char c=a[i]^b[i-1];
		b[i]=c;
	}
	for(int i=0;i<l-1;i++)
	{
		char c=b[i]^b[i+1];
		c=c^0x53;
		b[i]=c;
	}
	for(int i=1;i<=18;i++)
	{
		key[i]=key[i-1]^key[i]^a[(i-1)%7]^a[(i-1)%9];
	}
	for(int i=0;i<19;i++)
	{
		b[i]=b[i]^key[i];
	}
	char e[]={71,100,24,51,16,97,81,59,53,94,99,100,29,116,25,77,96,27,105};
	for(int i=0;i<l;i++)
	{
		if(b[i]!=e[i])
		{
			cout<<"failed"<<endl;
			return ;
		}
	}
	cout<<"successful"<<endl;
	for(int i=0;i<l;i+=2)
	{
		if(a[i]>=65&&a[i]<=90)
			a[i]+=32;
		if(a[i+1]>=97&&a[i+1]<=122)
			a[i+1]-=32;
	}
	cout<<"flag is: hbctf{"<<a<<"}"<<endl;
}
int main()
{
	f();
}


writeup
[Python] 纯文本查看 复制代码
# -*- coding:utf8 -*-
def foo():
    a=[0]*19
    key="a7shw9o10e63nfi19dk"
    k=[ord(i) for i in key]
    e=[71,100,24,51,16,97,81,59,53,94,99,100,29,116,25,77,96,27,105]
    a[0]=ord('H')
    for i in range(len(e)-1):
        k[i+1]^=k[i]^a[i%7]^a[i%9]
        a[i+1]=0x53^e[i]^k[i]
    print ''.join([chr(i) for i in a])
    pass
if __name__ == '__main__':
    foo()
    print 'ok'


03  xor_2
根据上一题修改的xor算法
[C++] 纯文本查看 复制代码
#include<iostream>
using namespace std;

void xor_(void)
{
	string f;
	cin>>f;
	f[0]=102;
	string key="b5c554f1847015d7ad5f2a891df2749df2a897";
	int len=f.length();
	char a[len+1];
	a[0]=f[0]^0x1;
	for(int i=1;i<len;i++)
	{
		a[i]=f[i]^a[i-1];
	}
	for(int i=0;i<len-1;i++)
	{
		a[i]=a[i]^a[i+1]^0x34;
	}
	for(int i=0;i<len-1;i++)
	{
		a[i]=a[i]^key[i+1]^0x56;
	}
	for(int i=1;i<len-1;i++)
	{
		a[i]=a[i]^key[i]^0x78;
	}
	for(int i=1;i<38;i++)
	{
		key[i]=key[i-1]^key[i]^f[(i-1)%5]^f[(i-1)%7];
	}
	for(int i=0;i<38;i++)
	{
		a[i]=a[i]^key[i];
	}
	char re[]={89,122,31,96,76,122,74,121,19,115,93,104,75,125,64,48,12,106,1,43,5,58,84,107,2,121,86,108,11,97,78,36,26,51,92,114,92,9};
	for(int i=0;i<len;i++)
	{
		if(a[i]!=re[i])
		{
			cout<<"failed"<<endl;
			return ;
		}
	}
	cout<<"success"<<endl;
	return;
}
int main()
{
	while(1){
		xor_();
	}
	return 0;
}


writeup
[Python] 纯文本查看 复制代码
# -*- coding:utf8 -*-
def xor_():
    f=[0]*38
    f[0]=ord('f')
    key="b5c554f1847015d7ad5f2a891df2749df2a897"
    k=[ord(i) for i in key]
    k_=[ord(i) for i in key]
    re=[89,122,31,96,76,122,74,121,19,115,93,104,75,125,64,48,12,106,1,43,5,58,84,107,2,121,86,108,11,97,78,36,26,51,92,114,92,9]
    for i in range(len(re)-1):
        k[i+1]^=k[i]^f[i%5]^f[i%7]
        re[i+1]=re[i+1]^k_[i+1]^0x78
        f[i+1]=re[i]^k[i]^k_[i+1]^0x56^0x34
    print ''.join([chr(i) for i in f])
    pass
if __name__ == '__main__':
    xor_()

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
mortalboold + 1 + 1 用心讨论,共获提升!
方妍心 + 1 热心回复!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-14 20:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表