Skip to content

Instantly share code, notes, and snippets.

@TomoyaShibata
Last active January 24, 2018 05:52
Show Gist options
  • Save TomoyaShibata/83a4bf41aa724dacc33fb6f932fb9b29 to your computer and use it in GitHub Desktop.
Save TomoyaShibata/83a4bf41aa724dacc33fb6f932fb9b29 to your computer and use it in GitHub Desktop.
Android で楕円曲線暗号を使って署名/検証を行うコード。使用する楕円曲線は P-384 曲線。
private fun signVerify() {
val plainText = "I'm Tomoya Shibata"
val aliceKeyPair = this.generateKeyPair("aliceKeyPair")
// alice の秘密鍵で署名
val signSignature = Signature.getInstance("SHA256withECDSA")
signSignature.initSign(aliceKeyPair?.private)
signSignature.update(plainText.toByteArray(Charsets.UTF_8))
val sign = signSignature.sign()
Log.d("sign", String(sign))
// alice の公開鍵で検証
val verifySignature = Signature.getInstance("SHA256withECDSA")
verifySignature.initVerify(aliceKeyPair?.public)
verifySignature.update(plainText.toByteArray(Charsets.UTF_8))
val verify = verifySignature.verify(sign)
Log.d("verify", verify.toString())
}
/**
* P-384 曲線による新しいキーペアを作成する
*/
private fun generateKeyPair(keystoreAlias: String): KeyPair? {
val keyPairGenerator = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_EC,
"AndroidKeyStore"
)
keyPairGenerator.initialize(this.buildKeyGenParameterSpec("aliceKeyPair"))
return keyPairGenerator.generateKeyPair()
}
/**
* キーペアの仕様を返却する
*/
private fun buildKeyGenParameterSpec(keystoreAlias: String): KeyGenParameterSpec? {
return KeyGenParameterSpec.Builder(keystoreAlias, KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY)
.setAlgorithmParameterSpec(ECGenParameterSpec("secp384r1"))
.setDigests(KeyProperties.DIGEST_SHA256)
.build()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment