package com.github.catvod.utils; import android.util.Base64; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.security.KeyFactory; import java.security.MessageDigest; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class Crypto { public static String md5(String src) { return md5(src, "UTF-8"); } public static String md5(String src, String charset) { try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] messageDigest = md.digest(src.getBytes(charset)); BigInteger no = new BigInteger(1, messageDigest); StringBuilder sb = new StringBuilder(no.toString(16)); while (sb.length() < 32) sb.insert(0, "0"); return sb.toString().toLowerCase(); } catch (Exception e) { return ""; } } public static String CBC(String src, String KEY, String IV) { try { src = src.replace("\\", ""); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES"); AlgorithmParameterSpec paramSpec = new IvParameterSpec(IV.getBytes()); cipher.init(Cipher.DECRYPT_MODE, keySpec, paramSpec); byte[] decrypted = cipher.doFinal(Base64.decode(src, Base64.DEFAULT)); return new String(decrypted); } catch (Exception ignored) { return ""; } } public static String aesEncrypt(String data, String key, String iv) throws Exception { SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"); IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8)); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); return Base64.encodeToString(encrypted, Base64.NO_PADDING); } public static String rsaEncrypt(String data, String publicKeyPem) throws Exception { String publicKeyPEM = publicKeyPem.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "").replaceAll("\\s+", ""); byte[] decoded = Base64.decode(publicKeyPEM, Base64.DEFAULT); X509EncodedKeySpec spec = new X509EncodedKeySpec(decoded); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(spec); Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); return Base64.encodeToString(encrypted, Base64.DEFAULT); } public static String rsaDecrypt(String encryptedKey, String privateKeyPem) throws Exception { String privateKeyPEM = privateKeyPem.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "").replaceAll("\\s", ""); byte[] privateKeyBytes = Base64.decode(privateKeyPEM, Base64.DEFAULT); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decrypted = cipher.doFinal(Base64.decode(encryptedKey, Base64.DEFAULT)); return new String(decrypted, StandardCharsets.UTF_8); } public static String randomKey(int size) { StringBuilder key = new StringBuilder(); String keys = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; for (int i = 0; i < size; i++) key.append(keys.charAt((int) Math.floor(Math.random() * keys.length()))); return key.toString(); } }