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) { 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") } }