• 大小: 6KB
    文件类型: .java
    金币: 2
    下载: 0 次
    发布日期: 2024-02-01
  • 语言: Java
  • 标签: 华科  密码学  课设  spn  

资源简介

华科密码学课设之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 < Num; 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 < cipherNum.length; i++) {
for (int j = i + 1; j < cipherNum.length; 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];

评论

共有 条评论