【WC2015】混淆与破解 (Goldreich-Levin 算法)
这个嘛= =直接贴VFK的题解就行了吧,感觉自己还是差别人太多
http://vfleaking.blog.uoj.ac/blog/104
讲得挺明白了的说,但还是挺难理解的说,中间实现部分简直不要太难懂= =(其实也不会代码顺序看正常点就行了)讲一下代码实现的细节吧(这点VFK就没说了~~~)
首先我们先随机生成很多个输入并把答案计算出来备用= =(计算答案时每32个输入进行一次运算用int来存就行了(想用bitset结果老调不出来QAQ))
然后就是算法的精髓了,生成s 个线性无关的向量 v1,…,vs,然后对于一个基,可以将其与这s个向量点积形成一个s维的向量,那么怎么求这个分量(就是一个可行的有效信息吧)呢?枚举每一个 U 中的向量 u,然后用“强制点积为 0”、“强制点积为 1” 这两种操作来把 f 变成只含 u 所对应的那个分量,再对 f 每一个输入变量反转下带进去看结果是否反转来知道这个分量中究竟含哪些变量。(VFK原话)这个我也不知道怎么说得清楚,看下代码理解下吧,反正我是看着看着就懂的QAQ,然后实现方面,我们可以先把该求的输入先预处理求出答案在进行计算,然后就能得到一个可能的分量了。
接下来呢,我们可以用一堆输入与这个分量进行比较来得到这个分量的系数,若这个系数较大就有可能是答案了(具体看wc ppt) 然后就得到一个有效信息了(当然,要与之前求得的线性无关)
接下来就容易了,用一堆输入求得每个输入对应的输出是0还是1(取概率较大的)就做完了
总体看起来也就是VFK用一句话说出来的东西比较难懂了(我比较渣QAQ)其他应该还可以理解
我把过程都注释到代码里了大家可以看看
然后就没了~~~
最近终于不堪于百度终于准备转博客园了,这是我在这里写的最后一篇博文了,翻翻一开始的文章,发现我变了很多,也挺有感触的,努力吧,相信成功只给有准备的人的!!!
CODE:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define R 10
#define S 4
int n,m,l,q;
#define maxk 50000
#define maxn 1030
#define pb push_back
int u[maxn],v[maxn],s[maxn],d[maxn],e[maxn];
typedef unsigned long long ull;
typedef unsigned int uint;
inline ull llrand() {
ull ans=(ull)rand()<<32|rand();
if (n<64) ans&=(1ull<<n)-1;
return ans;
}
vector<ull> x,ans;
vector<bool>x_res;
inline bool get(ull x,ull y){return x&(1ull<<y);}
inline void calc(vector<ull> &x,vector<bool> &res) {
res.clear();
static uint b[256];
for (int i=0;i<x.size();i+=32) {
memset(b,0,sizeof(b));
int r=min(int(x.size()-i),32);
for (int j=0;j<r;j++)
for (int k=0;k<n;k++) b[k]|=(ull)get(x[i+j],k)<<j;
for (int j=1;j<=q;j++) b[u[j]]=(~(b[v[j]]&b[s[j]]))^b[d[j]]^b[e[j]];
for (int j=0;j<r;j++) res.pb(get(b[0],j));
}
}
inline void set(ull &x,int y,int z) {
if (get(x,y)!=z) x^=1ull<<y;
}
inline void getans(){
static vector<ull> v,w;
int s=min(S,n);//生成s 个线性无关的向量
while (1) {
v.clear();w.clear();
bool flag=1;
for (int i=0;i<s;i++){
ull tmp=llrand();
v.pb(tmp);w.pb(tmp);
for (int j=0;j<i;j++)
if (w[i]&(w[j]&-w[j])) w[i]^=w[j];
if (!w[i]) {flag=0;break;}
}
if (flag) break;
}
static vector<ull> tx;
static vector<bool> tx_res;
tx.clear();//把该求的输入先预处理求出答案
for (int i=0;i<n;i++)
for (int j=0;j<R;j++) {
ull tmp=llrand();
for (int z=0;z<=1;z++) {
set(tmp,i,z);
for (int a=0;a<(1<<s);a++) {
ull temp=tmp;
for (int k=0;k<s;k++) if (a&(1<<k)) temp^=v[k];
tx.pb(temp);
}
}
}
calc(tx,tx_res);
for (int a=0;a<(1<<s);a++) {//枚举每一个 U 中的向量 u
ull tmp=0;
int l=0;
for (int i=0;i<n;i++) {//对 f 每一个输入变量反转下带进去看结果是否反转
int sum=0;
for (int j=0;j<R;j++) {
int cnt[2]={0,0};
for (int z=0;z<=1;z++)
for (int b=0;b<(1<<s);b++)
cnt[z]+=tx_res[l++]==__builtin_parity(a&b) ? 1: -1;
sum+=(cnt[0]>0)!=(cnt[1]>0);
}
if (sum>R/2) tmp|=1ull<<i;
}
int sum=0;
for (int i=0;i<maxk;i++) {//用一堆输入与这个分量进行比较来得到这个分量的系数
sum+=x_res[i]==__builtin_parityll(tmp&x[i])?1:-1;
}
if (abs(sum)>=maxk*0.02) {
for (int i=0;i<ans.size();i++)
if (tmp&(ans[i]&(-ans[i]))) tmp^=ans[i];
if (tmp) ans.pb(tmp);
}
}
}
int main(){
scanf("%d%d%d%d",&n,&m,&l,&q);
for (int i=1;i<=q;i++) scanf("%d%d%d%d%d",u+i,v+i,s+i,d+i,e+i);
for (int i=0;i<maxk;i++) x.pb(llrand());
calc(x,x_res);//随机生成很多个输入并把答案计算出来备用
while (ans.size()<m) getans();
for (int i=0;i<m;i++,putchar('\n'))
for (int j=0;j<n;j++) putchar('0'+get(ans[i],j));
static int h[1<<S][2];
for (int i=0;i<maxk;i++) {//一堆输入求得每个输入对应的输出是0还是1
ull tmp=0;
for (int j=0;j<m;j++) tmp=(tmp<<1) | __builtin_parityll(x[i]&ans[j]);
h[tmp][x_res[i]]++;
}
for (int i=0;i<(1<<m);i++) putchar('0'+(h[i][0]<h[i][1]));
return 0;
}
【WC2015】混淆与破解 (Goldreich-Levin 算法)的更多相关文章
- (转)Android studio 使用心得(五)—代码混淆和破解apk
这篇文章等是跟大家分享一在Android studio 进行代码混淆配置.之前大家在eclipse上也弄过代码混淆配置,其实一样,大家可以把之前在eclipse上的配置文件直接拿过来用.不管是.cfg ...
- Android studio 使用心得(五)—代码混淆和破解apk
这篇文章等是跟大家分享一在Android studio 进行代码混淆配置.之前大家在eclipse上也弄过代码混淆配置,其实一样,大家可以把之前在eclipse上的配置文件直接拿过来用.不管是.cfg ...
- [转载]Dotfuscator Professional Edition 4.9.7500.9484 混淆工具破解版+使用教程
如有转载,请注明出处: http://www.cnblogs.com/flydoos/archive/2012/01/26/2329536.html Dotfuscator Professional ...
- 使用CPA4破解经典密码算法
下面是一段经过经典密码算法加密的密文(加密算法未知): yvvnerujjvnywhbdvkpchfgvjtzwqsuporqfzpoekkjgziicdwwkeejdsruef whwseyej ...
- 1c19b35b005744d55261682b361804fa 如何破解经过 MD5 算法处理的信息?
Md5密文破解(解密)可以说是网络攻击中的一个必不可少的环节,是工具中的一个重要"辅助工具".md5解密主要用于网络攻击,在对网站等进行入侵过程,有可能获得管理员或者其他用户的账号 ...
- 算法之暴力破解和kmp算法 判断A字符串是否包含B字符串
我们都知道java中有封装好的方法,用来比较A字符串是否包含B字符串 如下代码,contains,用法是 str1.contains(str2), 这个布尔型返回,存在返回true,不存在返回fals ...
- WC2015 题解
K小割 题目链接:WC2015 K小割 Description 题目很清楚了,已经不能说的更简洁了-- Solution 这道题出题人挺毒的,你需要针对不同的部分分施用不同的做法 . 第\(1\)部分 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Android --Android Stuido混淆签名打包
参考博客:Android studio 使用心得(五)—代码混淆和破解apk 参考博客:Android studio 使用心得(四)---android studio 多渠道打包 参考博客:Andro ...
随机推荐
- 总结分享十大iOS开发者最喜爱的库 分类: ios相关 app相关 2015-04-03 16:43 320人阅读 评论(0) 收藏
该10大iOS开发者最喜爱的库由"iOS辅导团队"成员Marcelo Fabri组织投票选举而得,参与者包括开发者团队,iOS辅导团队以及行业嘉宾.每个团队都要根据以下规则选出五个 ...
- 写了一个复杂的sql语句
$sp_sql = "select sp_ProductNo, sp_ProductName,sp_Standard,sp_Unit,sum(sp_Amount) as amount fro ...
- 安装了C
2014-04-09 13:19:30 大学里看的第一本编程书籍,就是C.但是一直没有编译. 今天首次安装,我也佩服当初我是怎么通过C二级的. 上午写了sds手册.其中的制图用的visio制图,非常好 ...
- Java的三种代理模式
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
- 笔记整理——使用openssl编程
error: openssl 的所有解决方案 (2013/6/22 17:39:00) error: openssl/crypto.h: No such file or directory 解决方案 ...
- imageX批量安裝windows7
以一臺電腦爲sample,安裝完成windows os及其全部update,安裝全部常用軟件,打印機驅動,網絡磁碟機等. 關閉安全控制"UAC"和"維護解決方案" ...
- HNU 13074 Goldbach’s Conjecture 解题报告
题目大意:输入一个偶数(x<32000),输出这个偶数是由哪两个素数相加所得. 比如:一个偶数26,它可以是3+23,7+19,13+13,这些素数相加所得. 输入输出样例: Sample In ...
- PHP简单分页类
<?php /* * ********************************************* * @类名: page * @参数: $myde_total - 总记录数 * ...
- Keepalived+Nginx提供前端负载均衡+主从双机热备+自动切换
原文链接:http://unun.in/linux/156.html 方案: 采用两台Nginx服务器作为前端,提供静态web内容,分发web请求,一主一从,Keepalived实现状态监测,保证 N ...
- window 2008+apache2.4.4+php5.5+mysql-5.6.12+phpmyadmin4.0.4.1安装过程(参考他人文章基础上加上自己遇到的问题)
一.window server2008的安装 1.我用U盘安装的,先用UltraISO把server2008刻录到U盘中,过程我搜了一下,帖个地址: http://wenku.baidu.com/vi ...