본문 바로가기

   
Programming/Java

5일차!

반응형
■용어 및 프로그램 기본 이론 정리
https
웹브라우저와 서버와 통신할때 모든 내용을 암호화 하기 위한 기술
중간에 통신 패키지를 가로챈다면 아이디와 비번을 알수 있음
서버쪽에서 ssl이라는 기능이 활성화 되어 있어야 https 통신이 가능하다.
암호화 방식 : 대칭키 방식, 비대칭키 방식
비대칭키 방식 : 공인인증서가 비대칭키 암호화방식(공개키, 개인키)

1. 인증서 발급 -> 개인키 존재 -> 공개키(인증서 업체,  ex)신한은행)

암호화 사용했던 키와 암호화를 풀때 키가 다르다 -> 개인키로 암호화한뒤 전송
각각의 브라우져마다 개인키 공개키가 있다. - 서버가 자기의 공개키를 배포해놓고 개인키는 개인이 가지고 있고 메시지를 내려보낼때
암호화를 위해 사용했던 키를 개인키로 풀고
일반 http = https 속도차이가 천배이상 난다.

md5
MD5(Message-Digest algorithm 5)는 128비트 암호화 해시 함수이다. RFC 1321로 지정되어 있으며, 주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용된다. 1991년에 로널드 라이베스트가 예전에 쓰이던 MD4를 대체하기 위해 고안했다.

1996년에 MD5의 설계상 결함이 발견되었다. 이것은 매우 치명적인 결함은 아니었지만, 암호학자들은 해시 용도로 SHA-1와 같이 다른 안전한 알고리즘을 사용할 것을 권장하기 시작했다. 2004년에는 더욱 심한 암호화 결함[1]이 발견되었고. 2006년에는 노트북 컴퓨터 한 대의 계산 능력으로 1분 내에 해시 충돌을 찾을 정도로 빠른 알고리즘이 발표[2]되기도 하였다. 현재는 MD5 알고리즘을 보안 관련 용도로 쓰는 것은 권장하지 않으며, 심각한 보안 문제를 야기할 수도 있다. 2008년 12월에는 MD5의 결함을 이용해 SSL 인증서를 변조하는 것이 가능하다는 것이 발표되었다[1].


sha(Secure Hash Algorithm)
1993년부터 미국 NSA가 제작하고 미국 국립표준기술연구소(NIST)에서 표준으로 제작한 해쉬 암호 알고리즘이다. 1993년 SHA-0을 시작으로, 현재 최신 버전은 2001년 방식이 나온 SHA-2을 사용중이고, 2012년 10월에 SHA-3이 정식 발표되었다. #

현재 사용중인 SHA-2는 SHA-1을 대체하는 해쉬암호로, SHA-224, SHA-256, SHA-384, SHA-512등의 종류가 있다. 2005년도엔 SHA-1에 보안 구멍이 생겼으며, 2008년 결국 해쉬 충돌이 발생해[2] 현재 많이 쓰이는 해쉬암호 기술이다. 그러나, 일단 기본은 SHA-1과 큰 차이가 없다(...) 현재는 SHA-1과 2와 생판다른 알고리즘인 SHA-3을 개발중이며[3], 2012년 10월 2일자로 Keccak이 SHA-3로 확정되었다. #

대한민국 인터넷뱅킹은 SHA-256을 사용하고 있으며[4], 비트토런트는 파일을 BASE32로 바꾼 SHA-1을 해쉬로 사용한다. 비트코인은 작업 증명에 SHA-256을 사용한다.

SHA는 파일 값이 약간만 바뀌어도 값이 천차 만별로 바뀔수 있다. 보통 이를 가리켜 눈사태 효과라 부른다.



base64

컴퓨터 분야에서 쓰이는 Base 64 (베이스 육십사)란 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념이다.

