2016년 7월 1일 금요일

블록 암호 운용 방식

초기화 벡터

초기화 벡터(initialization vector, IV)는 첫 블록을 암호화할 때 사용되는 값을 의미한다.
운용 방식마다 초기화 벡터를 사용하는 방법이 다르며 초기화 벡터에서 요구되는 성질도 조금씩 다를 수 있지만, 같은 초기화 벡터가 반복되어 사용되어서는 안 된다는 성질을 공통적으로 가진다. 이것은 초기화 벡터가 같은 경우 비슷한 두 개의 평문을 암호화했을 때 앞부분의 블록들이 서로 같게 되는 등 보안 문제가 발생하기 때문이다.
CTR 등의 일부 운용 방식에서는 초기화 벡터라는 용어 대신 nonce(number used once)라는 용어를 사용한다. 이 표현은 보통 초기화 벡터가 매번 달라야 하는 것 외에 별다른 요구 조건이 없을 경우 사용한다.


전자 코드북 (ECB)

전자 코드북(electronic codebook, ECB)은 운용 방식 중 가장 간단한 구조를 가지며, 암호화하려는 메시지를 여러 블록으로 나누어 각각 암호화하는 방식으로 되어 있다.

전자 코드북은 모든 블록이 같은 암호화 키를 사용하기 때문에 보안에 취약하다. 만약 암호화 메시지를 여러 부분으로 나누었을 때 두 블록이 같은 값을 가진다면, 암호화한 결과 역시 같다. 이것은 공격자가 비슷한 메시지를 반복적으로 암호화하는 반복공격에도 취약한 성질을 가진다.


암호 블록 체인 방식 (CBC)

암호 블록 체인 (cipher-block chaining, CBC) 방식은 1976년 IBM에 의해 개발되었다.[4] 각 블록은 암호화되기 전에 이전 블록의 암호화 결과와 XOR되며, 첫 블록의 경우에는 초기화 벡터가 사용된다. 초기화 벡터가 같은 경우 출력 결과가 항상 같기 때문에, 매 암호화마다 다른 초기화 벡터를 사용해야 한다.

CBC 방식은 현재 널리 사용되는 운용 방식 중 하나이다. CBC는 암호화 입력 값이 이전 결과에 의존하기 때문에 병렬화가 불가능하지만, 복호화의 경우 각 블록을 복호화한 다음 이전 암호화 블록과 XOR하여 복구할 수 있기 때문에 병렬화가 가능하다.


증식적 암호 블록 체인 방식 (PCBC)



암호 피드백 (CFB)

암호 피드백(cipher feedback, CFB) 방식은 CBC의 변형으로, 블록 암호를 자기 동기 스트림 암호로 변환한다. CFB의 동작 방식은 CBC와 비슷하며, 특히 CFB 암호 해제 방식은 CBC 암호화의 역순과 거의 비슷하다.


출력 피드백 (OFB)

출력 피드백(output feedback, OFB)은 블록 암호를 동기식 스트림 암호로 변환한다.
XOR 명령의 대칭 때문에 암호화와 암호 해제 방식은 완전히 동일하다.


카운터 (CTR)

카운터(Counter, CTR) 방식은 블록 암호를 스트림 암호로 바꾸는 구조를 가진다. 카운터 방식에서는 각 블록마다 현재 블록이 몇 번째인지 값을 얻어, 그 숫자와 nonce를 결합하여 블록 암호의 입력으로 사용한다. 그렇게 각 블록 암호에서 연속적인 난수를 얻은 다음 암호화하려는 문자열과 XOR한다.
카운터 모드는 각 블록의 암호화 및 복호화가 이전 블록에 의존하지 않으며, 따라서 병렬적으로 동작하는 것이 가능하다. 혹은 암호화된 문자열에서 원하는 부분만 복호화하는 것도 가능하다.



2016년 6월 12일 일요일

Error converting bytecode to dex


안드로이드 스튜디오에 자바 라이브러리 모듈을 추가했는데, 시스템에 설치된 JDK는 8인데 반해서, 안드로이드 컴파일시에 요구되는 자바 버전은 7이다.

그저 아무 생각없이 시스템에 JDK 7을 설치해 버릴까 하다가,
오류 메시지를 한 번 더 자세히 읽어 보니,
자바 라이브러리 모듈의 build.gradle 파일에 다음 두 줄을 추가해 주라고 한다.

apply plugin: 'java'
targetCompatibility = '1.7'
sourceCompatibility = '1.7'