104 lines
5.3 KiB
Kotlin
104 lines
5.3 KiB
Kotlin
package top.tangyh.lamp.filing.utils
|
|
|
|
import java.nio.charset.StandardCharsets
|
|
import java.security.KeyFactory
|
|
import java.security.KeyPairGenerator
|
|
import java.security.PublicKey
|
|
import java.security.spec.PKCS8EncodedKeySpec
|
|
import java.security.spec.X509EncodedKeySpec
|
|
import java.util.*
|
|
import javax.crypto.Cipher
|
|
|
|
|
|
object RsaOaepCryptoUtil {
|
|
|
|
private const val cipherAlgorithm =
|
|
"RSA/ECB/OAEPWithSHA-256AndMGF1Padding"
|
|
|
|
private val keyFactory = KeyFactory.getInstance("RSA")
|
|
|
|
fun encrypt(
|
|
plainText: String,
|
|
publicKeyBase64: String
|
|
): String {
|
|
val publicKey = loadPublicKey(publicKeyBase64)
|
|
|
|
val cipher = Cipher.getInstance(cipherAlgorithm)
|
|
cipher.init(Cipher.ENCRYPT_MODE, publicKey)
|
|
|
|
val encryptedBytes = cipher.doFinal(
|
|
plainText.toByteArray(StandardCharsets.UTF_8)
|
|
)
|
|
return Base64.getEncoder().encodeToString(encryptedBytes)
|
|
}
|
|
|
|
fun decrypt(
|
|
encryptedData: String,
|
|
privateKeyBase64: String
|
|
): String {
|
|
val privateKeyBytes = Base64.getDecoder().decode(privateKeyBase64)
|
|
val keySpec = PKCS8EncodedKeySpec(privateKeyBytes)
|
|
val privateKey = keyFactory.generatePrivate(keySpec)
|
|
|
|
val cipher = Cipher.getInstance(cipherAlgorithm)
|
|
cipher.init(Cipher.DECRYPT_MODE, privateKey)
|
|
|
|
val decryptedBytes = cipher.doFinal(
|
|
Base64.getDecoder().decode(encryptedData)
|
|
)
|
|
return String(decryptedBytes, StandardCharsets.UTF_8)
|
|
}
|
|
|
|
private fun loadPublicKey(base64Key: String): PublicKey {
|
|
val keyBytes = Base64.getDecoder().decode(base64Key)
|
|
val keySpec = X509EncodedKeySpec(keyBytes)
|
|
return keyFactory.generatePublic(keySpec)
|
|
}
|
|
}
|
|
|
|
|
|
object Test {
|
|
@JvmStatic
|
|
fun main(args: Array<String>) {
|
|
val keyPairGenerator = KeyPairGenerator.getInstance("RSA")
|
|
keyPairGenerator.initialize(2048)
|
|
val keyPair = keyPairGenerator.generateKeyPair()
|
|
|
|
// val publicKey = Base64.getEncoder().encodeToString(keyPair.public.encoded)
|
|
// val privateKey = Base64.getEncoder().encodeToString(keyPair.private.encoded)
|
|
|
|
val publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzDlZvMDVaL+fjl05Hi182JOAUAaN4gh9rOF+1NhKfO4J6e0HLy8lBuylp3A4xoTiyUejNm22h0dqAgDSPnY/xZR76POFTD1soHr2LaFCN8JAbQ96P8gE7wC9qpoTssVvIVRH7QbVd260J6eD0Szwcx9cg591RSN69pMpe5IVRi8T99Hhql6/wnZHORPr18eESLOY93jRskLzc0q18r68RRoTJiQf+9YC8ub5iKp7rCjVnPi1UbIYmXmL08tk5mksYA0NqWQAa1ofKxx/9tQtB9uTjhTxuTu94XU9jlGU87qaHZs+kpqa8CAbYYJFbSP1xHwoZzpU2jpw2aF22HBYxwIDAQAB"
|
|
val privateKey = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDMOVm8wNVov5+OXTkeLXzYk4BQBo3iCH2s4X7U2Ep87gnp7QcvLyUG7KWncDjGhOLJR6M2bbaHR2oCANI+dj/FlHvo84VMPWygevYtoUI3wkBtD3o/yATvAL2qmhOyxW8hVEftBtV3brQnp4PRLPBzH1yDn3VFI3r2kyl7khVGLxP30eGqXr/Cdkc5E+vXx4RIs5j3eNGyQvNzSrXyvrxFGhMmJB/71gLy5vmIqnusKNWc+LVRshiZeYvTy2TmaSxgDQ2pZABrWh8rHH/21C0H25OOFPG5O73hdT2OUZTzupodmz6SmprwIBthgkVtI/XEfChnOlTaOnDZoXbYcFjHAgMBAAECggEBAKUDagjj3wwmWWwU00QZCRmOBU2kHhyXM8Tu5yZgJb/QLt5/ESEE/OwdZrRmLtnpIb31TmF6QNQJ1hQMSdUCgwDIu1489mXl89GvyR6RgAnBwYDd0q+alLHxbU9d87CtauAJU5ynuvAn2RV5ez8XCqpamswXmg/lXUPDIO+h1+K+UJPwYFhzHL3WpZQXHofcSUCRn0JONbz7c9OwVFYe0v1g18wwAvIAsEEimcnXFZaIJ/md2md0Jk4+LOFUsbgCM5skNTooXarDiHGCRFMJXxvYpavC6hhhcWfh3K2ydHMhFdF70ZOs169ShDtYq4i/hkaZ+p7kFVo8Z6oxVUpC8IECgYEA+OQxfc2iGMD9uus/r1yjUx0kdhYKik202tE53C4ikAn490+Lb8qcY/kykFj721MHBc73ijq/ZNU21JxyMx4T1jbdvl+5Kv9EUFAQmsJuTSudC1Dud3MlUgYEtVUhau2WOexUIRyCda6V4NUYkJG4vLRyMloPprF3xThmJRgG9qcCgYEA0g6QrU1e/DjADSpymRfqoOX4ASp7G++CRHTB2NZvA6ZxnWoEX59TO3mW4z4fgJkIwevkPUA9nfO2bRQWph+aom5qAczsPmZ2OpR9cjel63AIV1AboUV2Gr/H4IfHs7qGX7JWmW1SnZyvvGuI5MdBHEcysJO+L5V1OVyFRzvj8OECgYAO21A4+jVa1OpQZgp/JUB6jZrHkbk/WDQbe7HAeuCFSJMb8BuaqLV9IjrqcuVVyjb5Gcmc7rTOCAwl1NDcTEdS2iOSYZRkBKjHQoA7PK/o21mce1BAwRbRNprBWDuObnAxNPIwp8sBy1IXAaFdv9UPLpZCey3D/YPwudUfEbgYsQKBgQCZax3sFYh8ew56Dzin7Dnnzk72uwozexkP2p8COovWhKiSqi4LkRh/Zez4iBUGHb+xsxJ+Uf8u8CObQ4LPTmHopPAz5HHfmYJcgrukwlQiwy60ZsPnZA5AtzXLHiCTenZOSrjJUnl2uEv6OChBv+4kMzQol5/erTBy9so5Htr6wQKBgQC3apeFD/x+0FjABleVITzGyAWj/Kxl/OOiL4dQAYW49wVD/j0ujG3CvbK0GHZFwy/Ju+pWlHISbiZiKYko/4GBtp+JwxG9fFmbHdl4BZSTwfQMYdNq8hN+0hBfWwcceIhbEZcFLIvG/ZhkcT3yh874XRn1A5V/AR8W9YFH1EWYwQ=="
|
|
|
|
// val plainText = "{\n" +
|
|
// " \"taskId\": 723047797139586052,\n" +
|
|
// " \"licence\": \"LIC-8F2A-XXXX\",\n" +
|
|
// " \"fingerprint\": \"FP-2c91e9f3\",\n" +
|
|
// " \"enterpriseId\": \"1173040813421105152\",\n" +
|
|
// " \"inspectionId\": \"702286470691215417\",\n" +
|
|
// " \"summary\": \"1\"\n" +
|
|
// "}"
|
|
|
|
val plainText = "{\n" +
|
|
" \"licence\": \"lic-1234567890\",\n" +
|
|
" \"fingerprint\": \"e19c60d21c544c1118e3b633eae1bb935e2762ebddbc671b60b8b61c65c05d1c\"\n" +
|
|
"}"
|
|
|
|
val encryptedText =
|
|
RsaOaepCryptoUtil.encrypt(plainText, publicKey)
|
|
|
|
val decryptedText =
|
|
RsaOaepCryptoUtil.decrypt(encryptedText, privateKey)
|
|
|
|
println("Plain Text: $plainText")
|
|
|
|
println("Public Key: $publicKey")
|
|
println("Private Key: $privateKey")
|
|
|
|
|
|
println("Encrypted: $encryptedText")
|
|
println("Decrypted: $decryptedText")
|
|
}
|
|
}
|
|
|