Programming/Etc.2010.02.17 14:04

'Programming > Etc.' 카테고리의 다른 글

마이크로 블로그 UML  (0) 2010.02.17
Posted by 회색꿈

댓글을 달아 주세요

Programming/Java2010.02.17 14:00

개요 : 암호키를 생성하여 평문을 암호문으로 암호문을 복호문으로 만든다.

사용언어 : JAVA

소스코드

import java.awt.*;
import java.awt.event.*;

class test_sub extends Frame implements ActionListener {
	//GUI에 사용될 객체 생성
	private Label lb = new Label("암호키 생성");
	private Label lb1 = new Label("암호키");
	private Label lb2 = new Label("k1:");
	private Label lb2_1 = new Label("k2:");
	private Label lb3 = new Label("평문");
	private Label lb4 = new Label("암호화");
	private Label lb5 = new Label("복호화");
	private TextField tf = newTextField("",5);
	private TextField tf1 = newTextField("",5);
	private TextField tf2 = newTextField("",5);
	private TextField tf3 = newTextField("",5);
	private Button bt = new Button("암호키");
	private Button bt1 = new Button("암호화");
	private Button bt2 = new Button("복호화");
	private Button bt3 = new Button("초기화");
	private Button bt4 = new Button("종료");
	
	//각 배열 및 변수 선언
	int p10[] = {3,5,2,7,4,10,1,9,8,6};
	int p8[] = {6,3,7,4,8,5,10,9};
	int ip[] = {2,6,3,1,4,8,5,7};
	int ip1[] = {4,1,3,5,7,2,8,6};
	int ep[] = {4,1,2,3,2,3,4,1};
	int s0[][] = {{1,0,3,2}, {3,2,1,0}, {0,2,1,3}, {3,1,3,2}};
	int s1[][] = {{0,1,2,3}, {2,0,1,3}, {3,0,1,0}, {2,1,0,3}};
	int p4[] = {2,4,3,1};
	int input[] = new int[10];
	int temp[] = new int[10];
	int temp2[] = new int[10];
	int temp3[] = new int[10];
	int k1[] = new int[8];
	int k2[] = new int[8];
	int k = 0, l = 0, l1 = 0;
	
	public test_sub(){
		super("S-DES");
		this.init();
		this.setSize(300, 300);
		this.setVisible(true);
	}
	
	public void init(){
		setLayout(new BorderLayout());
		setLayout(null);
		
		bt.addActionListener(this);
		bt1.addActionListener(this);
		bt2.addActionListener(this);
		bt3.addActionListener(this);
		bt4.addActionListener(this);

		add(lb);
		add(lb1);
		add(lb2);
		add(lb2_1);
		add(lb3);
		add(lb4);
		add(lb5);
		add(tf);
		add(tf1);
		add(tf2);
		add(tf3);
		add(bt);
		add(bt1);
		add(bt2);
		add(bt3);
		add(bt4);
		
		lb.setBounds(30, 30, 70, 20);
		lb1.setBounds(30, 60, 70, 20);
		lb2.setBounds(110, 60, 80, 20);
		lb2_1.setBounds(200, 60, 80, 20);
		lb3.setBounds(30, 90, 70, 20);
		lb4.setBounds(30, 120, 70, 20);
		lb5.setBounds(30, 150, 70, 20);
		tf.setBounds(150, 30, 100, 20);
		tf1.setBounds(150, 90, 100, 20);
		tf2.setBounds(150, 120, 100, 20);
		tf3.setBounds(150, 150, 100, 20);
		bt.setBounds(30, 200, 70, 30);
		bt1.setBounds(110, 200, 70, 30);
		bt2.setBounds(190, 200, 70, 30);
		bt3.setBounds(70, 240, 70, 30);
		bt4.setBounds(150, 240, 70, 30);
	}
	//버튼 클릭 이벤트 처리
	public void actionPerformed(ActionEvent e){
		if(e.getSource()==bt){//암호키 버튼 클릭시
			String pw = tf.getText();
			for(int i=0; i<10; i++){
				 char pw1 = pw.charAt(i);
				input[i] = Integer.parseInt(String.valueOf(pw1));
			}
			
			this.key(); // 암호키 생성 클래스 호출
			
			//K1과 K2 값을 레이블에 출력하기 위한 처리
			String pw2[] = new String[8];
			String pw3[] = new String[8];
			
			for(int i=0; i<8; i++){
				pw2[i] = Integer.toString(k1[i]);
				pw3[i] = Integer.toString(k2[i]);
			}
			
			for(int i=0; i<8; i++){
				lb2.setText(lb2.getText() + pw2[i]);
				lb2_1.setText(lb2_1.getText() + pw3[i]);
			}
		}
		else if(e.getSource()==bt1){//암호화 버튼 클릭시
			String pw = tf1.getText();
			char pw1 = pw.charAt(0);
			
			pw = Integer.toBinaryString(pw1);

			for(int i=0; i<8; i++){
				if(i==0)
					input[i] = 0;
				else{
					pw1 = pw.charAt(i-1);
					input[i] = Integer.parseInt
						(String.valueOf(pw1));
				}
			}
			//암호화를 위한 클래스 호출		
			this.ip();
			this.ep();
			this.xor_k1();
			this.s0s1();
			this.p4();
			this.ipp4();
			this.sw();
			this.ep();
			this.xor_k2();
			this.s0s1();
			this.p4();
			this.ipp4();
			this.ip_1();
			
			String pw2[] = new String[8];
			
			for(int i=0; i<8; i++)
				pw2[i] = Integer.toString(temp3[i]);
			for(int i=0; i<8; i++)
				tf2.setText(tf2.getText()+pw2[i]);
		}
		else if(e.getSource()==bt2){//복호화 버튼 클릭시
			String pw = tf2.getText();

			for(int i=0; i<8; i++){
					char pw1 = pw.charAt(i);
					input[i] = Integer.parseInt
						(String.valueOf(pw1));
			}
			//복호화를 위한 클래스 호출
			this.ip();
			this.ep();
			this.xor_k2();
			this.s0s1();
			this.p4();
			this.ipp4();
			this.sw();
			this.ep();
			this.xor_k1();
			this.s0s1();
			this.p4();
			this.ipp4();
			this.ip_1();
			
			String pw2[] = new String[8];
			
			for(int i=0; i<8; i++)
				pw2[i] = Integer.toString(temp3[i]);
			for(int i=0; i<8; i++)
				tf3.setText(tf3.getText()+pw2[i]);
		}
		else if(e.getSource()==bt3){//초기화 버튼 클릭
			//각 입력부 값을 초기화
			lb2.setText("k1:");
			lb2_1.setText("k2:");
			tf.setText("");
			tf1.setText("");
			tf2.setText("");
			tf3.setText("");
		}
		else{//종료
			System.exit(0);
		}
	}
	//암호키 생성(K1, K2)
	public void key(){
		//P10 처리
		for(int i=0; i<10; i++){
			k = p10[i];
			temp[i] = input[k-1];
		}
		//P10 shift
		int x=temp[0], y=temp[5];		
		for(int i=0; i<5; i++){
			if(i==4){
				temp[4] = x;
				temp[9] = y;
			}
			else{
				temp[i] = temp[i+1];
				temp[i+5] = temp[i+6];
			}
		}
		//P8(K1) 처리
		for(int i=0; i<8; i++){
			k = p8[i];
			k1[i] = temp[k-1];
		}
		//P8(Shift(Shift(P10(key)))) - K2
		for(int j=0; j<2; j++){
			x=temp[0]; y=temp[5];
			for(int i=0; i<5; i++){
				if(i==4){
					temp[4] = x;
					temp[9] = y;
				}
				else{
					temp[i] = temp[i+1];
					temp[i+5] = temp[i+6];
				}
			}
		}
		for(int i=0; i<8; i++){
			k = p8[i];
			k2[i] = temp[k-1];
		}
	}
	
