資源簡介
華科密碼學課設之SPN的查分攻擊以及暴力破解算法。差分攻擊算法只能攻擊出2個子密鑰,其余的6個子密鑰已經通過窮舉法攻擊破解得到。
代碼片段和文件信息
package?com.cyc.www.cry;
import?java.io.File;
import?java.io.FileNotFoundException;
import?java.io.FileReader;
import?java.util.Scanner;
/**
?*?@author?Hust?陳艷超
?*/
public?class?SPN_ATTACK_DIFF?{
private?int??maxKeyL1?=?0;
private?int?maxKeyL2?=?0;
private?static?short[]?sBox?=?{1441312151183106125907};
private?static?short[]?sBoxOpp?=?{1434811210157139611205};?//s盒的逆
private?static?short[]??pBox?=?{15913261014371115481216};
private?String?path?=?“D:\\cipherAndPlain.dat“;
private?short[]?cipherNum;
private?static?short[]?plainNum;
private?int?Num?=?8000;
private?int[][] count;
private?static?short?Ktemp?=?(short)0x3A94;
public?static?void?main(String[]?args)?{
SPN_ATTACK_DIFF?test?=?new?SPN_ATTACK_DIFF();
}
public??SPN_ATTACK_DIFF()?{
initAll();
attackDiff();
exhaustKeyDiff();
}
/*
?*?初始化8000組明密文對,256候選密鑰,計數器
?*/
public??void?initAll()
{
File?file?=?new?File(path);
plainNum?=?new?short[Num];
cipherNum?=?new?short[Num];
count?=?new?int?[16][16];
try?{
Scanner?in?=?new?Scanner(new?FileReader(file));
for?(int?i?=?0;?i? String?line?=?in.nextLine();
String[]?tokens?=?line.split(“\\|“);
plainNum[i]?=?(short)?(Integer.parseInt(tokens[1]));
cipherNum[i]?=?(short)?(Integer.parseInt(tokens[3]));
}
}catch?(FileNotFoundException?e)?{
e.printStackTrace();
}
for?(int?i?=?0;?i?16;?i++)?{
for?(int?j?=?0;?j?16;?j++)?{
count[i][j]?=?0;
}
}
}
/*1
?*?進行差分攻擊?
?*?運行之后發現8000對明密文對中只有70對是經過篩選的可以用的明密文對
?*/
public?void?attackDiff()?{
short?v2?=?0v4?=?0u2?=?0?u4?=?0;
short?v2x?=?0?v4x?=?0?u2x=?0?u4x?=?0;?
short?u2p?=?0?u4p?=?0;
short?y1?=?0y1x?=?0y3?=?0?y3x?=?0;
short?l1?=?0?l2?=?0;
short?y2?=?0?y4?=?0y2x?=?0?y4x?=?0;
short?test?=?0;
short??p?=?0p2?=?0;
for?(int?i?=?0;?i? for?(int?j?=?i?+?1;?j? p?=?(short)((plainNum[i]?<16)>>>16);
p2?=?(short)((plainNum[j]<<16)>>>16);
if?(((p?^?p2)?==?0x0b00)?&&?(test?52))?{
y1?=?(short)(((cipherNum[i]?&?0xf000)<<16)>>>28);
y3?=?(short)((cipherNum[i]?&?0x00f0)>>>4);
y1x?=?(short)(((cipherNum[j]?&?0xf000)<<16)>>>28);
y3x?=?(short)((cipherNum[j]?&?0x00f0)>>>4);
if?(y1?==?y1x?&&?y3?==?y3x)?{
test++;
System.out.println(test?+?“\t“?+?i?+“\t“?+?j?);
y2?=?(short)((cipherNum[i]?&?0x0f00)>>>8);
y4?=?(short)(cipherNum[i]&?0x000f);
y2x?=?(short)((cipherNum[j]?&?0x0f00)>>>8);
y4x?=?(short)(cipherNum[j]?&?0x000f);
for?(int?k?=?0;?k?16;?k++)?{
for?(int?k2?=?0;?k2?16;?k2++)?{
v2?=?(short)(k?^?y2);
v4?=?(short)(k2?^?y4);
u2?=(short)?sBoxOpp[v2];
u4?=?(short)sBoxOpp[v4];
v2x?=?(short)(k?^?y2x);
v4x?=?(short)(k2?^?y4x);
u2x?=?(short)sBoxOpp[v2x];
- 上一篇:解析身份證省市代碼.zip
- 下一篇:android 紙牌游戲
評論
共有 條評論