상세 컨텐츠

본문 제목

(안드로이드) 고급 암호화 표준 (AES256)

Android

by choiDev 2019. 2. 1. 16:30

본문

고급 암호화 표준(Advanced Encryption Standard AES)


AES란?

한국어로 번역하면 고급 암호화 표준 이며 대칭키를 쓰는 블럭 암호이다. 높은 안전성과 속도로 인해 인기를 얻어 전 세계적으로 사용되고 있다.


현재 AES는 Rijndael(레인달) 알고리즘을 가지고 만들어 졌으며, 엄밀하게는 레인달 알고리즘의 여러 가능성 중, 암호화 블럭의 크기가 128비트이며 암호화 키의 길이가 128, 192, 256비트인 세 가지 종류가 AES 표준으로 지정되었다. 각각 AES-128, AES-192, AES-256으로 불린다.


AES 특징


대칭형, 블럭 암호화 알고리즘이다. 대칭형 암호화 알고리즘 중 가장 유명하다. 암호화 키는 128, 192, 256 중 하나가 된다. 암호화 키의 길이에 따라 실행하는 라운드 수가 다른데, 각각 10, 12, 14라운드를 실행한다.



AES 안전성

미국 정부가 채택하여 기밀문서를 암호화를 했을 정도로, 신뢰가는 알고리즘이라고 생각하면 된다. 키없이 해독하는 것이 거의 불가능하다고 믿어지며, 최신 cipher와 마찬가지로, known-plaintext 해킹기술로도 해독이 불가능하다고 한다.


컴퓨팅 기술의 급속한 발전에 따라 현재 권장되는 암호화 수준은 192bit 이상이며 대다수의 금융기관들은 256bit 이상의 암호화 체계로 전환했다.


자바 AES-256 암,복호화 사용예제

package Encryption;

import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

public class AES256Util {
private String iv;
private Key keySpec;

public AES256Util(String key)throws UnsupportedEncodingException {
this.iv = key.substring(0,16);

byte[] keyBytes = new byte[16];
byte[] b = key.getBytes("UTF-8");
int length = b.length;

if(length > keyBytes.length){
length = keyBytes.length;
}

System.arraycopy(b,0,keyBytes,0,length);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

this.keySpec = keySpec;
}

public String aesEncode(String str) throws java.io.UnsupportedEncodingException,
NoSuchAlgorithmException,
NoSuchPaddingException,
InvalidKeyException,
InvalidAlgorithmParameterException,
IllegalBlockSizeException,
BadPaddingException{
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes()));

byte[] encrypted = c.doFinal(str.getBytes("UTF-8"));
String enStr = new String(Base64.encodeBase64(encrypted));

return enStr;
}

public String aesDecode(String str) throws java.io.UnsupportedEncodingException,
NoSuchAlgorithmException,
NoSuchPaddingException,
InvalidKeyException,
InvalidAlgorithmParameterException,
IllegalBlockSizeException,
BadPaddingException {

Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes()));

byte[] byteStr = Base64.decodeBase64(str.getBytes());

return new String(c.doFinal(byteStr), "UTF-8");
}
}


[MainActivity.java] 작성 소스

private static final String KEY = "aes256-test-key!!";
AES256Util aes256Util;
aes256Util = new AES256Util(KEY);
URLCodec codec = new URLCodec();


//AES복호화
String nickName = aes256Util.aesDecode(codec.decode(dis.readUTF()));


관련글 더보기