	//IP 처리
	public void ip(){
		for(int i=0; i<8; i++){
			k = ip[i];
			temp[i] = input[k-1];
		}
	}
	//E/P 처리
	public void ep(){
		for(int i=0; i<8; i++){
			k = ep[i];
			temp2[i] = temp[k-1];
		}
	}
	//E/P 출력값을 암호키 k1과 XRO
	public void xor_k1(){
		for(int i=0; i<8; i++){
			k = k1[i] + temp2[i];

			if(k==1)
				temp3[i] = 1;
			else
				temp3[i] = 0;
		}
	}
	/* E/P 출력값에 서브키와 XRO된 값을
	s0와 s1의 행열에 대입하여 각 2비트씩 생성 */
	public void s0s1(){
		l = temp3[0]*2 + temp3[3];
		l1 = temp3[1]*2 + temp3[2];
		
		k = s0[l][l1];
		
		temp2[0] = k/2;
		temp2[1] = k%2;
		
		l = temp3[4]*2 + temp3[7];
		l1 = temp3[5]*2 + temp3[6];
		
		k = s1[l][l1];
		
		temp2[2] = k/2;
		temp2[3] = k%2;
	}
	//P4 처리
	public void p4(){
		for(int i=0; i<4; i++){
			k = p4[i];
			temp3[i] = temp2[k-1];
		}
	}
	//P4 출력값을 IP 출력값 좌측 4비트와 XOR
	public void ipp4(){
		for(int i=0; i<4; i++){
			k = temp[i] + temp3[i];
			
			if(k==1)
				temp2[i] = 1;
			else
				temp2[i] = 0;
		}
	}
	//스위치 함수
	public void sw(){
		for(int i=0; i<8; i++){
			if(i<4)
				temp[i] = temp[i+4];
			else
				temp[i] = temp2[i-4];
		}
	}
	//E/P 출력값을 암호키 k2와 XOR
	public void xor_k2(){
		for(int i=0; i<8; i++){
			k = k2[i] + temp2[i];

			if(k==1)
				temp3[i] = 1;
			else
				temp3[i] = 0;
		}
	}
	//IP-1 처리
	public void ip_1(){
		for(int i=0; i<4; i++){
			temp[i] = temp2[i];
		}
		
		for(int i=0; i<8; i++){
			k = ip1[i];
			temp3[i] = temp[k-1];
		}
	}
}
public class test {
	public static void main(String args[]){
		test_sub es = new test_sub();
	}
}

실행화면



작성후기

대학초기 자바 언어에 대한 이해도가 떨어질때 작성한 것이라 지금보니 코드가 엉망이네요. 처음에는 콘솔기반으로 작성을 한 후에 GUI로 옮겨서 작업했던 것 같습니다.  각 처리과정을 메소드로 분리 시켜서 암호화 작성 이후에 복호화 하는 과정은 메소드들의 호출 순서만 변경하면 되었기 때문에 수월했습니다.

'Programming > Java' 카테고리의 다른 글

S-DES 암호화 복호화  (0) 2010.02.17
Posted by 회색꿈

댓글을 달아 주세요

Programming/C2010.02.17 13:56

개요 : IP주소를 입력받아 해당 IP주소의 1~1023번 포트를 순차적으로 스캔

사용언어 : C#

소스코드

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace Report2
{
	/// 
	/// Class에 대한 요약 설명입니다.
	/// 
	class PortScan
	{
		public static void Main()
		{
			int i;
			string inputIP;

			Console.Write("Input Scaning IP Address : "); 
			inputIP = Console.ReadLine(); //IP주소를 입력 받는다.

			for(i=1; i<1024; i++) //1~1023번 포트를 순차적으로 스캔하기 위한 처리
			{
				Console.Write("{0} Port Scan", i); //스캔중인 포트번호 출력

				IPEndPoint ipep = new IPEndPoint(
					IPAddress.Parse(inputIP), i); //입력받은 IP주소와 포트에 								대한 IPEndPoint 생성

				Socket server = new Socket(AddressFamily.InterNetwork,
					SocketType.Stream, ProtocolType.Tcp); //TCP 소켓 생성

				try
				{
					server.Connect(ipep); //ipep의 IP주소와 포트에 소켓 연결
					Console.WriteLine(" - Open");
				}
				catch (SocketException e) // 연결실패에 대한 처리
				{
					Console.WriteLine(" - Close");
					//Console.WriteLine(e.ToString());
				}
			}
		}
	}
}


실행화면

'Programming > C' 카테고리의 다른 글

중위식을 후위식으로 변환, 후위식을 중위식으로 변환  (0) 2010.02.17
PortScan  (0) 2010.02.17
Posted by 회색꿈

댓글을 달아 주세요