Member 13725790 Ответов: 2

Как установить результат в текстовом поле с помощью java netbeans


Я пытаюсь разработать программу, в которой пользователь будет вводить текст в текстовое поле (plaintext), затем пользователь должен выбрать ключевые кнопки (key_128) (key_192) (key_256), затем он нажмет на кнопку (encrypt_data), чтобы зашифровать введенный пользователем текст. Затем он покажет вывод в другом текстовом поле (шифрование)
Это исходный код, над которым я работаю

public class MARS extends javax.swing.JFrame {

    static Cipher cipher;
	
	private static int[] K;
        

	private static final int [] s_box ={
// s_box values here
	};
	
	private static int rotl(int val, int pas) {
		return (val << pas) | (val >>> (32 - pas));
	}
	private static int rotr(int val, int pas) {
		return (val >>> pas) | (val << (32-pas));
	}
	
	
	private static int[] expandKey(byte[] key){
		int n = key.length/4;
		int[] tmp = new int[40];
		int[] data = new int[n];
		
		for(int i =0;i<data.length;i++)
			data[i] = 0;
		
		int off = 0;
		for(int i=0;i<data.length;i++){
			data[i] = 	((key[off++]&0xff))|
						((key[off++]&0xff) << 8) |
						((key[off++]&0xff) << 16) |
						((key[off++]&0xff) << 24);
		}
		
		int[] T = new int[15];
		for(int i=0;i<T.length;i++){
			if(i<data.length) T[i] = data[i];
			else if(i == data.length) T[i] = n;
			else T[i] = 0;
		}
		
		for(int j=0;j<4;j++){
			for(int i=0;i<T.length;i++)
				T[i] = T[i] ^ (rotl(T[Math.abs(i-7 %15)] ^ T[Math.abs(i-2 %15)],3) ^ (4*i+j));
			for(int c=0;c<4;c++)
				for(int i=0;i<T.length;i++)
					T[i] = T[i] + rotl(s_box[(int)(T[Math.abs(i-1%15)] & 0x000001ff)],9);
			for(int i = 0;i<=9;i++) tmp[10*j+i] = T[4*i%15];
		}
		
		int[] B = {0xa4a8d57b, 0x5b5d193b, 0xc8a8309b, 0x73f9a978};
		int j,w,m,r,p;
		for(int i = 5;i<=35;i++){
			j = tmp[i] & 0x00000003;
			w = tmp[i] | 0x00000003;
			m = generateMask(w);
			r = tmp[i-1] & 0x0000001f;
			p = rotl(B[j],r);
			tmp[i] = w ^ (p & m); 
		}
		
		return tmp;
	}
	
