2018년 4월 15일 일요일

Css :) display

대부분의 마크업 요소에는 기본적으로 display속성을 갖고있으며, 기본값은 태그마다 다르다.

display속성 값은 2가지로 나눌 수 있다.

1. 도형이나 이미지를 삽입된 부분 (block 속성)
2. 페이지의 제목, 내용, 글자로 입력이되는 모든부분 (inline 속성)


이러한 특징을 구분지어서 Css에서 다음과 같이 약속을 했다.
 - 도형 이미지에는 display:block;
 - 페이지의 글자로 이루어진 부분엔 display:inline; 을 설정해 주어야 한다.


하지만, 대부분 글자나 도형(이미지)에 사용하는 엘리먼트들마다 기본적인 속성이 다르다.
그래서 기본적인 설정에따르므로 우리는 굳이 설정을 안해도 되지만, 어떻게 쓰이냐에 따라서 우리가 임의적으로 부여 할 수 있다.

- block
 (block의 요소 : div, p, form 등의 요소)
 한 줄에 하나의 요소만 존재하고 주변 요소들은 모두 줄 바꿈 시켜버리는 속성을 갖고 있다.


- inline
 (inline의 요소 : span, a 등의 요소)
한 줄에 여러개의 inline요소들이 줄 바꿈되지 않고도 존재할 수 있다. 이러한 특성상 margin, padding, width, height, offset(left, top, right, bottom)속성에 값을 지정할 수 없다. 


  따라서 자유로운 위치 값과 영역을 갖기 위해서는 display:block상태로 존재하여야 한다.

 엘리먼트의 div의 display 기본 설정값은 block형태이지만, "나는 글자처럼 가로로 차곡차곡 글자형태로 만들고 싶은데......", 혹은 엘리먼트 a의 display기본 설정값은 inline이지만 "나는 엘리먼트 a를 도형처럼 한줄을 전부다 차지하면서 만들고 싶은데...." 라는 생각이 들면 우리가 직접설정을 해주면 된다.

 [예제 : 엘리먼트 div의 display의 속성 값을 block에서 inline으로 부여]

HTML


CSS


  [ 실행결과 ]














 그러면 이제, block과 inline의 특징을 한번 알아보자.

 기본적으로 block은 도형 혹은 이미지를 활용할때의 설정 값으로 사용이 되어있다고 했다.
그래서 width(가로길이), height(세로길이)에 값을 부여할 수 있다.
왜냐? 도형을 사용하는데 길이/높이 설정을 해주어야하지 않는가?
그래서 기본값을 설정이되어있다는 것이다. 그리고 줄바꿈의 기능이 있다. 다르게 말하면, 한줄을 자신의 공간으로 사용한다는 의미이다.

 예를들어 div 태그를 2개 소환했다고 해보자,
div의 공간이 2개 필요할것이다.  하나의 div태그당 가로의 길이가 하나의 div태그의 전체 가로 공간이 되는것이다. 그래서 그 옆자리 공간은 div태그의 공간이므로, 형제들은 줄바꿈 기능을 해서 그밑에 쌓이게된다. 이렇듯 사용하지 않는 공간이여도 형제들의 공간은 임의로 설정해주지 않는 이상 침범하지 않는다.


 하지만, display의 inline값은 글자형식을 사용할때 부여하는 속성이므로, width와 height의 설정이 필요없지않는가?
 그래서 display:inline에는 width와 height를 사용할 수 없다.

   정리를 해보면,
 - display:inline : 줄바꿈 기능이 없으며, width와 height의 설정을 제한한다.
 - display:block : 줄바꿈 기능이 있으며, width와 height의 설정이 자유롭다.

 하지만 이게끝이 아니다.
특이하게도 inline과 block형태를 특징을 갖고있는 녀석이 있다.
바로 inline-block의 속성 값이 있다.

 - display:inline-block
1) inline의 특징: 줄바꿈 기능이 있다.
2) block의 특징: width와 height의 설정을 부여할 수 있으며(block기능)

 그럼, 어떨 때 사용하는가?

 웹 페이지의 제목이나 코드상에서 엘리먼트 a의 디자인을 설정 할 때(해당 목록들의 크기 설정이나 이미지 설정 시)즉, 텍스트들이 들어간 주변의 디자인의 크기 조정시에 width와 height의 값을 부여하려고 inline속성에 block속성을 첨부한거라고 생각하면된다.

 그래서 inline의 줄바꿈기능에 block의 width / height의 설정 또한 가능한 것이다.


2018년 4월 14일 토요일

단일치환 암호방식과 다중치환 암호방식