원래 Base 64를 글자 그대로 번역하여 보면 64진법이란 뜻이다. 특별히 64진법이 컴퓨터에서 흥미로운 것은, 64가 2의 제곱수(64 = 26)이며, 2의 제곱수들에 기반한 진법들 중에서 화면에 표시되는 ASCII 문자들을 써서 표현할 수 있는 가장 큰 진법이기 때문이다. 즉, 다음 제곱수인 128진법에는 128개의 기호가 필요한데 화면에 표시되는 ASCII 문자들은 128개가 되지 않는다.

그런 까닭에 이 인코딩은 전자 메일을 통한 이진 데이터 전송 등에 많이 쓰이고 있다. Base 64에는 어떤 문자와 기호를 쓰느냐에 따라 여러 변종이 있지만, 잘 알려진 것은 모두 처음 62개는 알파벳 A-Z, a-z와 0-9 를 사용하고 있으며 마지막 두 개를 어떤 기호를 쓰느냐의 차이만 있다.






■실습
package exam;
import java.util.Scanner;

public class MethoDemo {
//    1. MethodDemo9를 만드세요
//    (static으로 만들고 밑에서 main)
//          - 정수 두개를 전달받아서 순서를 바꿔 출력하는 기능(스왑)
//          - 숫자가 5개 들어있는 배열을 전달받아서 가장 큰 수를 출력하는 기능
       public static void Swap( int n, int m){
             int temp = 0;
            temp = n;
            n = m;
            m = temp;
            System.out.println( "첫수" + n + "두번째" + m);
      }
     
//    2. Calculator를 곱셉 출력기능, 나눗셈 출력기능을 추가하세요
//          - 두수를 입력받아서 곱셈 결과를 출력합니다.
//          - 두수를 입력받아서 나눗셈 결과를 출력합니다.
       public static void Calculator( int n, double m){
            System.out.print( "곱셈 결과" + (n * m));
            System.out.print( "나눗셈 결과" + (n / m));           
      }    
     
// 3. 숫자를 하나 전달받아서 두배 큰 값을 반환하는 메소드
       public static int   DoubleNum( int n){
             int result = n*2;
             return result;
      }
     
// 4. 숫자를 하나 전달받아서 그 숫자크기만큼의 * 가로방향을 출력하는 메소드
       public static void NumStars( int n){
            System.out.println();
            System.out.println();        
             for ( int i=0; i<n; i++){
                  System.out.print( "*" );
            }
      }
     
// 5. 숫자를 두개 전달받아서 첫번째 숫자만큼 가로로, 두번째 숫자만큼 세로로 *를 출력하는 메소드
       public static void SuperStarts( int n, int m){
            System.out.println();
            System.out.println();
             for ( int i = 0; i<n; i++){
                  System.out.print( "*" );
            }
           
             for ( int i =0; i<=m; i++){
                  System.out.println( "*" );     
            }
            System.out.println();
            System.out.println();
           
      }
     
// 6. 숫자를 하나 전달받아서 그 숫자만큼의 크기를 가지는 정수를 담는 배열을 만들고, 배열안에서 1부터 차례대로 채워 넣으세요
       public static void ArrayNum( int n){

             int [] array = new int[n];
           
             for ( int i=0; i< array.length; i++){
                  array[i] = i+1;
                  System.out.print(array[i]);              
            }
           
      }




// 7. 숫자 하나를 전달받아서 그 숫자의 약수를 모두 출력하세요
       //어떤 수를 나누어 떨어지게 하는 수.

     
// 8. 숫자 두개를 전달받아서 첫번째 숫자의 크기만큼 배열을 생성하고 두번째 숫자로 채워서 반환하세요
     
// 9. 임의의 숫자로 채워진 배열을 전달받아서 그 배열안의 모든 값의 두배만큼의 값을 가진 배열을 만들어서 반환하세요
// 10. 임의의 숫자로 채워진 배열을 전달받아서 배열안의 숫자를 오름차순으로 정렬하세요

     
       public static void main(String[] args){        
            Swap(3, 4);

             int num1, double_num;
             double num2;
           
            Scanner sc = new Scanner(System.in);
           
            System.out.print( "연산 숫자 입력 : " );
            num1 = sc.nextInt();
           
            System.out.print( "두번재 숫자 입력 : " );
            num2 = sc.nextInt();
           
            Calculator(num1, num2);
           
            double_num = DoubleNum(4);
            System.out.println( "\n더블 숫자" + double_num);
           
            NumStars(7);
           
            SuperStarts(7,4);
           
            ArrayNum(7);
      }
     
}







