etc

[dart] 암호화

paulaner80 2020. 11. 30. 22:50
반응형




3DES(TripleDES)는 DES를 3번 연속 시킨 DES를 보완한 알고리즘인데, DES는 Key가 8byte인 반면에 3DES는 3번이므로 24byte가 필요하며, DESede, eee.. 이런 것은 3DES 종류 중 하나로, DES를 3번 할 때, Encrypt, Decrypt의 철자를 따서 순서를 말하는 것이다.



Iv는 그럼 뭐냐?

mode에는 ECB, CBC가 있는 데,


ECB Mode는 원본데이터를 8byte 단위로 쪼개어 암호화하며, 데이터의 일부라도 8Byte로 쪼개어 해석이 가능합니다.


하지만 CBC모드는 8byte 단위로 암호화 한 데이터가 그 다음 8byte 암호화에도 적용되어 상호연관관계에 의한 원본 데이터의 중간 어느 부분만 따로 해석이 불가능한 구조입니다. 그러니까 총 16byte를 암호화 하는 것이죠.

그런데 첫번 째 8byte는 같이 엮을 데이터가 없기 때문에, 초기 벡터를 주고자 이 때 IV 8byte가 들어가는 것입니다.


블록 암호화에서의 운영 모드
이미지의 출처는 위키피디아 입니다. (http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation)

1. ECB (Electronic Code Block) Mode
- 가장 단순한 모드로 블록단위로 순차적으로 암호화 하는 구조이다.
- 한개의 블록만 해독되면 나머지 블록도 해독이 되는 단점이 있다. (Brute-Force Arttack, Dictionary Attack)
- 암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 알기 위해서 Padding을 해야한다.


- error propagation : 각 블록이 독립적으로 동작하므로 한블록에서 에러가 난다고 해도 다른 블록에 영향을 주지 않는다. 해당 블록까지 에러 전파.


2. CBC(Cipher Block Chaining) Mode
- 블록 암호화 운영 모드 중 보안 성이 제일 높은 암호화 방법으로 가장 많이 사용된다.
- 평문의 각 블록은 XOR연산을 통해 이전 암호문과 연산되고 첫번째 암호문에 대해서는 IV(Initial Vector)가 암호문 대신 사용된다. 이 때, IV는 제 2의 키가 될수 있다.
- 암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 얻기 위해서 Padding을 해야만 한다.
암호화가 병렬처리가 아닌 순차적으로 수행되어야 한다. (단점이죵~)


- error propagation : 깨진 암호문의 해당블록과 다음블록의 평문까지 영향을 미치게 됩니다. 두번째 복호화 그림을 보고 Ciphertext가 깨졌을 때를 생각해보시면 이해가 되실꺼에요~


3. CFB(Cipher FeedBack) Mode
- 블록 암호화를 스트림 암호화처럼 구성해 평문과 암호문의 길이가 같다(패딩이 필요 없다)
- 최초의 키생성 버퍼로 IV가 사용되며, 이때 IV는 제2의 키가 될수 있다.
스트림의 기본단위를 Bit단위로 설정할 수 있으며, Bit단위에 따라 CFB8~CFB128로 쓰인다.
암호화, 복호화 모두 암호화로만 처리할 수 있다.
- CBC모드와 마찬가지로 암호화는 순차적이고, 복호화는 병렬적으로 처리할 수 있다.


- error propagation : CBC모드와 마찬가지로 한 암호문블럭의 에러는 해당평문블록과 다음 평문블록, 이렇게 총 2개의 블록에 전파된다.


4. OFB(Output FeedBack) Mode
- 블록 암호화를 스트림 암호화처럼 구성해 평문과 암호문의 길이가 같다.(패딩이 필요없다)
- 암호화 함수는 키 생성에만 사용되며, 암호화 방법과 복호화 방법이 동일해 암호문을 한번 더 암호화하면 평문이 나온다. (복호화시에 암호화)
- 최초의 키생성 버퍼로 IV가 사용되며, 이 때 IV는 제2의 키가 될수 있다.
스트림의 기본 단위를 Bit단위로 설정할 수 있으며, Bit단위에 따라 OFB8~OFB128로 쓰인다.


- error propagation : 해당블록까지만~ 대응되는 한 블록에만 영향을 미치므로, 영상이나 음성과 같은 digitized analog신호에 많이 사용된다.


5. CTR (CounTeR) Mode
- 블록을 암호화할 때마다 1씩 증가해 가는 카운터를 암호화 해서 키스트림을 만든다. 즉 카운터를 암호화한 비트열과 평문블록과의 XOR를 취한 결과가 암호문 블록이 된다.
- CTR모드는 OFB와 같은 스트림 암호의 일종이다.
- CTR모드의 암복호화는 완전히 같은 구조가 되므로 구현이 간단하다.(OFB와 같은 스트림 암호의 특징)
- CTR모드에서는 블록의 순서를 임의로 암/복호화 할 수있다.(비표와 블록번호로부터 카운터를 구할 수 있기때문에)
- 블록을 임의의 순서로 처리 할 수 있다는 것은 처리를 병행 할 수 있다는 것을 의미한다.(병렬처리 가능)


- error propagation : 각 블록이 병렬처리 되므로 같은 블록내에서만 이루어짐.



인스톨

dart_des: ^0.0.2



main.dart

import 'dart:convert';
import 'package:dart_des/dart_des.dart';

void main(List<String> arguments) {
String key = '123456781234567812345678'; // 24-byte
List<int> iv = [1, 2, 3, 4, 5, 6, 7, 8];
String message = 'Driving in from the edge of town';

print(key.codeUnits);

DES3 des3CBC = DES3(key: key.codeUnits, mode: DESMode.CBC, iv: iv);
List<int> encrypted = des3CBC.encrypt(message.codeUnits);
List<int> decrypted = des3CBC.decrypt(encrypted);

print('decrypted (utf8): ${utf8.decode(decrypted)}');
}



'etc' 카테고리의 다른 글

java String, char  (0) 2021.05.31
프로젝트생성 bitbucket git 연동.  (0) 2021.05.14
php cheat sheet  (0) 2019.04.25
lck 2019 서머 일정표  (0) 2019.02.25
rxjs  (0) 2018.12.21