	private static int generateMask(int x){
		int m;
		
		m = (~x ^ (x>>>1)) & 0x7fffffff;
		m &= (m >> 1) & (m >> 2); 
		m &= (m >> 3) & (m >> 6); 
		    
		if(m == 0) 
			return 0;

		m <<= 1; m |= (m << 1); m |= (m << 2); m |= (m << 4);

		m |= (m << 1) & ~x & 0x80000000;

		return m & 0xfffffffc;

	}
	
	
	public static byte[] encryptBloc(byte[] in){
		byte[] tmp =  new byte[in.length];
		int aux;

		
		int[] data = new int[in.length/4];
		for(int i =0;i<data.length;i++)
			data[i] = 0;
		int off = 0;
		for(int i=0;i<data.length;i++){
			data[i] = 	((in[off++]&0xff))|
						((in[off++]&0xff) << 8) |
						((in[off++]&0xff) << 16) |
						((in[off++]&0xff) << 24);
		}
	
		int A = data[0],B = data[1],C = data[2],D = data[3];
		A = A + K[0];
		B = B + K[1];
		C = C + K[2];
		D = D + K[3];
		
		//forward mixing
		for(int i = 0;i<=7;i++){
			B = B ^ s_box[A & 0xff];
			B = B + s_box[(rotr(A,8) & 0xff) + 256]; 
            C = C + s_box[rotr(A,16) & 0xff]; 
            D = D ^ s_box[(rotr(A,24) & 0xff) + 256]; 
            
            A = rotr(A,24);
            
            if(i == 1 || i == 5) A = A + B;
            if(i == 0 || i == 4) A = A + D;
            
            aux = A;
			A = B;
			B = C;
			C = D;
			D = aux;
		}
		int R,L,M;
		int[] eout;
		//cryptographic core
		for(int i = 0;i<=15;i++){
			
			eout = E_func(A, K[2*i+4], K[2*i+5]);
			
			A = rotl(A,13);
			C = C + eout[1];
			
			if(i<8) {
				B = B + eout[0];
				D = D ^ eout[2];
			}
			else{
				D = D + eout[0];
				B = B ^ eout[2];
			}
			
			aux = A;
			A = B;
			B = C;
			C = D;
			D = aux;
		}
		//backward mixing
		for(int i = 0;i<=7;i++){
			
			if(i == 3 || i == 7) A = A - B;
			if(i == 2 || i == 6) A = A - D;
			
			B = B ^ s_box[(A & 0xff) + 256];
			C = C - s_box[rotr(A,24) & 0xff];
			D = D - s_box[(rotr(A,16) & 0xff) + 256];
			D = D ^ s_box[rotr(A,8) & 0xff];
			
			A = rotl(A,24);
			
			aux = A;
			A = B;
			B = C;
			C = D;
			D = aux;

		}
		A = A - K[36];
		B = B - K[37];
		C = C - K[38];
		D = D - K[39];
		
		data[0] = A;data[1] = B;data[2] = C;data[3] = D;
		
		for(int i = 0;i<tmp.length;i++){
			tmp[i] = (byte)((data[i/4] >>> (i%4)*8) & 0xff);
		}
		
		return tmp;	
	}
	
	private static int[] E_func(int in,int k1,int k2){
		int[] tmp = new int[3];
		int M,L,R;
		M = in + k1;
		R = rotl(in,13) * k2;
		L = s_box[M & 0x000001ff];
		R = rotl(R,5);
		M = rotl(M,R & 0x0000001f);
		L = L ^ R;
		R = rotl(R,5);
		L = L ^ R;
		L = rotl(L,R & 0x0000001f);
		
		tmp[0] = L;
		tmp[1] = M;
		tmp[2] = R;
		
		return tmp;
	}
	