우리가 이전글에서 시저암호와 비제네르 암호에 대해서 알아보았다.

이 둘은 고전암호이며, 암호학에서 다음과 같이 중요한 특징 2가지들을 갖고있다. 

 1. 단일치환 암호방식(시저암호)
알파벳에서 숫자(키 값)을 이용해서 다른 알파벳이 되도록 치환시키는 방법이다.

 ex) 단일치환 방식
1) 알파벳 "A는 처음시작이므로 0"이라는 숫자로 정의하고 "Z는 알파벳의 끝 25"라고 생각하자('A' ~ 'Z' → 0 ~ 25)

2) 원하는 Key값 만큼 치환시킨다.(key값은 숫자) 알파벳 26개를 0~25로 생각하고 만약 key값이 25를 넘어가면 다시 0으로 생각한다.

  [단일치환 암호화] 
  - key 값 : 4

















 2 다중치환 암호방식(비제네르 암호)
평문에서 하나의 알파벳은 여러 알파벳으로 나타낼 수 있다.
단일치환 방식에서 알파벳의 빈도정보를 파악해서 어느정도 유추할수있는 약점이 있었는데, 이 빈도정보를 무력화시키는 방법인 '다중치환 방식' 등장하게 된다.
(같은 알파벳이더라도 다른알파벳으로 치환이 될 수 있으므로) 

  [다중치환 암호화, 복호화] 
  - key 값 : dog / 평문 MidNighT

















 3. 단일 / 다중 치환 암호방식의 약점

1) 단일치환 암호방식 약점 
단일치환 암호방식은알파벳의 수는 26개로 한정이 되어있다는 점이다. 
키 값이 알파벳 갯수에 한정이 되어 있으므로 문장을 보호하는데 있어서, 큰 방패가 되어주지는 못한다.(빈 틈이 많이보인다.)

- 평행이동
 문자를 하나씩 평행이동(+n)을 통해서 인해 키 값을 찾아낼 수 있다.
여기서 key값을 1부터 25까지 평행이동을 하게되면, 우리는 암호문으로부터 평문을 찾을 수 있다. 

- 빈도분석법
 수집한 문자들에서 분표현황을 파악하는 방법.

 우리가 문서의 내용을 분석할때, 어느 단어들이 많이쓰였고, 자주쓰이는 알파벳이 무엇이 였는지, 특정 단어들의 사용횟수 등의 여부를 파악해보는 방법이다.
 쉽게 말해서, "내가 이문장에서 얻고싶은게 무엇인지"에 초점을 두고 데이터들을 보고 분석하는 것이다.


2) 비제네르 암호의 약점
 다중치환의 형태로 키 값이 한 단어가 되어 평문에서 하나의 알파벳이 같은 알파벳으로 고정적으로 치환시키는 방법이 아니라, 하나의 알파벳이 다른 알파벳으로도 치환되는 특징을 갖고있다.(유동적이다) 
"이러한 방식의 암호문에 약점이 존재할까?" 의문을 품을 수 도 있는데, 다음은 방법으로 해독이 가능하다.

 2-1) 카지스키 분석법
카지스키 분석법의 핵심은 특정 문자열의 반복적인 등장이다.

 - 비제네르 암호는 다음과 같은 방법으로 분석이 가능하다.
 암호화 된 문서에서 특정 문자열이 자주 등장하면, 키의 길이를 어느정도는 유추할 수 있다. 2개의 특정 문자열이 등장했을때, 이 2개의 구간사이는 키 길이의 배수가 된다. 그리고 이를 다르게 말하면, 키의 길이는 이 구간의 약수이다. 조금 이해하기 어렵지만 다시 정리해보자

 - 특정 문자열 2개 등장할때,
우리는 key 길이는 특정 문자열 2개의 구간(특정 문자열이 떨어져있는 거리)의 약수이다.
그리고 이 구간은 key 길이의 배수가 된다.

[다중치환 암호방식의 약점 예시 - 1]

 Key: dog

 평문: My dog is cool I like dogs better than cats. Dogs do not have hair so dog is good

평문
M
y
d
o
g
i
s
c
o
o
l
i
l
i
k
e
d
o
g
s
b
e
t
t
e
r
t
h
a
n
c
a
t
s
d
o
g
s
d
o
n
o
t
h
a
v
e
h
a
i
r
s
o
d
o
g
i
s
Key
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
o
g
d
암호문
p
m
j
r
u
o
v
q
u
o
z
r
o
w
q
h
r
u
j
g
h
h
h
z
h
f
z
k
o
t
f
o
z
v
r
u
j
g
j
r
b
u
w
v
g
y
s
n
d
w
x
v
c
j
r
u
o
v
 : 2개의 특정 문자열 "ruj"의 등장 " 평문 : dog → 암호문 : ruj "