package oop2;

public class StudentScore {

      String name ;
       int lnum;
       int methnum;
       int elnum;
       int total;
       double avg;
     
       public void CalculationTotal (){
             //총점
            total = lnum+methnum+elnum;        
            System.out.println( "총점 : " + total);
           
      }
     
       public void CalculationAvg (){
             //평균
            avg = (lnum+methnum+elnum)/3;
            System.out.println( "평균 : " + avg);
      }
     
       public void CalculationDisplayCount (){
             //전체 점수
            System.out.println( "국어 : " + lnum);
            System.out.println( "수학 : " + methnum);
            System.out.println( "영어 : " + elnum);
            System.out.println();        
      }    
     
}






package oop2;

public class MainStudent {
       public static void main(String[] args){
             /**
             * 총점 평균 전체 점수를 구하는 메소드를 만들어서 출력
             */
            StudentScore a = new StudentScore();
            a.name = "김종현" ;
            a.lnum = 75;
            a.methnum = 74;
            a.elnum = 32;
           
            a.CalculationDisplayCount();
            a.CalculationTotal();
            a.CalculationAvg();
           
           
            StudentScore b = new StudentScore();
            b.name = "이말년" ;
            b.lnum = 98;
            b.methnum = 79;
            b.elnum = 87;
           
            b.CalculationDisplayCount();
            b.CalculationTotal();
            b.CalculationAvg();
           
      }
     
}




package oop2;

public class Person {  
       //객체라는것은 속성과 기능이 같이 있다. 속성은 변수로 메소드는 기능을 만든다.
       //인스턴스 메소드 -> 객체를 생성해야 기능을 쓸수 있다.
       //인스턴스 변수 -> 객체를 만들어야만 값을 담을수 있기 때문에 인스턴스 변수라고 한다.
       //어떠한 정보를 담을때 가장 유용한것이 클래스 이다.
       //해당 변수안에 선언한 변수는 모두 사용가능
       //class를 선언한다는것은 안에 변수값들의 변경이 필요할때 class를 만든다.
      String name;
       int age;
       char gender;
      String phone;
      String email;
     
       public void DisplayInformation(){        
            System.out.println( "--------프로필 정보--------" );
            System.out.println( "이름 : " + name);
            System.out.println( "나이 : " + age);
            System.out.println( "성별 : " + gender);
            System.out.println( "핸드폰 : " + phone);
            System.out.println( "이메일 : " + email);
            System.out.println( "--------프로필 정보--------" );
            System.out.println();
      }
     
}





package oop2;

public class PersonDemo {
       public static void main(String[] args){
           
            Person a = new Person();
            a.name = "김종현" ;
            a.age = 32;
            a.gender = '남' ;
            a.phone = "010-2222-3333" ;
            a.email = "zzarungna@naver.com" ;
            a.DisplayInformation();
           
            Person b = new Person();           
            b.name = "춘향이" ;           
            b.age = 38;
            b.gender = '여' ;
            b.phone = "010-1234-5678" ;
            b.email = "춘향장@naver.com" ;
            b.DisplayInformation();
           
      }
           
}




package oop2;

public class PersonDemo2 {

