Android常用加解密AES、DES、MD5、RSA、证书指纹等

340 阅读5分钟

AES加解密工具类

import android.util.Base64
import javax.crypto.Cipher
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec

object AESUtils {

    private const val OFFSET = 0
    private const val KEY_LEN = 16
    private const val AES_KEY = "aes$%@CVBGgdt12q"

    /**
     * 加密
     * @param encryptStr 待加密字符串
     * @param encryptKey 加密密钥
     */
    fun encrypt(encryptStr: String, encryptKey: String = AES_KEY): String {
        return try {
            val secretKey = SecretKeySpec(encryptKey.toByteArray(charset("UTF-8")), "AES")
            val iv = IvParameterSpec(encryptKey.toByteArray(), OFFSET, KEY_LEN)
            val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv)
            val encryptData = cipher.doFinal(encryptStr.toByteArray(charset("UTF-8")))
            Base64.encodeToString(encryptData, Base64.NO_WRAP)
        } catch (e: Exception) {
            encryptStr
        }
    }

    /**
     * 解密
     * @param decryptStr 待解密字符串
     * @param decryptKey 解密密钥
     */
    fun decrypt(decryptStr: String, decryptKey: String = AES_KEY): String {
        return try {
            val secretKey = SecretKeySpec(decryptKey.toByteArray(charset("UTF-8")), "AES")
            val iv = IvParameterSpec(decryptKey.toByteArray(), OFFSET, KEY_LEN)
            val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
            cipher.init(Cipher.DECRYPT_MODE, secretKey, iv)
            val decryptData = cipher.doFinal(Base64.decode(decryptStr, Base64.NO_WRAP))
            String(decryptData, charset("UTF-8"))
        } catch (e: Exception) {
            decryptStr
        }
    }
}

DES加解密工具类

import javax.crypto.Cipher
import javax.crypto.SecretKeyFactory
import javax.crypto.spec.DESKeySpec
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec

object DESUtils {

    private val iv1 = byteArrayOf(18, 52, 86, 120, -112, -85, -51, -17)
    private const val DES_KEY = "PbNcUWRf"

    /**
     * 加密
     * @param encryptString 待加密字符串
     * @param encryptKey 加密密钥
     */
    fun encrypt(encryptString: String, encryptKey: String = DES_KEY): String {
        return try {
            val iv = IvParameterSpec(iv1)
            val dks = DESKeySpec(encryptKey.toByteArray())
            val keyFactory = SecretKeyFactory.getInstance("DES")
            val key = keyFactory.generateSecret(dks)
            val cipher = Cipher.getInstance("DES/CBC/PKCS5Padding")
            cipher.init(Cipher.ENCRYPT_MODE, key, iv)
            String(EncodeUtils.base64Encode(cipher.doFinal(encryptString.toByteArray(charset("UTF-8")))))
        } catch (var7: Exception) {
            encryptString
        }
    }

    /**
     * 解密
     * @param decryptString 待解密字符串
     * @param decryptKey 解密密钥
     */
    fun decrypt(decryptString: String, decryptKey: String = DES_KEY): String {
        return try {
            val iv = IvParameterSpec(iv1)
            val key = SecretKeySpec(decryptKey.toByteArray(charset("UTF-8")), "DES")
            val cipher = Cipher.getInstance("DES/CBC/PKCS5Padding")
            cipher.init(Cipher.DECRYPT_MODE, key, iv)
            String(cipher.doFinal(EncodeUtils.base64Decode(decryptString)))
        } catch (var7: Exception) {
            decryptString
        }
    }
}

MD5加密工具类

import java.io.File
import java.io.FileInputStream
import java.io.IOException
import java.math.BigInteger
import java.nio.channels.FileChannel
import java.security.MessageDigest

object MD5Utils {

    private val hexDigits =
        charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f')

    /**
     * MD5加密
     */
    fun String.md5(): String {
        val md5 = MessageDigest.getInstance("MD5")
        return BigInteger(1, md5.digest(toByteArray())).toString(16).padStart(32, '0')
    }

    /**
     * MD5加密
     */
    fun getMD5(str: String): String? {
        return try {
            val md5 = MessageDigest.getInstance("MD5")
            val byteArray = str.toByteArray(charset("UTF-8"))
            val md5Bytes = md5.digest(byteArray)
            val hexValue = StringBuffer()
            for (i in md5Bytes.indices) {
                val value = md5Bytes[i].toInt() and 0xff
                if (value < 16) hexValue.append("0")
                hexValue.append(Integer.toHexString(value))
            }
            hexValue.toString()
        } catch (e: Exception) {
            e.printStackTrace()
            null
        }
    }


