안드로이드 기준으로 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 알고리즘이었습니다. ㅎㅎ
저는 안드로이드 네이티브앱 간 웹 자바스크립트 간 데이터 전달시 사용하려고합니다~
안드로이드 POST URL 보내는법 (1) | 2023.11.26 |
---|---|
[Androrid] 웹뷰에서 SSL 이슈(ERR_SSL_PROTOCOL_ERROR) (0) | 2023.11.11 |
안드로이드 터치 이벤트(Touch Event) 전달 과정 (0) | 2023.10.16 |
안드로이드 앱(App) <-> 자바스크립트(JS) 연동 정리 (0) | 2023.10.11 |
안드로이드 백그라운드(Background) 제약 정책 (0) | 2023.10.09 |
댓글 영역