안드로이드/개발관련(Kotlin)

안드로이드에서 공용키 암호화(RSA) 사용하기(Kotlin)

닉네임못짓는사람 2023. 2. 27. 20:04
반응형

이번 글에서는 안드로이드에서 RSA암/복호화를 하는 방법에 대해서 알아보자.

RSA는 대표적인 공용키 암호화 방식으로써, 암호화할 때 사용하는 키와 복호화할 때 사용하는 키가

다른 것을 공용키, 비대칭키 암호화 방식이라고 한다.

 

여기서 모두에게 공개하는 키를 공용키라고 하고, 누구에게도 알리지 않고 나만 가지고 있는 키를 개인키라고한다.

RSA알고리즘을 사용하기 위해선 이 둘을 한 쌍으로 하는 KeyPair가 반드시 필요하다.

 

그럼 일단 KeyPair를 만들어보도록 하자.

val keygen = KeyPairGenerator.getInstance("RSA")
keygen.initialize(2048, SecureRandom())
var keyPair = keygen.genKeyPair()

KeyPair는 아주 간단하게 만들 수 있는데, KeyPairGenerator에 사용할 알고리즘인 RSA를 넣어서 객체를 생성해준다.

그리고 key의 길이는 2048로 지정을 해주도록 하자.

이렇게 keyGenerator설정을 끝냈으면 keyPair객체에 generator에 있는 KeyPair를 받아서 저장하기만 하면 된다.

        var text = "동해물과 백두산이 마르고 닳도록"
        var en = encrypt(text, keyPair.private)
        var de = decrypt(en, keyPair.public)

다음은 이 KeyPair로 암/복호화를 해보도록 하자.

먼저 평문(PlainText)는 위와 같이 text변수에 원하는 텍스트를 입력해주자.

그리고 이 글에서는 개인키로 암호화를 하고 공용키로 복호화를 진행할 예정이다.

개인키와 공용키를 얻는 방법은 KeyPair에서 각각 .private와 .public을 해주면 된다.

 

    fun encrypt(input: String, key: PrivateKey): String {
        val cipher = Cipher.getInstance("RSA")
        cipher.init(Cipher.ENCRYPT_MODE, key)
        val encrypt = cipher.doFinal(input.toByteArray())
        return  Base64Utils.encode(encrypt)
    }
   

먼저 암호화 함수부터 살펴보도록 하자.

input은 우리가 사용할 평문이고, key는 privateKey가 된다.

Cipher객체에 사용할 알고리즘인 RSA를 입력해서 선언해준 뒤, init을 통해 생성해주도록 하자.

이때는 우리가 암호화를 할 지 복호화를 할 지 정해주고, Key를 넣어주면 된다.

 

다음으로 CipherText를 구할텐데, 현재 String형태인 input(평문)을 ByteArray로 바꿔서 doFinal을 통해 암호화해준다.

그리고 Base64Utils를 사용해서 이 암호문을 인코딩해준 뒤 반환을 해주면 끝이다.

    fun decrypt(input: String, key: PublicKey): String {
        var byteEncrypt: ByteArray = Base64Utils.decode(input)
        val cipher = Cipher.getInstance("RSA")
        cipher.init(Cipher.DECRYPT_MODE, key)
        val decrypt = cipher.doFinal(byteEncrypt)
        return String(decrypt)
    }

다음은 복호화이다.

여기서 input은 위에서 암호화한 CipherText가 된다.

이때 input이 Base64Utils로 인코딩 된 상태인데, 이를 디코딩해서 ByteArray형태로 저장해준다.

그 이후는 마찬가지로 cipher객체를 생성하고, doFinal을 통해 현재 ByteArray상태인 암호문을 복호화 해주면 된다.

이때는 문자열(String)을 받아야 하기 때문에 String(decrypt)와 같이 작성해서 String문자열을 반환해주도록 하자.

이런 절차를 따르면 위와 같이 RSA로 암호화된 암호문과, 이를 복호환 평문을 구할 수 있게된다.

반응형