    @Throws(IOException::class)
    fun getFileMD5String(file: File): String {
        var inputStream: FileInputStream? = null
        try {
            val messageDigest = MessageDigest.getInstance("MD5")
            inputStream = FileInputStream(file)
            val ch = inputStream.channel
            val byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length())
            messageDigest.update(byteBuffer)
            return bufferToHex(messageDigest.digest())
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            inputStream?.close()
        }
        return ""
    }

    @Throws(IOException::class)
    fun getFileMD5String(fileName: String): String {
        val f = File(fileName)
        return getFileMD5String(f)
    }

    private fun bufferToHex(bytes: ByteArray): String {
        return bufferToHex(bytes, 0, bytes.size)
    }

    private fun bufferToHex(bytes: ByteArray, m: Int, n: Int): String {
        val stringBuffer = StringBuffer(2 * n)
        val k = m + n
        for (l in m until k) {
            appendHexPair(bytes[l], stringBuffer)
        }
        return stringBuffer.toString()
    }

    private fun appendHexPair(bt: Byte, stringBuffer: StringBuffer) {
        val c0 = hexDigits[bt.toInt() and 0xf0 shr 4]
        val c1 = hexDigits[bt.toInt() and 0xf]
        stringBuffer.append(c0)
        stringBuffer.append(c1)
    }
}

RSA加解密工具类

import org.bouncycastle.util.encoders.Base64;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;

public class RSAUtil {

    public static final String serverPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtf6dGGDdc5ObUhvcXFQg" +
            "tRoCaYj425+eXWpqsnTVGL2tEaolGKw/cDME+nnMTKazFuhpaVk44HokdjQm8t12" +
            "7ep8G0wD8ewVO/GInZYRdNa8Hu2mtVB2eOVwzjpTGiW5xlV/gbzVZkpvYm4AJVZ3" +
            "Wr9CM/ORfhm7KCc2FJPx7SqQgBFaPqcIL3MqORqEiVrc2SdVhdluhN9D9P/2Zc1u" +
            "CvdNSN+eC9u2q+MtrdmMXBeTHPlhbZIH0hKuyYTyWcdlI0d3qbpy3d014CNQIajs" +
            "ylWWGD63vFWk9vWGlsVN6uoK5uomSqWq+1tmxlEI7EyeOKDJWOUsya7dXbYFktic" +
            "bwIDAQAB";
    public static final String serverPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC1/p0YYN1zk5tSG" +
            "9xcVCC1GgJpiPjbn55damqydNUYva0RqiUYrD9wMwT6ecxMprMW6GlpWTjgeiR2NCby" +
            "3Xbt6nwbTAPx7BU78YidlhF01rwe7aa1UHZ45XDOOlMaJbnGVX+BvNVmSm9ibgAlVnd" +
            "av0Iz85F+GbsoJzYUk/HtKpCAEVo+pwgvcyo5GoSJWtzZJ1WF2W6E30P0//ZlzW4K90" +
            "1I354L27ar4y2t2YxcF5Mc+WFtkgfSEq7JhPJZx2UjR3epunLd3TXgI1AhqOzKVZYYP" +
            "re8VaT29YaWxU3q6grm6iZKpar7W2bGUQjsTJ44oMlY5SzJrt1dtgWS2JxvAgMBAAEC" +
            "ggEAX7YRpBp9HCVKj/n6/8t2kAensRzJ06a0QGiQyF1NHH/UHvAeJkWf7z/FpHydhso" +
            "8cRW1KiQ0F0nlFw0CVsNFooWo0yo9AOOpnya9NDMR5yJvOMy+2agBRj9T/gEKZzvj4X" +
            "xhXDeU+wC2Z0t2ZCx/BIiFJpE3uNuLY+iLNnM/zfurTNkiZjACHbudkvl6pPSO4vWEk" +
            "gd56RBZwanOsXuuScxdLb/ojipQ/mvzNPnjEqvCXvfnRo4ADe1FeBZStN2+WCxou/nk" +
            "VmNSqlPSOcYiOT6DaCzG014rmJHpWm1/LcHX4DLcDrnr6zJyFKKpt7QINxwDvamudPa" +
            "z/hud6sfTkQKBgQDiVJANy4GbsfF5A+349e5a/BiSqN0S1OBFMB7okBsbvwMNVmhbcK" +
            "djXp0hCJ+barvUncPHRGb89ZhzZuue0/bUhwu/UJWEh3gcuXVCwEVK+qbStFo3OfmMY" +
            "ATrQudTfa28xCTmSbpdRsLtzZ3iCB2S43jIOpHM2EMH8ZeDWYIMgwKBgQDN2i8zDWok" +
            "S7qQKlJmLpt+2frIzwWCaTlPiWq6xQa3NkpUGtWS3lQi/Li8BO4t3/Ee16uQ0EALDg3" +
            "phdZJQ4cB+Jjx2ZPtR9qrY3LwcgoKTrgSl9cFV/DRwSHh0CeHgyOxXk4FJnkqhR2YdN" +
            "57Ypa0YGZj1XNEnphCL60aj7GEpQKBgFDCbdiOSkQdHZXZ4htY3eFXXQlP+fqTPSdTA" +
            "WRor1OaN+OVdo1SSFg71YOJCTKyxi0a0lYTQVB37hsXmXHGHqg9O+LbRU7R6/kL8ByO" +
            "cOtNPyOmOR7FsBb32Cl+aP6wtMLLloMZwccwzbN/EBwsWykjw+BmjcnzTQ/TlAXJdY8" +
            "zAoGBAKQ8r+vLiCPtR6w+F//ur6FFyRDuGzcxPMh4mu7ow7LpXeQ8hKnpOLexarKYPG" +
            "/dfENfT0L65B3t2Ku4XH+XoN+xuFU9gwiNi6mybsHoOpp+s94hxyw8PaccsCu6J8+2k" +
            "YOx+g2h5IpIKpS4qclHn3XKc+azJoRZBKHJ6BKJEtkBAoGALhI6Mzd3BGJ3YSVmSNKE" +
            "JFo5q5nA9tSG4RsyWTthoRHwwTcb70IfliKgrpLjq5Dy4hoD1cnpnXBqHDlMqtGSa6l" +
            "wPxozIWj0pTG/A1KHDj8j/4Z7c9x9VGVvmzY7Em+26qWZ9RJHdh2PP+pjwqDAK8ta0W" +
            "ZuLOFW+UwL8uUr0XU=";