이때, 우리는 2가지를 알 수 있다. (이 단어는 같은단어로 의심할 수 있다.)
"ruj"가 존재하는 두 구간은 키의 배수이며, 키의 길이는 이 구간의 약수이다. 이 외에도 비슷한 단어를 가진것들이 존재한다. "평문 is → 암호문 ov", "평문의 do → 암호문 jr" 
 하지만, 이 두개의 문자열로 이루어진 것들은 단지 우연히 이루어진 것이라고 생각할 수 도있고, 알파벳 2개의 문자열로 이루어진 단어로는 두개의 단어가 서로 같을 확률이 낮다.
이로써, 암호문에서 3개 이상의 알파벳으로 이루어진 문자열의 등장은 
"아! 평문에서 똑같은 단어가 2번 사용이된거구나!" 라고 이해할 수 있다.


[다중치환 암호방식의 약점 예시 - 2]
 실제 key길이 : 3(dog)














: 그림을 잘 생각해보면, "ruj"에 사용된 key 값은 "ogd" 로 두개가 겹친다.(즉 같은키값의 사용)
그러면 똑같은 key로 2번 암호화 되었다는 의미이다. 즉, 첫번째 등장한 ruj와 뒤에 등장한 ruj의 구간에서 "key가 최소 2번은 사용되었구나!"라고 생각 할 수  있다.
 다르게 말하면, "key의 길이는 15이하라는것을 판정지을 수 있다!" 라고 분석이 된 것이다.

 그래서 우리는 암호문의 내용이 길다면, 알파벳 3개의 이상으로 이루어진 특정 문자열(특정 단어)로 키의 길이를 어느정도 예측할 수 있다.
 "왜 2개의 알파벳으로 이루어진 특정 문자열은 안되나요?"라고 생각할 수 있는데, 물론 이 특정 문자열도 중요한 핵심이되는데, 하지만 암호화 도중 우연히 생긴 문자열인 가능성이 더 높기 때문이다.
따라서 암호문에 특정 문자열이 많으면 많을수록 그리고 평문에서의 반복적인 단어의 사용이 많다면(예 : The) 우리는 key길이를 예측할 수 있게되는 것이다.



2-2) 프리드만 암호공격
암호문에서 특정 문자열이 2개 쓰였을 경우, 두 개의 문자열이 서로 같을 확률이다.('일치지수' 라고 함)

 ■ 단일 치환 방식
특정 알파벳이 암호문에서 다른 알파벳으로 대응되는 알파벳의 일치 지수는 같다.(즉, 키 값이 고정적이다)

 ■ 다중 치환 방식 
특정 문자열이 암호문에서 다른 문자열로 대응되는 일치 지수가 감소하게 된다. 
왜냐? 하나의 알파벳당 키 값인 문자열에 하나씩 대응되면서 암/복호화 되는 방식이므로)

 프리드만의 암호공격에는 암호화된 문서의 전체내용에서 "알파벳 사용빈도", "자주 등장하는  특정 문자열(3개이상)", "수학적인 공식(암호문에서의 특정 문자열, 알파벳의 사용빈도 등 계산하는 공식)"의 사용으로 key의 길이를 예측하는 것도 가능하다. 


 마무리로내용들을 정리해보면,

 첫째, 암호문의 내용이 길수록 해독할 가능성이 높아진다.

 둘째, 암호문에서 "하나의 알파벳이 반복되는 것"보단 "하나의 특정한 문자열의 반복을 찾는게 핵심"이다. 

 마지막으로, 강력한 보안방식은 존재하지만, 완벽한 보안방식은 존재하지 않는다.
   (강력한 보안방식도 몇년 혹은 몇십년에 걸려서 뚫리게 되어있다.)

2018년 4월 10일 화요일

대칭키 암호와 비대칭키(공개키) 암호

 암호학에서는 암호화 방식을 크게 2가지로 구분짓는다.

1) 암호화와 복호화시 키 값이 똑같은 대칭키 암호화 방식
2) 암호화와 복호화시 키 값이 다른 비대칭키 암호화 방식(공개키 암호화라고도 불린다.)

1. 대칭키 암호 알고리즘
 송신자와 수신자간의 메시지(평문)을 암호화 / 복호화 시 키 값이 똑같은 경우이다.
