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。