상세 컨텐츠

본문 제목

[보안] Android - AES 암호화/복호화

프로그래밍/안드로이드

by 우뇽킴 2023. 10. 22. 21:49

본문

안드로이드 기준으로  AES 암호화 및 복호화 해보려고합니다.

 

AES알고리즘에는 여러가지고 있는데, AES128 / AES 192 / AES 256 등 키의 비트수에 따라 AES의 알고리즘 종류가 있습니다.

 

이중 AES128를 암호화 및 복호화해보려고 하며, AES128은 16바이트(키의 길이가 16자리)인 암호방식입니다.

 

참고로 AES 알고리즘은 양방향 대칭키(암호화 시 KEY와 복호화 시 KEY가 동일함)를 가지고 있는 알고리즘입니다.

 

AES 암호화 시 IV(Initianlization Vector) 초기화 백터도 설정한다는데 여기서는 패스...

 

AES암호화
/**
     * AES128 암호화
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    public static String encrypt(byte[] target, byte[] key) {
        SecretKeySpec keySpec = null;

        keySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = null;

        try {
            cipher = Cipher.getInstance("AES");
        } catch (NoSuchAlgorithmException e) {
//            return null;
        } catch (NoSuchPaddingException e) {
//            return null;
        }

        try {
            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
        } catch (InvalidKeyException e) {
            return null;
        }

        try {
            Base64.Encoder encoder = Base64.getEncoder();
            return new String(encoder.encode(cipher.doFinal(target)));
        } catch (IllegalBlockSizeException e) {
//            throw new RuntimeException(e);
        } catch (BadPaddingException e) {
//            throw new RuntimeException(e);
        }
        return null;

    }

 

위의 코드는 아래와 같은 결과를 보여줍니다.

[결과]

I2t7XSO97Yc+NdTfTihJd0GKdihEkStHfttZ9JDN7wg=

 

 

 

AES 복호화
@RequiresApi(api = Build.VERSION_CODES.O)
    public static String decrypt(byte[] target, byte[] key) {
        SecretKeySpec keySpec = null;
        keySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = null;
        try {
            cipher = Cipher.getInstance("AES");

        } catch (NoSuchPaddingException e) {
//            throw new RuntimeException(e);
        } catch (NoSuchAlgorithmException e) {
//            throw new RuntimeException(e);
        }

        try {
            cipher.init(Cipher.DECRYPT_MODE, keySpec);
        } catch (InvalidKeyException e) {

            return null;
        }

        try {
            Base64.Decoder encoder = Base64.getDecoder();
            return new String(cipher.doFinal(encoder.decode(target)));
        } catch (IllegalBlockSizeException e) {
            System.out.println("err");
        } catch (BadPaddingException e) {

        }
        return null;
    }

 

위의 복호화코드는 아래와 같은 결과를 보여줍니다.

[결과]

암호화및복호화실습

 

 

 

전체소스(암호화/복호화)

 

package com.example.test;

import android.os.Build;
import android.os.Bundle;

import com.google.android.material.snackbar.Snackbar;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import android.util.Log;
import android.view.View;

import androidx.core.view.WindowCompat;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

import com.example.test.databinding.ActivityMainBinding;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

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

public class MainActivity extends AppCompatActivity {

    private static String key = "abcdefghijk12345";
    private static String target = "암호화및복호화실습";




    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        //평문->암호화
        String str = encrypt(target.getBytes(), key.getBytes());
        Log.e("KUY", str);

        //암호화->복호화
        String str2 = decrypt(str.getBytes(), key.getBytes());
        Log.e("KUY", str2);
    }


    /**
     * AES128 암호화
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    public static String encrypt(byte[] target, byte[] key) {
        SecretKeySpec keySpec = null;

        keySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = null;

        try {
            cipher = Cipher.getInstance("AES");
        } catch (NoSuchAlgorithmException e) {
//            return null;
        } catch (NoSuchPaddingException e) {
//            return null;
        }

        try {
            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
        } catch (InvalidKeyException e) {
            return null;
        }

        try {
            Base64.Encoder encoder = Base64.getEncoder();
            return new String(encoder.encode(cipher.doFinal(target)));
        } catch (IllegalBlockSizeException e) {
//            throw new RuntimeException(e);
        } catch (BadPaddingException e) {
//            throw new RuntimeException(e);
        }
        return null;

    }


    /**
     * AES복호화
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    public static String decrypt(byte[] target, byte[] key) {
        SecretKeySpec keySpec = null;
        keySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = null;
        try {
            cipher = Cipher.getInstance("AES");

        } catch (NoSuchPaddingException e) {
//            throw new RuntimeException(e);
        } catch (NoSuchAlgorithmException e) {
//            throw new RuntimeException(e);
        }

        try {
            cipher.init(Cipher.DECRYPT_MODE, keySpec);
        } catch (InvalidKeyException e) {

            return null;
        }

        try {
            Base64.Decoder encoder = Base64.getDecoder();
            return new String(cipher.doFinal(encoder.decode(target)));
        } catch (IllegalBlockSizeException e) {
            System.out.println("err");
        } catch (BadPaddingException e) {

        }
        return null;
    }


}

 

[결과]

I2t7XSO97Yc+NdTfTihJd0GKdihEkStHfttZ9JDN7wg=
암호화및복호화실습

 

이상. 안드로이드로 구현한 AES 알고리즘이었습니다. ㅎㅎ

 

저는 안드로이드 네이티브앱 간 웹 자바스크립트 간 데이터 전달시 사용하려고합니다~

 

 

관련글 더보기

댓글 영역