       public static void main(String[] args){
            Person p1 = new Person();
            p1.name = "홍길동" ;
            p1.age = 23;
            p1.gender = '남' ;
            p1.email = "zzarungna@naver.com" ;
            p1.phone = "010-1111-2222" ;
           
            Person p2 = new Person();
            p2.name = "홍길동" ;
            p2.age = 23;
            p2.gender = '남' ;
            p2.email = "zzarungna@naver.com" ;
            p2.phone = "010-1111-2222" ;

            Person[] p = new Person[2];
            p[0] = p1;
            p[1] = p2;
           
            p[0].DisplayInformation();
            System.out.println(p[0].name);
            System.out.println(java.util.Arrays.toString(p));
      }
     
}





package oop3;

public class Rectangle {
       //속성 : 너비, 높이 값이 셋팅되야 기능을 만들수 있다.
       //메소드는 기본 값이 없다. 클래스에만 변수를 선언하면 기본값이 부여된다.
       //지역 변수는 사용할시에 반드시 초기화 해주어야 한다.
       int width;
       int height;

       //렉탱글이라는 클래스 안에는 사실 숨겨진 메소드가 있다. 그래서 클래스 이름뒤에 () 표시가 붙는것이다.
       //public Rectangle(){   } 이라는 생성자 메소드가 있다.
       //생성자 메소드는 항상 클래스 이름하고 같고 void조차 없다.
       //객체가 생성되자마자 실행되는 메소드
       //생성할 객체의 이름을 알려주고 객체를 생성하고 객체가 생성되자마자 일을 할수 있다.
       //객체가 생성되자마자 실행하고 싶은 기능이 있다면 생성자를 만들면 된다.
       public Rectangle(){    
            width = 40;
            height = 100;
      }
     
       public Rectangle( int w, int h){
            width = w;
            height = h;
      }

       //기능 : 면적 계산하기, 테두리길이 계산하기
       public void area(){
             int value = width * height;
            System.out.println( "면적은 : " +  value + " 입니다." );
      }
     
       public void round(){
             int value = width + height;
           
      }
     
}







package oop3;

public class RectangleDemo {
     
       public static void main(String[] args){
           
             // 1단계 : 객체 생성
             // 2단계 : 값(속성)을 설정
             // 3단계 : 기능 사용하기

            Rectangle r = new Rectangle();
            r.area();
      }
     
}




package oop3;

public class RectangleDemo2 {

       public static void main(String[] args){
             //1. 객체 생성
             //생성자의 일반 메소드와 차이점
           
            Rectangle a = new Rectangle(); //public Rectangle 생성자 호출
            Rectangle r = new Rectangle(20,40); //Rectangle (int w, int h) 생성자 호출
             //선언순간 생성자를 호출하여 변수할당
             //Rectangle 클래스를 알아서 객체생성해라. 객체 생성되면 Rectangle를 실행해라
             //Rectangle(int, int) 생성자를 실행하라
             //생성자를 사용하지 않는다면
             //r.width = 100;
             //r.height = 15;
             //를셋팅해줘야 한다.
             //생성자를 정의한게 아무것도 없다면 java jvm 에서 자동으로 생성해준다. 하나라도 정의된생성자가 있다면 정의된 생성자만 실행됨
           
             //2. 기능 사용하기
            r.area();
      }
}





package oop3;

public class Product {
       /*
속성 : 상품번호, 상품명, 가격, 할인율

기본생성자를 정의하세요

기본생성자에는 아무일도안합니다.

매개변수가 있는 생성자를 정의하세요

상품번호, 상품명, 가격 할인율을 전달 받아서 속성에 해당하는 변수에 저장하세요

기능 : 상품의 할인가를 표시하는 기능을 추가하세요.

할인가 = 가격 -(가격 * 할인율)

상품의 정보를 표시하는 기능을 추가하세요
*/
       int code;
      String pname;
       int price;
       double sail;
       double discount;
     
       public Product(){
           
      }
     
       public Product( int cd, String nm, int pc, double sa){
            code = cd;
            pname = nm;
            price = pc;
            sail = sa;
      }
     
       public void Discounts(){
            discount = price-(price*sail);
            System.out.println( "할인가격 : " + discount);
      }
     
       public void ProductInfor(){
            System.out.println( "------------------상품정보" );
            System.out.println( "상품코드 : " + code);      
            System.out.println( "상품이름 : " + pname);
            System.out.println( "상품가격 : " + price);
            System.out.println( "상품세일 : " + (sail*100) + "%" );
            System.out.println( "할인가격 : " + discount);        
            System.out.println( "------------------상품정보" );          
      }
     
}




package oop3;

public class MainProduct {
     
       public static void main(String[] args){
            Product p = new Product(007745714, "플스4" , 420000, 0.20);
            p.Discounts();
            p.ProductInfor();
      }
     
}








package oop4;

public class Car {
      String name;
      String maker;
       int price;
     
       public Car() {}
     
       public Car(String nm, String ct, int pr){
            name = nm;
            maker = ct;
            price = pr;
      }
     
       public void displayCar(){
            System.out.println( "고객이 가지고 있는 차량정보는" );       
            System.out.println( "차량이름 : " + name);
            System.out.println( "제 조  사 : " + maker);
            System.out.println( "가      격 : " + price);
      }
     
     
}




package oop4;

public class Customer {

      String name; //고객 이름
      String phone; //고객 핸드폰번호
      Car myCar; //Car 객체
     
       public Customer() { }
     
       public Customer(String nm, String ph, Car mc){
            name = nm;
            phone = ph;
            myCar = mc;
      }
     
       public void displayClient(){
            System.out.println( "고객 기본정보------" );
            System.out.println( "이름" + name);
            System.out.println( "핸드폰" + phone);
            System.out.println();
      }
     
}




package oop4;

public class CustomerDemo {

       public static void main(String[] args){
            Car car = new Car( "벤츠" "bmw" ,80000000);
            Car car2 = new Car( "아우디" "bmw" ,80000000);
           
            Customer c = new Customer();
            c.name = "홍길동" ;
            c.phone = "010-1234-5678" ;
            c.myCar = car;

            c.displayClient();
            c.myCar.displayCar();
      }
     
}








package oop3;

public class Product {
       /*
속성 : 상품번호, 상품명, 가격, 할인율

기본생성자를 정의하세요

기본생성자에는 아무일도안합니다.

매개변수가 있는 생성자를 정의하세요

상품번호, 상품명, 가격 할인율을 전달 받아서 속성에 해당하는 변수에 저장하세요

기능 : 상품의 할인가를 표시하는 기능을 추가하세요.

할인가 = 가격 -(가격 * 할인율)

상품의 정보를 표시하는 기능을 추가하세요
*/
       int code;
      String pname;
       int price;
       double sail;
       double discount;
     
       public Product(){
           
      }
     
       public Product( int cd, String nm, int pc, double sa){
            code = cd;
            pname = nm;
            price = pc;
            sail = sa;
      }
     
       public void Discounts(){
            discount = price-(price*sail);
            System.out.println( "할인가격 : " + discount);
      }
     
       public void ProductInfor(){
            System.out.println( "------------------상품정보" );
            System.out.println( "상품코드 : " + code);      
            System.out.println( "상품이름 : " + pname);
            System.out.println( "상품가격 : " + price);
            System.out.println( "상품세일 : " + (sail*100) + "%" );
            System.out.println( "할인가격 : " + discount);        
            System.out.println( "------------------상품정보" );          
      }
     
}



package oop3;


public class Cart {

      String owner;
      Product[] items = new Product[2];
     
       public void displayItems(){
             int totalprice = 0;
            String list = null ;
            System.out.println( "--- 장바구니 정보---" );
            System.out.println( "고객명 : " + owner);
             for (Product p : items) {
                  totalprice += p.price;
                  list += p.pname;
            }
           
            System.out.println( "총구매금액 : " + totalprice);
            System.out.println( "물품 리스트 : " + list);
           
      }
     
}


반응형