    /**
     * 加密方法 source: 源数据
     */
    public static String encrypt(String source)
            throws Exception {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decode(serverPublicKey.getBytes()));
        PublicKey key = keyFactory.generatePublic(x509KeySpec);

        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return new String(Base64.encode(cipher.doFinal(source.getBytes())));

    }

    /**
     * 解密算法 cryptograph:密文
     */
    public static String decrypt(String cryptograph, String privateKey)
            throws Exception {
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA")
                .generatePrivate(new PKCS8EncodedKeySpec(Base64.decode(privateKey)));
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, priKey);
        return new String(cipher.doFinal(Base64.decode(cryptograph.getBytes())));
    }


    /**
     * 得到公钥
     *
     * @param key 密钥字符串(经过base64编码)
     * @throws Exception
     */
    public static PublicKey getPublicKey(String key) throws Exception {
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(
                Base64.decode(key.getBytes()));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(keySpec);
        return publicKey;
    }

    /**
     * 得到私钥
     *
     * @param key 密钥字符串(经过base64编码)
     * @throws Exception
     */
    public static PrivateKey getPrivateKey(String key) throws Exception {
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(
                Base64.decode(key.getBytes()));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
        return privateKey;
    }
}

证书指纹获取

import android.content.Context
import android.content.pm.PackageManager
import android.content.pm.Signature
import java.security.MessageDigest

object SignatureHelper {

    fun getSignatureStr(context: Context): String? {
        val signature: Signature = getSignature(context) ?: return ""
        val cert = signature.toByteArray()
        return try {
            val md5 = MessageDigest.getInstance("MD5")
            val sha1 = MessageDigest.getInstance("SHA1")
            val sha256 = MessageDigest.getInstance("SHA256")
            val md5Key = md5.digest(cert)
            val sha1Key = sha1.digest(cert)
            val sha256Key = sha256.digest(cert)
            String.format(
                "MD5: %s\n\nSHA1: %s\n\nSHA-256: %s",
                byteArrayToString(md5Key),
                byteArrayToString(sha1Key),
                byteArrayToString(sha256Key)
            )
        } catch (e: Exception) {
            ""
        }
    }

    @Suppress("DEPRECATION")
    private fun getSignature(argContext: Context): Signature? {
        var signature: Signature? = null
        try {
            val packageName = argContext.packageName
            val packageManager = argContext.packageManager
            val packageInfo =
                packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
            val signatures = packageInfo.signatures
            signature = signatures[0]
        } catch (e: PackageManager.NameNotFoundException) {
            e.printStackTrace()
        }
        return signature
    }

    // 解析签名信息
    private fun byteArrayToString(array: ByteArray): String {
        var hexString = StringBuilder()
        for(i in array.indices) {
            val byte = array[i]
            val hex = Integer.toHexString(0xFF and byte.toInt())
            if (hex.length == 1) {
                hexString.append('0')
            }
            hexString.append(hex)
            if (i < array.size - 1) {
                hexString.append(':')
            }
        }
        return hexString.toString()
    }
}