티스토리 뷰
안녕하세요
이번 게시물에서는 DES 대칭키 암호화 사용법을 알아보며
JAVA와 .NET의 사용법 차이에 대해서도 알아보겠습니다.
DES (Data Encryption Standard) 란?
- 1975년에 IBM에서 개발하고 1979년에 미국 NBS(National Bureau of Standards, 현 NIST)가 국가 표준 암호 알고리즘으로 지정한 대칭키 암호 알고리즘.
- DES는 대칭형 암호이며 암호화 및 복호화 키가 동일합니다.
- 64비트 평문을 64비트 암호문으로 암호화하는 대칭키 암호화입니다.
- DES의 키는 7비트마다 오류 검출을 위해 1비트씩 들어가며 실제로는 56비트입니다.
- 현재 기술로는 DES 암호는 쉽게 해독이 가능합니다.
- n개의 통신마다 키를 다르게 해야 하기 때문에 비밀키의 개수가 많아지는 키 관리의 문제점이 있습니다.
간단하게 DES에 대해 알아봤습니다.
암호화 코드 순서
1. 암호화 알고리즘
2. 데이터 보안
대칭키 암호화 알고리즘 종류 중 블록 암호화 모드로 ECB 모드, CBC 모드가 있습니다.
(다른 종류도 존재합니다.)
- ECB (Electirc CodeBook) 모드
평문 블록을 그대로 암호화하는 것입니다,
평문 블록과 암호문 블록이 1대 1 대응을 하며 마지막 블록 크기가 다르다면 동일하게 맞추기 위해 패딩 값을 붙입니다.
각 블록에 사용하는 키들은 동일합니다.
- CBC (Cipher Block Chaining) 모드
앞서 암호화한 블록에 체인처럼 연결을 시켜 암호화를 진행합니다.
생성되는 암호문 블록들은 이전 평문 블록들의 영향을 받으면서 진행됩니다.
이 중 최초의 평문 블록은 이전 암호문 블록이 없기 때문에 대신할 비트열을 준비한다
해당 비트열을 초기화 벡터(Initialization vector) IV 값이라 합니다.
코드 설정에는 블록 문 선택과 Padding 값 채우기 방법을 선택하게 됩니다.
JAVA DES 암호화 코드
// fix key
private final String skey = "abcdefgh";
public String encrypt(String data)
throws GeneralSecurityException, UnsupportedEncodingException {
DESKeySpec desKeySpec = new DESKeySpec(skey.getBytes("US-ASCII"));
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);
byte[] dataBytes = data.getBytes("UTF-8");
byte[] ivBytes = skey.getBytes("US-ASCII");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(ivBytes);
try {
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return DatatypeConverter.printBase64Binary(cipher.doFinal(dataBytes));
}
public String decrypt(String data)
throws GeneralSecurityException, UnsupportedEncodingException {
//byte[] dataBytes = Base64.getDecoder().decode(data);
byte[] dataBytes = DatatypeConverter.parseBase64Binary(data);
DESKeySpec desKeySpec = new DESKeySpec(skey.getBytes("US-ASCII"));
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);
byte[] ivBytes = skey.getBytes("US-ASCII");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(ivBytes);
try {
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
} catch (Exception e) {
e.printStackTrace();
}
byte[] dataBytesDecrypted = (cipher.doFinal(dataBytes));
return new String(dataBytesDecrypted);
}
Key는 고정적으로 8바이트로 정해서 입력해 주시면 됩니다.
JAVA 기본 알고리즘은 ECB 모드, PKCS5Padding입니다.
Cipher.getInstance()를 통해 방법을 선택합니다.
CBC 모드를 선택할 때는 초기화 벡터(IV) 값을 지정해주며, 암호화 키와 동일한 키값을 넣어줍니다.
.NET DES 암호화 코드
private byte[] Skey = ASCIIEncoding.ASCII.GetBytes("abcdefgh");
public string Encrypt(string p_data)
{
DESCryptoServiceProvider cryptoServiceProvider = new DESCryptoServiceProvider();
cryptoServiceProvider.Padding = PaddingMode.PKCS7;
cryptoServiceProvider.Mode = CipherMode.CBC;
cryptoServiceProvider.Key = Skey;
cryptoServiceProvider.IV = Skey;
MemoryStream ms = new MemoryStream();
CryptoStream cryStream = new CryptoStream(ms, cryptoServiceProvider.CreateEncryptor(), CryptoStreamMode.Write);
byte[] data = Encoding.UTF8.GetBytes(p_data.ToCharArray());
cryStream.Write(data, 0, data.Length);
cryStream.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
public string Decrypt(string p_data)
{
DESCryptoServiceProvider cryptoServiceProvider = new DESCryptoServiceProvider();
cryptoServiceProvider.Padding = PaddingMode.PKCS7;
cryptoServiceProvider.Mode = CipherMode.CBC;
cryptoServiceProvider.Key = Skey;
cryptoServiceProvider.IV = Skey;
MemoryStream ms = new MemoryStream();
CryptoStream cryStream = new CryptoStream(ms, cryptoServiceProvider.CreateDecryptor(), CryptoStreamMode.Write);
byte[] data = Convert.FromBase64String(p_data);
cryStream.Write(data, 0, data.Length);
cryStream.FlushFinalBlock();
return Encoding.UTF8.GetString(ms.GetBuffer());
}
.NET에 기본 옵션은 PaddingMode.PKCS7, CBC 모드입니다.
옵션의 변경을 원하면 Padding, Mode 값을 변경해 주시면 됩니다.
위 JAVA 코드와 동일하게 Key 값을 지정하면 암복호화를 동일하게 사용할 수 있습니다.
마무리
JAVA와 .NET의 DES 암호화 코드를 알아봤습니다.
DES 기본적인 암호화 기능이며 간단하게 암복호화가 필요한 곳에 적용하면 괜찮을 듯합니다.
양쪽 환경에서 암복호화가 필요할 때 적용하시기 바랍니다.
-DES, 암호문 블록 개념 링크
https://liveyourit.tistory.com/196
[암호학] DES vs AES 암호화 알고리즘, 방식 및 차이
DES(Data Encryption Standard)란? DES는 이전 포스팅에서 살펴본 페이스텔 구조의 블록 대칭키 암호화 방식 중 하나이다. 16라운드로 구성되어 있기 때문에 16번의 페이스텔 암호를 수행하게 된다. 관련
liveyourit.tistory.com
[암호학] 대칭키 암호 - DES(Data Encryption Standard)
데이터 암호화 표준 DES(Data Encryption standard) 1. 개요 DES는 대칭형 암호(비밀키 암호)이다. 즉, 암호화 및 복호화 키가 동일하다. 비대칭형 암호에 비해 암호 및 복호 속도가 빠르다. 미국 정부의 상
yjshin.tistory.com
https://webstone.tistory.com/134
블록암호 운영모드 ECB,CBC,CFB,OFB,CTR
기본 개념 블록 암호는 고정된 N비트 블록을 N비트 블록으로 변환시키는 함수이다. 임의 길이의 평문을 암호화 시키기 위해서는 평문을 특정한 길이로 분할하여 블록 암호에 입력시켜야 한다.
webstone.tistory.com
'기록' 카테고리의 다른 글
[Ubuntu]SSH 패스워드 없이 서버 접속하기 (0) | 2021.09.05 |
---|---|
[CMD 명령어] 미리 알아두면 좋은 CMD 명령어!! 1탄!! (0) | 2021.08.01 |
[IIS] HTTP 상태 코드 종류 (0) | 2021.08.01 |
[ASP.NET] Create Directory 경로에 대한 액세스가 거부되었습니다. (0) | 2020.11.05 |
[ASP.NET] DB 데이터 CSV 파일로 추출하기 (0) | 2020.10.11 |
- Total
- Today
- Yesterday
- SSH Key접속
- CMD명령어
- DB2Install
- createdb
- DB2설치
- db생성
- 비대칭키접속
- SSH 파일전송
- 인스턴스생성
- UnauthorizedAccessException #Create Directory #ASP.NET #C#
- DB2
- Public key
- IBMDB2
- ssh key
- CSV 파일
- private key
- HTTP Status
- ECB모드
- C# DES
- .NET DES
- JAVA DES
- IIS_USRS
- DB2우분투설치
- http error
- whoami
- DB2실행
- CBC모드
- PowerSheel
- IUSR
- 대칭키암호
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |