작년 그니까 2학기 때 정보보안 수업 기말과제 였던 sdes 암호 알고리즘을 자바로 짰다.

 

키 값은 0~1023까지 입력 가능하며 암호화는 알파벳 A~Z, a~z까지 한 문자만 받을 수 있음

키 생성과 암호화, 복호화 버튼 모두 클릭 시 세부사항 버튼이 활성화 됨

 

클래스는 총 4개로 구성

- Test 클래스

프로그램 실행 시 제일 처음 보이는 UI의 클래스

 

- Details 클래스

세부사항 버튼 클릭 시 나타나는 화면의 UI 클래스

 

- S_DES 클래스

프로그램에서 제일 핵심적인 s-des 알고리즘이 코드로 구현 되어 있는 클래스

 

- Main 클래스

본 프로그램의 메인 클래스

S-DES 클래스 알고리즘

package simple;


public class S_DES {
	
	int tmp[] = new int[10];

	int tmp2[]  = new int[10];

	int tmp3[] = new int[10];

	int input[] = new int[10];

	int k1[] = new int[8];

	int k2[] = new int[8];

	int right[] = new int[4];
	
	int tot = 0;
	
	int d = 1;
	
	int a, b;

	int index = 0, row = 0, col = 0;

	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 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 ip1[] = {4, 1, 3, 5, 7, 2, 8, 6};

	int deci;

	int [] digits;

 
	int dep10[] = new int[10];
	
	int oneshift[] =  new int[10];
	
	int twoshift[] = new int[10];
	
	int dep8[] = new int[8];
	
	public void key_generation() {

		//Permutation10

		for(int i = 0; i < 10; i++) {

			index = p10[i];

			tmp[i] = input[index-1];

		}
		
		for(int i=0; i<10; i++)
			dep10[i] = tmp[i];

		//P10 left shift

		a = tmp[0]; b = tmp[5];
		
		for(int i = 0; i < 5; i++) {
			if(i == 4) {

				tmp[4] = a;

				tmp[9] = b;

			}

			else {

				tmp[i]=tmp[i + 1];

				tmp[i + 5] = tmp[i + 6];

			}
			
		}
		
		for(int i=0; i<10; i++)
			oneshift[i] = tmp[i];
 
		
		//afterP8 key1 generation

		for(int i = 0; i < 8; i++) {

			index = p8[i];

			k1[i] = tmp[index-1];

		}

 
		//left shift by2 key2 generation

		for(int j = 0; j < 2; j++) {

			a = tmp[0]; b = tmp[5];

			for(int i = 0; i < 5; i++) {

				if(i == 4) {

					tmp[4] = a;

					tmp[9] = b;

				}

				else {

					tmp[i]=tmp[i + 1];

					tmp[i + 5] = tmp[i + 6];

				}

			}

		}
		
		for(int i=0; i<10; i++)
			twoshift[i] = tmp[i];

		for(int i = 0; i < 8; i++) {

			index = p8[i];

			k2[i] = tmp[index-1];

		}

	}

	//IP(8)

	public void ip() {

		for(int i = 0; i < 8; i++) {

			index = ip[i];

			tmp[i] = input[index-1];

		}

		for(int i=0; i<8; i++)
			dep8[i]=tmp[i];

	}


	//E/P

	public void ep() {

		for(int i=0; i<4;i++)

			right[i]=tmp[i+4];

		

		for(int i = 0; i < 8; i++) {

			index = ep[i];

			tmp2[i] = right[index-1];

		}

	}

	

	//k1과 E/P_output XOR

	public void xor_k1() {

		for(int i = 0;i < 8;i++) {

			index = tmp2[i]^k1[i];

			tmp3[i] = index;

		}

	}

 

	public void s_box() {

		row = tmp3[0]*2 + tmp3[3];

		col  = tmp3[1]*2 + tmp3[2];


		index = s0[row][col];

//		System.out.println("s0 index:" + index);

		tmp2[0] = index/2;

		tmp2[1] = index%2;

 

		row = tmp3[4]*2 + tmp3[7];

		col  = tmp3[5]*2 + tmp3[6];

		

		index = s1[row][col];

//		System.out.println("s1 index: "+index);

		tmp2[2] = index/2;

		tmp2[3] = index%2;	

	}

 

	public void p4() {

		for(int i = 0; i < 4;i++) {

			index = p4[i];

			tmp3[i] = tmp2[index-1];

		}

	}

 

	public void ipXORp4() {

		for(int i = 0; i < 4; i++) {

			index = tmp[i] + tmp3[i];

			if(index == 1)

				tmp2[i] = 1;

			else

				tmp2[i] = 0;

		}

	}

	public void sw() {

		for(int i = 0; i<8; i++) {

			if(i<4)

				tmp[i] = tmp[i+4];

			else

				tmp[i] = tmp2[i-4];

		}
	}

	
	public void xor_k2() {

		for(int i=0;i<8;i++) {

			index = tmp2[i]^k2[i];

			tmp3[i] = index;

		}	

	}

 

	public void ip_1() {

		for(int i =0;i<4;i++) 
			tmp[i] = tmp2[i];
		

		for(int i =0;i<8;i++) {
			index=ip1[i];
			tmp3[i]=tmp[index-1];

		}

	}
	
	public void changedecimal() {
		for(int i=7; i>=0; i--) {
			tot = tot + (d*tmp3[i]);
			d = d * 2;
		}
	}


	public void tenbit() {
		String result = "";
		
		String fina2;
		
		for(int i=deci; i>0; i/=2) 
			result = String.valueOf(i%2) + result;

		int fina = Integer.parseInt(result);

		fina2 = String.format("%010d", fina);

		digits = new int[fina2.length()];

		for( int i = 0; i < fina2.length(); i++)
			digits[i] = fina2.charAt(i) - '0';
	
	}
}

언어: 자바

에디터: 이클립스

 

프로젝트 설정 : Maven, Java, War

 

Create a Resource Representation Class 

src/main/java/kwon/java/tutorial/Greeting.java

id필드는 인사에 대한 고유 식별자이며 content는 인사의 텍스트 표현이다.

package kwon.java.tutorial;

public class Greeting{

private final long id;
private final String content;

public Greeting(long id, String content){
this.id=id;
this.content=content;
}

public long getId(){
return id;
}

public String getContent(){
return content;
}
}

 

 

 

Create a Resource Controller

src/main/java/kwon/java/tutorial/GreetingController.java

HTTP 요청은 컨트롤러에 의해 다루어진다. 이러한 컴포넌트들은 @RestController 어노테이션으로 식별된다.

@GetMapping 어노테이션은 /greeting에 대한 HTTP GET 요청이 greeting() 메소드에 매핑되도록 하는 것을 보장한다.

package kwon.java.tutorial;

import java.text.Format;
import java.util.concurrent.atomic.AtomicLong;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {
private static final String template="Hello, %s!";
private final AtomicLong counter=new AtomicLong();

@GetMapping("/greeting")
// @RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue = "World")String name){
return new Greeting(counter.incrementAndGet(), String.format(template, name));
}
}

 

Test the Service

http://localhost:8080/greeting

name 쿼리에 아무것도 던지지않았을 때 디폴트 값은 World

localhost:8080/greeting

name 쿼리에 spring을 던졌을 때 content값 변경한다. 이는 GreetingController가 예상대로 작동하고 있음을 보여준다.

localhost:8080/greeting?name=spring

 

 

 

spring boot guide : RESTful 웹서비스 구축

https://spring.io/guides/gs/rest-service/

+ Recent posts