1. C语言 文件异或加密
似乎在写模式下不会产生EOF,所以还是先取一下文件长度比较好
2. C语言 异或加密
太麻烦了,建议您可以下载文件夹加密超级大师试试。
文件夹加密超级大师支持所有windows系统,可以加密文件夹,加密文件,保护磁盘和数据粉碎,使用起来非常方便。
3. 异或加密与解密(C语言)注释
异或运算有一个特性
若
c = a xor b
那么
a = c xor b
根据这样的特性,你有一个信息a,然后你产生一个密码b,把它和a异或运算之后就变成了c。这就是一种加密,解密的时候,把c重新和b异或运算,就变回了a。
顺带说一下,异或是很弱的加密方法,很容易被破解的。
4. 如何利用异或运算进行简单加密解密
利用“^”异或运算对字符串进行加密
思路:1.先创建字符串输入的Scanner;
2.通过char[] array = password.toCharArray();// 获取字符数组;
3.遍历字符数组,按目前理解要用到遍历:数组所有元素进行访问,比如你要输出数组里所有的信息时,就要用到
4.进行异或运算
按位做“异或”运算是:位值相同得1,不同得0
例如:
< 加密过程:>
原解释的二进制为 1 1 0 0 ----原文
设定的key的二进制为 0 1 1 0 ----密匙
两者做“异或”结果为 0 1 0 1 ----密文
< 解密过程:>
0 1 0 1----密文
0 1 1 0----密匙
两者“异或”就得到了原文 1 1 0 0 ----原文
详细代码:
package com.lixiyu;
import java.util.Scanner;
public class Example {
public static void main(String[] args){
Scanner sca=new Scanner(System.in);
System.out.println("请输入一个英文字符串或解密字符串");
String line=sca.nextLine();//获取用户输入信息
char[] array=line.toCharArray();//获取字符数组
for (int i=0;i<array.length;i++){//历遍字符数组
array[i]=(char) (array[i]^20000);//对数组每个元素进行异或运算
}
System.out.println("加密解密结果如下:");
System.out.println(new String(array));//输出密钥
}
}
异或运算:
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
字符'A' 的ASCII编码为65 : 00000000 01000001
取整数7 : 00000000 00000000 00000000 00000111
XOR运算后 : 00000000 00000000 00000000 01000110
简单加密算法代码如下 :
public class Test {
public static final int KEY = 7;
public static void main(String[] args) {
String str = "Hello World!";
StringBuffer str2 = new StringBuffer(); //存储加密后的字符串
StringBuffer str3 = new StringBuffer(); //存储解密后的字符串
//加密过程
for(int i=0;i<str.length();i++)
{
char c = (char)(str.charAt(i) ^ KEY);
str2.append(c);
}
//解密过程
for(int i=0;i<str2.length();i++)
{
char c = (char)(str2.charAt(i) ^ KEY);
str3.append(c);
}
System.out.println("原始 的字符串为:" + str);
System.out.println("加密后 的字符串为:" + str2);
System.out.println("解密后 的字符串为:" + str3);
}
}
输出:
原始 的字符串为:Hello World!
加密后 的字符串为:Obkkh'Phukc&
解密后 的字符串为:Hello World!
5. 什么是异或加密
异或的特点是原始值经过两次异或某一个数后会变成原来的值,所以有时利用这个特性来进行加密,加密端把数据与一个密钥进行异或操作,生成密文。接收方收到密文后利用加密方提供的密钥进行再次异或操作就能得到明文。loop是汇编语言中的循环指令。它对cx进行减1,如果不为0则跳到循环首部继续执行循环体。如果为0,执行loop的下一条指令。
6. 一个基于异或的加密算法
大哥……你连流程图都画出来了……代码还不懂写……另外这个也不难吧~~就异或操作而已…………最简单的加密的了,小数那里你把它扩大再提取出来即可
……实在不行再帮你看看~~~~最好自己先尝试做~
==================================================================
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
//参数一:源文件 参数二:目标文件
//例如: XorProject.exe aa.txt bb.txt
int main( int argc , char* argv[] )
{
ifstream inf;
ofstream ouf;
string param;
if ( argc < 3)
{
cerr<<"缺少参数"<<endl;
return -1;
}
inf.open( argv[1] , ios::in | ios::binary );
ouf.open( argv[2] , ios::out | ios::binary | ios::trunc );
if ( !inf.is_open() || !ouf.is_open() )
{
cerr<<"打开文件失败"<<endl;
return -2;
}
double x0 = 0.0;
double u = 0.0;
cout<<"请输入u的值:";
cin>>u;
cout<<"请输入x0的值:";
cin>>x0;
double xn = x0;
int i;
for ( i = 0; i < 1000; i++ )
{
xn = u * xn * ( 1 - xn );
}
inf.seekg( 0 , ios::end );
unsigned long file_size = inf.tellg();
unsigned long p = 0;
inf.seekg( 0 , ios::beg );
while ( p < file_size )
{
unsigned char c;
inf.read( (char*)&c , 1 ); //读1个字节
int Y = ((int)(xn * 10000000)) % 1000; //取5 6 7位
int Z = Y % 256;
c ^= Z;
ouf.write( (char*)&c , 1 ); //写入加密后的1字节
for ( i = 0; i < 5; i++ )
{
xn = u * xn * ( 1 - xn );
}
p++;
}
inf.close();
ouf.close();
return 0;
}
代码比较简单,另外要注意一下,像你那样1000次迭达,感觉用处不太大,反而会导致xn的值接近0,所以你在输入x0的时候必须要输入一个接入1的数,否则经过这么多次迭代后xn就变成了0了,高精度运算也没用,5、6、7位都已经是0了,意义不太大
7. 请分析下这封包的加密方式
解密
游戏里面使用频率非常高的几大加密方式-----异或运算加密、背包运算加密等
1.异或运算加密:
例:
我们看到的是a,b,c ,d ,e ,f但是,他的实际意思不是这样的,实际意思是,1,2,3,4,5,6,当我们看到的是1时,他的实际意思就是6,在映射的时候没有按照一定规律影射,如果要在只知道a,b,c的情况下来破解其中的规律,那是需要一定经验和技巧的!
加密问题
y=f(x),
这里的 x就相当于上面提到的abcdef,而y呢就是123456,箭头就是f,f是映射方式,函数就是某种映射方式,从函数和映射的角度来理解加密是非常好的和正确的,
异或运算加密特点
这种加密方式,不是非常隐蔽,但是非常容易实现,建立一个映射,可以在整个软件中调用,所以,在游戏制作的时候,制作一个映射并不需要太高的技术,而且这个映射可以在任何时候修改,非常容易维护和更新,如果映射规律被破解了,也可以更新游戏来更新映射.
破解这种加密方式:
在一个网管软件中,有一个会员功能,功能是这样的,凡是会员,就可以不在网吧老板那儿去登记而是直接上机?
其实,该软件实现该功能的过程是这样的,首先用户输入用户名和密码,然后把用户名和密码发送到主控电脑,由主控电脑检查该用户名是否存在,如果存在,再检查密码是否正确,有密码发送,就会有封包发到主控机上去,就可以中途拦截,这个是WPE的专长,当然也可以使用其他黑客工具来拦截,先拦截几个用户名密码先,下面这个是某台电脑上被拦截到的封包,内容如下:
send 0000 01 00 00 00 7a 68 61 6e 67 6a 75 6e 30 30 37 00
00 02 00 64 66 6c 64 68 6a 66 64 65 6a 68 00 00
规则:比较法则和结构法则,这里使用比较法则,利用比较法则的相同比较和不同比较,很容易辨认用户名和密码各在那一段
用户名是: 7a 68 61 6e 67 6a 75 6e 30 30 37
密码是: 64 66 6c 64 68 6a 66 64 65 6a 68
马上使用我们的进位专家来对付这些16进制的文字,翻译出来的结果如下:
用户名:zhangjun007
密码:dfldhjfdejh
显然密码不正确,因为这个密码一般人是很难记住的,
异或运算分析来分析这个密码!
假设这是一个单满映射,
建立从A到A的映射到从A到Z的映射逐个分析,结果都是错的,
所以,应该考虑从字母到数字的映射,
最后检查出映射是从C到L映射到0-9,
分析结果出来了:
密码是:13915731275
这个密码是正确的
加密解密
从一个进制到另一个进制是一中异或运算,而且是单满映射,所谓单满映射,意思是每一个象都有原象,每一个原象都有象.
例如我们的映射是从16进制到10进制,象,就是10进制里面的所有的数,而16进制里面的数就是原象,每一个10进制的数都唯一对应一个16进制的数,所以说所有象都有唯一一个原象,而反过来,每一个16进制也唯一对应一个10进制的数,所以每一个象都有且只有一个象,这样的映射就是单满映射!
单满影射:
如果我们这样对应,0对应A,1对应B,这样一个一个对应下去,如果你的生日是:1986年2月14日,把生日加密,按照我们的映射,结果就是BJIG年C月BE日.
怎么知道一个封包是不是异或运算加密
如果一个封包确实是异或运算加密的,就要采用枚举法,也称穷举法,比如:y=F(x)
我们找几个点,称为已知点,然后解方程,
例:已知:a对应的是0,d对应的是3,f对应的是5,
那么可以这样做,
F(a)=0,F(d)=3, 这种异或运算都是线性的,也就是可以认为是一维的,映射就是:F(x)=Asc(x)-97,
Asc()是VB里面的一个函数,功能是返回该字母的Ascii码
带f对应5进行检验,
(这些可以确定函数的点从那里来?
例:要知道游戏里面钱的数字与封包里面数字的联系,
就要找点来确定,
我们扔掉一元钱,看看数字是多少,就找到一点,一个点如果确定不了,可以多取一些点来确定,如果还是不行,那么再来.
如果是不规则的映射,就要取遍所有点.
游戏里面钱的数字的加密一定是规则的运算加密的,至于是不是异或运算加密的就不知道了!要多动手分析才行,这个需要的是经验和技巧,或找一些工具来帮助分析,会对您的封包破解很有帮助的!
背包加密
是一中相当高级的加密方式.
背包分两种,加法背包和乘法背包!
加法背包:1<2,1+2<4,1+2+4<8,1+2+4+8<16,…….
前面所有的数加起来的值总小于后面的数,这些数就可以构成一个背包.数就是被加密的数.
这个背包组成这个数只有一种组合方式.
给大家一个封包(2,3,6,12,24,48).
由这个背包里的某些数构成的数:86,
86怎么来的?
是由2+12+24+48得到的.
如果你没有这个背包,而是直接得到这个86,你知道组成这个86的最小的数是多少吗?
你无法知道,因为加起来等于86的数非常多:85+1=86,82+2=86等等,你是无法知道的,所以,背包加密非常难破。
游戏里面如何利用这个加密呢?
用户名和密码只能有字母和数字组成,
那么总共就那么36个元素,
利用一个包含36个元素的背包,
背包的一个元素对应一个字母或者数字,
当玩家设好用户名后,
我们把这个用户名翻译成背包里面的元素,
然后把这些用户转化而来的数字加起来,
得到一个数,
这个数就是用户名,
你得到这个数,
你知道用户名吗?
例:有个密码是:511,背包是:(1,2,4,8,16,32,64,128,256),是加法背包,有如下对应关系:1对应a,2对应b,4对应c,8对应d,16对应e,32对应f,64——>g,128---->h,256---->i,
那么密码就是:abcdefghi,
从511到这个密码,是不是很难想到呢?
如果密码不是这个顺序呢?(不讲解)
解密方法:
1.利用孤立点破解;2.利用背包破解。
乘法背包
1<2,1+2<3,1*2*3<7,1*2*3*7<43,1*2*3*7*42<1683,
背包的特点是:如果背包里面的数据按小到大排列,那么,前面所有数据的乘积小于后面的任何一个元素.
破解乘法背
同加法背包一样,可以利用孤立点的方法,也可以使用直接得到背包的方法破解!
已知背包、加密数据,怎么知道背包数是有那些元素组成的.
加法背包里找背包里面最接近数但是又比数小的数A,加密数减A,比较被减后的数,继续重复上面的操作,是很容易就能找到所有的组成元素了!乘法的方法也是一样的道理,这里就不介绍了!
8. 如何使用XOR运算进行加密/解密的原理
XOR
是位或运算,即2个操作数对应位做或比较,若同为0,结果也为0,若有一方该位为1,或者2者都为1,则该位结果也为1。所以将两个数按2进制对比展开得:
10101
00010
---------按位或
=
10111
跟10101比较一下,发现多了1*2即21+2=23。