
AES키를 기기 내부에 저장하는 것도 했으니 RSA도 해봄.
var privateKey : PrivateKey? = null var publicKey : PublicKey? = null var alias = "linsoo.pe.kr"
Keystore 내부에 저장할때 별칭을 가지고 불러올수 있는데 일단 linsoo.pe.kr로 했음.
var ks : KeyStore = KeyStore.getInstance("AndroidKeyStore").apply {
load(null)
}
키스토어 인스턴스를 가져옵니다.
if(ks.containsAlias(alias)) {
val entry: KeyStore.Entry = ks.getEntry(alias, null)
if (entry is KeyStore.PrivateKeyEntry) {
privateKey = entry.privateKey
publicKey = entry.certificate.publicKey
}
}
키스토어내에 alias가 있는지 검색해보고 있으면 가져와서 개인키와 공개키를 뽑아냅니다.
else{
val kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA,"AndroidKeyStore")
val parameterSpec = KeyGenParameterSpec.Builder(
alias,
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
).run {
setAlgorithmParameterSpec(
RSAKeyGenParameterSpec(
2048,
RSAKeyGenParameterSpec.F4
)
)
setBlockModes(KeyProperties.BLOCK_MODE_ECB)
setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
setDigests(KeyProperties.DIGEST_SHA512)
setUserAuthenticationRequired(false)
build()
}
kpg.initialize(parameterSpec)
val keys = kpg.generateKeyPair()
privateKey = keys.private
publicKey = keys.public
}
키스토어내에 alias가 없으면 새로 키를 생성합니다. 기본적인건 아니고 다양한 옵션이 있으니 기기 지원버전에 맞게 잘 선택하셔야 합니다.
var text = "동해물과 백두산이"
val oappSp = OAEPParameterSpec(
"SHA-512",
"MGF1",
MGF1ParameterSpec.SHA1,
PSource.PSpecified.DEFAULT
)
val encCipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-512AndMGF1Padding")
val decCipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-512AndMGF1Padding")
encCipher.init(Cipher.ENCRYPT_MODE, publicKey, oappSp)
decCipher.init(Cipher.DECRYPT_MODE, privateKey, oappSp)
var encryptTextByteArray = encCipher.doFinal(text.toByteArray())
var decryptTextByteArray = decCipher.doFinal(encryptTextByteArray)
Log.d("linsoo","원본텍스트 : "+text)
Log.d("linsoo", "암호화 : n"+ String(Base64.encode(encryptTextByteArray, Base64.DEFAULT)))
Log.d("linsoo", "복호화 : "+ String(decryptTextByteArray))
암호화 하고 복호화 하는 부분입니다.
여기서 한가지 삽질했던것이 저 OAEPParameterSpec인데 첫번째 인자는 키 생성시 setDigests 랑 같아야 하고 MFG1ParameterSpec에 SHA는 별개인것입니다.
저는 위에 Digest에서 SHA-512로 해서 둘다 512로 해야 하는건줄 알았는데

“Unsupported MGF1 digest: SHA-512, Only SHA-1 supported” 라는 에러가 뜨더군요. 그래서 두개가 별개값이라는걸 알았습니다 -_-;
RSA Android Keystore 간략하게 정리하면 이렇게 되고 입맛대로 쓰면 될듯 싶습니다.
답글 남기기