	public static byte[] encrypt(byte[] in,byte[] key){
		K = expandKey(key);
		int lenght=0;
		byte[] padding = new byte[1];
		int i;
		lenght = 16 - in.length % 16;				
		padding = new byte[lenght];					
		padding[0] = (byte) 0x80;
		
		for (i = 1; i < lenght; i++)				
			padding[i] = 0;

		byte[] tmp = new byte[in.length + lenght];		
		byte[] bloc = new byte[16];	
		
		int count = 0;

		for (i = 0; i < in.length + lenght; i++) {
			if (i > 0 && i % 16 == 0) {
				bloc = encryptBloc(bloc);
				System.arraycopy(bloc, 0, tmp, i - 16, bloc.length);
			}
			if (i < in.length)
				bloc[i % 16] = in[i];
			else{														
				bloc[i % 16] = padding[count % 16];
				count++;
			}
		}
		if(bloc.length == 16){
			bloc = encryptBloc(bloc);
			System.arraycopy(bloc, 0, tmp, i - 16, bloc.length);
		}
		
		return tmp;
	}


Это код, который я написал в кнопке (encrypt_data), но он дает ошибку :(

byte[] plain = plaintext.getText().getBytes();
        if (key_128.isSelected())
       {
         byte[] K = getText().getBytes();
       }

       else if (key_192.isSelected())
       {
         byte[] K = getText().getBytes();
       }
     else if (key_256.isSelected()){
        byte[] K = getText().getBytes();
     }
       byte[] encrypted = encrypt(plain, K);
       String encrypted = encrypt.setText();


И мне нужно установить значения в ключевых кнопках (key_128) (key_192) (key_256). Как я могу это сделать на java? Каждый ключ будет иметь двоичное значение

Что я уже пробовал:

я попытался установить значения в кнопке encrypt_data, но это не сработало

Richard MacCutchan

Какая ошибка? Но было бы гораздо проще выбросить весь этот спагетти-код и использовать классы шифрования Java: шифрование java - поиск в Google[^].

Member 13725790

@Richard MacCutchan. Извините за мой поздний ответ, но проблема заключается в getText() , что в операторах if else и последней строке, показывающей результат в textbox encrypt

Richard MacCutchan

Глядя на ваш код, я не думаю, что вы можете позвонить getText() таким образом. Этот вызов должен быть связан с объектом JTextField.

Member 13725790

Я просто изменил весь код на то, что вы рекомендовали. Но я не уверен, как получить вывод в Jtextbox или дать K целочисленное значение, поэтому, как только пользователь нажимает эту клавишу, он непосредственно вычисляет, как калькулятор 😥 как я могу это сделать? Я пытался искать но ничего не получалось

Richard MacCutchan

Извините, я тоже не знаю; ваш код нелегко понять. Я предлагаю вам перейти к документации Java (Обзор (Java Platform SE 8 )[^]) по конкретным вопросам, а также Учебные Пособия По Java™ [^] для общих примеров кода и учебных пособий.

Member 13725790

Не извиняйся. Я очень ценю ваше предложение о помощи. Кроме того, ты помог мне, и я очень благодарен тебе. Я согласен, что это сложный код. Но я продолжу искать и благодарю вас за ссылки 👍 🌹

Member 13725790

я придумал решение, но в строке 2 есть ошибка, если вы можете мне помочь, пожалуйста. и я опубликовал еще один вопрос, связанный с этим. спасибо

2 Ответов

Рейтинг:
2

Richard Deeming

На первый взгляд, вы получаете ошибку компилятора, потому что вы объявили K внутри то if / else if блоки, но вы пытаетесь их использовать снаружи из этих блоков.

Переместите объявление выше первого if заявление. Вам также нужно будет обработать случай, когда ни один из трех вариантов не выбран - ты знайте, что этого никогда не произойдет, но компилятор этого не делает и будет жаловаться на это.

byte[] plain = plaintext.getText().getBytes();
byte[] K;
if (key_128.isSelected())
{
    K = getText().getBytes();
}
else if (key_192.isSelected())
{
    K = getText().getBytes();
}
else if (key_256.isSelected())
{
    K = getText().getBytes();
}
else
{
    throw new IllegalStateException();
}

Теперь вам просто нужно понять, почему у вас есть if утверждения вообще, учитывая, что каждая ветвь делает точно то же самое!


Member 13725790

Вы правы, я за нулевой вариант, который я только что добавил, Но проблема все та же. И о том, что вы упомянули, я попробовал это сделать, но позже мне понадобится система для расчета времени шифрования, поэтому я думаю, что она будет б прямо с момента нажатия пользователем кнопки шифрования до тех пор, пока не появятся результаты. Но я попробую, как вы говорите, надеюсь, что это сработает. Спасибо что помогли мне выбраться

Рейтинг:
0

Member 13725790

это решение, которое я придумал, но во второй строке есть ошибка. я пытаюсь решить, и я отправил вопрос, если кто-нибудь может помочь. Спасибо!

byte[] plain = plaintext.getText().getBytes();
byte[] K = new BinaryCodec().toByteArray("0011000100110011100000001010");
byte[] encrypted = encrypt(plain, K);
String a = new String(encrypted);
encryptedtext.setText(a);