키 값이 똑같다는 건, 송신자와 수신자간의 키 값을 서로 공유하고 있어야 하며, 이외에 타인으로 부터 노출되지 않도록 비밀로 관리해야 한다. 대칭키 암호알고리즘은 고대 암호학에서도 사용하여 오랜 역사를 가지고있다. 대표적으로 고대 로마에서 시저라는 장군이 사용했던 시저암호(치환 암호방식 중 하나임)가 있다.

1-1) 대칭키 암호알고리즘의 문제점
- 키를 어떻게 공유할것인가...(송신자와 수신자만이 알고있어야 하므로) 
- 키를 타인에게 노출될 경우, 보안에 매우 취약해진다...(암호화 복호화 키가 같으므로 제 3자가 송신자 -> 수신자 전달하는 메시지를 갈취 했을경우, 키값으로 암/복호화가 가능하므로)

1-2) 대칭키 암호알고리즘의 장점
 이러한 키 전달 및 관리에 대해 어려운 점이 있으나, 그에따른 장점도 충분하다.
- 암호화 연산속도가 빨라서 효율적으로 암호시스템을 구축할수 있다.
- 고전 암호학에서도 많이 사용한 방식인 간단한 치환과 전치의 조합으로 되어있어서 쉽게 개발이 용이하며 시스템에서도 빠르게 동작한다.

1-3) 대칭키 암호 알고리즘 암호화 / 복호화 방식
1)수신자<->송신자 키 값을 이전에 공유하고있어야함.

2) 수신자->송신자 메시지 암호화 한 뒤 전달
(엘리스) -> (찰스)

3) 복호화하여 메시지 읽고 다시 암호화해서 메시지 전달.
(찰스) -> (엘리스)


2. 공개키 암호 알고리즘
 공개키 암호 알고리즘은 '비대칭 암호 알고리즘'이라고도 부른다. 말 그대로 암호화와 복호화시 사용하는 키 가 비대칭이다. 즉, 키가 다르다. 그래서 대칭키 암호 알고리즘과는 다르게, 키 값이 타인, 제 3자에게 노출이 되어도 암호화, 복호화시 키가 다르므로 해석이 불가능하다. 송신자는 수신자의 공개키로 메시지(평문)을 암호화 해서 전송하면, 수신자는 이 암호화된 문서를 자신의 개인키로 복호화하여 해석이 가능하다. 이 과정에서 제 3자, 타인으로부터 메세지나 키를 유출시켜도 수신자가 갖고 있는 개인키로만 해석이 가능하므로, 해석이 불가능하다.

2-1) 비대칭키 암호 알고리즘의 문제점
 - 암호화 / 복호화 시간
 : 대칭키 암호 알고리즘에 비해 공개키, 개인키로 2n개의 키의 사용과 복잡한 암/복호화 방식으로 인하여 시간이 많이 걸린다.(통신속도가 느림)
 - 수신자의 개인키 관리
 : 만약, 공격자(C)가 자신이 송신자(A)인것처럼 수신자(B)에게 자신(공격자, C)의 공개키로 암호화해서 평문을 보내면, 수신자(B)는 송신자(A)에게 전달받은 메시지인 줄 알고 전달받은 공개키(공격자, C의 공개키)로 메시지 내용을 암호화 해서 전달하면, 공격자(C)의 개인키로 복호화 해서 보안의 문제점이 발생할 수 도 있다.(이를 방지하고자 인증서 or 인증기관을 이용함)

2-2) 비대칭키 암호 알고리즘의 장점
 - 보안성이 강하다.
 대칭키 암호 알고리즘과는 다르게 키가 2개이상을 사용한다.
송신자는 자신의 공개키(이건 유출되도 큰 문제가 되지 않음)와 암호화된 메시지를 전달하면, 수신자는 메시지를 받고 송신자의 공개키로 복호화 한 뒤, 송신자의 공개키로 메시지를 암호화해서 보낸다. 여기서 제3자에게 공개키, 암호화된 메시지를 유출당해도 송신자의 개인키가 필요하므로, 해석이 불가능하다.(개인키는 송신자만 알고 있다.)

2-3) 공개키 암호화 방식
1) 송신자는 인증기관으로부터 공개키, 개인키를 받는다.

2) (송신자)자신의 공개키로 암호화하여 수신자에게 메시지를 전달.

3) 수신자는 인증기관으로부터 받은 송신자의 공개키로 메시지를 복호화하여 해석한다. 여기서 해독이 될경우, 타인이 아닌, 정확한 송신자로부터 받았다는 것을 식별가능. 

4) 수신자는 자신의 메시지를 송신자의 공개키로 암호화하여 전달.

5) 송신자-엘리스는 수신자로부터 받은 메시지를 자신의 개인키로 해독.

[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...