import java.util.Arrays;
import java.util.Scanner;
public class A5_1算法 {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner in = new Scanner(System.in);
int X[] = new int[19]; //x寄存器
int Y[] = new int[22]; //y寄存器
int Z[] = new int[23]; //z寄存器
System.out.println("請輸入需要獲取多少位祕鑰流:");
int w = in.nextInt();
int []S = new int[w]; //開闢存儲指定w位祕鑰流的空間
System.out.println("輸入初始寄存器X中的值:");
for (int i = 0; i < X.length; i++) {
X[i] = in.nextInt();
}
System.out.println("輸入初始寄存器Y中的值: ");
for (int i = 0; i < Y.length; i++) {
Y[i] = in.nextInt();
}
System.out.println("輸入初始寄存器Z中的值: ");
for (int i = 0; i < Z.length; i++) {
Z[i] = in.nextInt();
}
for (int i = 0; i < w; i++) { //循環進行獲取w位祕鑰
int M = Maxj(X[8],Y[10],Z[10]); //進行投票,來決定處不處理X,Y,Z寄存器
if (X[8]==M) { //處理X寄存器
int t = X[13]^X[16]^X[17]^X[18];
Xleft(X);
X[0] = t;
}
if (Y[10]==M) {//處理y寄存器
int t = Y[20]^Y[21];
Yleft(Y);
Y[0] = t;
}
if (Z[10]==M) {//處理z寄存器
int t = Z[7]^Z[20]^Z[21]^Z[22];
Zleft(Z);
Z[0] = t;
}
S[i] = (X[18]^Y[21])^Z[22]; //保存生成的祕鑰位
//System.out.println(X[18]^Y[21]^Z[22]);
}
System.out.println(w+"位祕鑰流爲:");
System.out.println(Arrays.toString(S));
System.out.println("X寄存器的內容爲:");
System.out.println(Arrays.toString(X));
System.out.println("Y寄存器的內容爲:");
System.out.println(Arrays.toString(Y));
System.out.println("Z寄存器的內容爲:");
System.out.println(Arrays.toString(Z));
System.out.println();
}
/**
* x寄存器右移移函數
* @param x
*/
public static void Xleft(int[] x) {
for (int i = x.length-1; i>0; i--) {
x[i] = x[i-1];
}
}
/**
* y寄存器右移函數
* @param x
*/
public static void Yleft(int[] y) {
for (int i = y.length-1; i>0; i--) {
y[i] = y[i-1];
}
}
/**
* z寄存器右移函數
* @param x
*/
public static void Zleft(int[] z) {
for (int i = z.length-1; i>0; i--) {
z[i] = z[i-1];
}
}
/**
* 投票函數
* @param x
* @param y
* @param z
* @return
*/
public static int Maxj(int x, int y, int z) {
int count = 0;
if (x==1) {
count++;
}
if (y==1) {
count++;
}
if (z==1) {
count++;
}
if (count>=2) {
return 1;
}else {
return 0;
}
}
}
A5/1加密算法(java實現)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.