You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
4.2 KiB
91 lines
4.2 KiB
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();
|
|
}
|
|
}
|
|
|