WIP: KotlinでRSAの公開鍵・秘密鍵を作って署名して検証する
code:kt
import java.security.KeyPairGenerator
import java.security.Signature
import java.security.interfaces.RSAPrivateKey
import java.security.interfaces.RSAPublicKey
import java.util.*
fun base64Encode(bytes: ByteArray): String =
Base64.getEncoder().encodeToString(bytes)
fun base64Decode(str: String): ByteArray =
Base64.getDecoder().decode(str)
fun main() {
val generator: KeyPairGenerator = KeyPairGenerator.getInstance("RSA")
generator.initialize(2048)
val keyPair = generator.generateKeyPair()
val privateKey = keyPair.private as RSAPrivateKey
val publicKey = keyPair.public as RSAPublicKey
// Modulus
val modulusBytes = publicKey.modulus.toByteArray()
println("modulus: ${base64Encode(modulusBytes)}")
// Public key
val publicKeyBytes = publicKey.publicExponent.toByteArray()
println("public key: ${base64Encode(publicKeyBytes)}")
// Private key
val privateKeyBytes = privateKey.privateExponent.toByteArray()
println("private key: ${base64Encode(privateKeyBytes)}")
// Data
val message = "hello, world"
// Sign
val signer = Signature.getInstance("SHA256withRSA")
signer.initSign(privateKey)
signer.update(message.toByteArray())
val sign: ByteArray = signer.sign()
println("signature: ${base64Encode(sign)}")
// Verify
val verifier = Signature.getInstance("SHA256withRSA")
verifier.initVerify(publicKey)
verifier.update(message.toByteArray())
val result: Boolean = verifier.verify(sign)
println("verified: $result")
}
以下が出力例。
code:出力例
modules: AK5p0LX9vpPtYNB2UUGkNRVjxd+TLyfQlkscfGMmHvK0VjkzrJ00ggCq0HapsTGKzTk0zrD1s2wpFhm7hTk18fCCHY7T7yj8qcoSVIidfjzyog6x6QosMJRpX7RZBmCtb+NVJNi5TmKaMNh872gTNEeeXO4pTPMglpipmOFPJ9OQRO8BovH4gCPLp0GQUEl3WN2Bv8kQH1YWLr48A1HOK2UkVpIdwDY6WPZMcr1dq2d2l4sBatsh1NULozfqGNkrOUPiYmUuB2k1sKVQecTWGsriWIj1z+QCrROJnrTX4JDYCt99xTfsh2ch4KLIUDboZit/tpGXEHc8Vtf+ONizuDs=
public key: AQAB
private key: SwhWs5SAAl+iwMvF1TlxZMxRegd1x+kiXxnYIUdrFPqkBWPHpLHMI8FYgVQrWKbf9vZS3So2kBd03IkhnSUp+k/fq2xdfQKFgNs15rfqcQno0e2T1b6A/7f9ZjbOWZUDh4c/nMTLhfvTe67zx5BLc2wbipHV+tpQL0j27icBeS/nmpXJXHedKcoM7n81E/2VCp30dVbNqBLRElK4eDmY6FZRhTfcl+1mq4XjV1XWFBGPbYx+UIwLON2tGaypT3gn+3ILagtwH5PvtvWnPvEykHXRK1xvhf+YAA0cl6ZH/r3a9bh/wgbL14Uw4CEi794BJTsDWsGqJT80L8t7MLuJsQ==
signature: M+QcLl8m5/SOJbNvJCumAoesKcwiOMlbhBtaAtg7t/7KWeYWsEd/lo/5VlT6juPtIQMD/RL2V5N7qlJUhaXW3kdwe9Tar7V+maIx0Uks9WUEQ9i/jAyZJTfD1o4zTmN9ddAZpDA0zepDrAO9lmFNorNMUm96BF4PeQyD+WGnNwh2sQnr3yCvwLFu5NYx/Hsicp2cGaKdda885bZWZCT7fC/ANsLLpXDFFw0/8YR2bwD+lVwhP2BaXjGWFD+Ui19q+M/wpyPuv9FCkBYWI8Px/Cl+s4pR2h1tLXyzjr8WTVQRRqQStw+jDI+X282TwvopqXp3BwtXynioCkfB7yfN+A==
verified: true