各类加密算法-Java版

在APP的网络协议中,这些对称加密和非对称加密算法常会用在APP和服务器的交互数据中request和response(部分可能会用在数据的签名),识别这些算法是非常重要的,这里给出整理好的Java版(smali层)加密算法,C/C++(so层)也类似,主要就是识别这两行

Cipher.getInstance("AES/CBC/PKCS5Padding")
cipher.init(Cipher.DECRYPT_MODE, keySpec, iv)

Java版AES算法

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

/*******************************************************************************
 * AES加解密算法
 * http://tools.lami.la/jiami/aes
 * 说明:AES数据块长度为128位,所以IV长度需要为16个字符(ECB模式不用IV),密钥根据指定密钥位数分别为16、24、32个字符,IV与密钥超过长度则截取,不足则在末尾填充'\0'补足
 *******************************************************************************/


public class AES {

    // AES加密 Base64输出
    public static String Encrypt2Base64(String PlainText, String Key, String IV, String Mode) throws Exception {
        byte[] key = Key.getBytes();
        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance(Mode); // "算法/模式/补码方式"

        StringBuffer ivbuffer = new StringBuffer(16);
        ivbuffer.append(IV);
        while (ivbuffer.length() < 16) {  // IV不足则在末尾填充'\0'补足
            ivbuffer.append("\0");
        }
        if (ivbuffer.length() > 16) {    // IV超过长度则截取
            ivbuffer.setLength(16);
        }

        IvParameterSpec iv = new IvParameterSpec(ivbuffer.toString().getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
        byte[] encrypted = cipher.doFinal(PlainText.getBytes());
        // 原始加密数据
        // for (int i = 0; i < encrypted.length; i++) {
        //     System.out.printf("0x%02X ", encrypted[i]);
        // }
        return Base64.getEncoder().encodeToString(encrypted);
    }

    // AES解密 Base64输入
    public static String DecryptFromBase64(String ciphertext, String Key, String IV, String Mode) throws Exception {
        byte[] key = Key.getBytes();
        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance(Mode);

        StringBuffer ivbuffer = new StringBuffer(16);
        ivbuffer.append(IV);
        while (ivbuffer.length() < 16) {
            ivbuffer.append("\0");
        }
        if (ivbuffer.length() > 16) {
            ivbuffer.setLength(16);
        }

        IvParameterSpec iv = new IvParameterSpec(ivbuffer.toString().getBytes());
        cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
        byte[] encrypted1 = Base64.getDecoder().decode(ciphertext);    // 先用base64解密
        try {
            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original);
            return originalString;
        } catch (Exception e) {
            System.out.println(e);
            return null;
        }
    }


    // AES byte数组输入
    public static String DecryptFromByte(byte[] Src, String Key, String Mode) throws Exception {

        byte[] key = Key.getBytes("ASCII");
        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance(Mode);

        cipher.init(Cipher.DECRYPT_MODE, keySpec);
        byte[] encrypted1 = Src;
        try {
            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original);
            return originalString;
        } catch (Exception e) {
            System.out.println(e);
            return null;
        }
    }

    public static void main(String[] args) throws Exception {

        String Key = "DATA_KEY20150116";
        // 需要加密的字串
        String plaintext = "{\"data\":{\"page\":1,\"pageSize\":100},\"device\":\"android\",\"imei\":\"867514021468675\",\"mac\":\"\",\"token\":\"\",\"versionId\":\"4.2.9\"}";
        System.out.println(plaintext);
        // 加密
        String ciphertext = AES.Encrypt2Base64(plaintext, Key, "20150116", "AES/CBC/PKCS5Padding");
        System.out.println("加密后的字串是:" + ciphertext);
        // 解密
        String plaintext2 = AES.DecryptFromBase64(ciphertext, Key, "20150116", "AES/CBC/PKCS5Padding");
        System.out.println("解密后的字串是:" + plaintext2);


        // 2018全国网络空间安全技术大赛 mobile3 解密
        byte[] cipher = new byte[]{(byte) 0x46, (byte) 0x00, (byte) 0x94, (byte) 0x74, (byte) 0x1F, (byte) 0xAB, (byte) 0x14, (byte) 0xF0, (byte) 0xB2, (byte) 0x59, (byte) 0xA9, (byte) 0x19, (byte) 0xC0, (byte) 0x43, (byte) 0xDC, (byte) 0xC3};
        Key = "com.example.forc";
        String flag = AES.DecryptFromByte(cipher, Key, "AES/ECB/NoPadding");
        System.out.println("flag是:" + flag);    // Xgd-aNdr1d-cTf2     不足16位补'\0'
    }
}

Java版DES算法

import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;

public class DES {

    // The initialization vector(IV) should be 8 bytes
    private final static byte[] EncryptionIV = new byte[]{18, 52, 86, 120, -112, -85, -51, -17};    // 初始化向量
    private final static byte[] key = new byte[]{88, 81, -114, 39, -127, -23, 64, 0};

    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException {
        String plainText = "{\"data\":{\"activityIds\":\"\",\"longitude\":116.356247,\"latitude\":23.964974},\"clientInfo\":\"23000,yingyongbao,1,44400\",\"token\":\"\",\"version\":1}";

        DESKeySpec keySpec = new DESKeySpec(key);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(keySpec);   // 密钥生成器产生真正的DES密钥
        IvParameterSpec iv = new IvParameterSpec(EncryptionIV);
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        byte[] cipherData = cipher.doFinal(plainText.getBytes());
        System.out.println("DES加密:" + Base64.getEncoder().encodeToString(cipherData));

        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        byte[] plainData = cipher.doFinal(cipherData);
        System.out.println("DES解密:" + new String(plainData));

        byte[] ReturnData = Base64.getDecoder().decode("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");
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        byte[] ReturnData2 = cipher.doFinal(ReturnData);
        System.out.println("服务器的数据解密:" + new String(ReturnData2));


        /*******************************************************************************
         3DES加密:http://tools.lami.la/jiami/des3
         ******************************************************************************/
        IvParameterSpec iv3 = new IvParameterSpec("F15A9613".getBytes());   // IV长度需要为8个字符,IV与密钥超过长度则截取,不足则在末尾填充'\0'补足
        DESedeKeySpec keySpec3 = new DESedeKeySpec("750DB8A48693A8CD58654478".getBytes());  // 密钥长度为16或24个字符
        SecretKeyFactory keyFactory3 = SecretKeyFactory.getInstance("desede");
        SecretKey v0 = keyFactory3.generateSecret(keySpec3);
        Cipher v1 = Cipher.getInstance("desede/CBC/PKCS5Padding");
        v1.init(1, v0, iv3);
        System.out.println("3DES加密:" + Base64.getEncoder().encodeToString(v1.doFinal("103.0".getBytes("utf-8"))));
    }

}

Java版RSA算法

import java.security.Key;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import javax.crypto.Cipher;
import java.math.BigInteger;
import java.security.spec.RSAPublicKeySpec;
import java.net.URLEncoder;


/**
 * 1、公钥加密,私钥解密用于信息加密
 * 2、私钥加密,公钥解密用于数字签名
 */
public class RSA {
    /**
     * 测试方法
     *
     * @throws InvalidKeySpecException
     * @throws NoSuchAlgorithmException
     */
    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException {

        String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLNbmKl9/gLn7Bef/xtUkshC1WyrLZLRpXCcFYR1gQi0isWsZBTicC4efBOkkNG3r+1ue0gvtuU/tjREFGf4Y7HaKHGb5tNCOlMNeNjM5YLRwLFqrUSsQyD4rj4eua1ltearr24R0HilnTvnQm6Z/UY0s21vdOUFQBPY0GNAa+0wIDAQAB";
        String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIs1uYqX3+AufsF5//G1SSyELVbKstktGlcJwVhHWBCLSKxaxkFOJwLh58E6SQ0bev7W57SC+25T+2NEQUZ/hjsdoocZvm00I6Uw142MzlgtHAsWqtRKxDIPiuPh65rWW15quvbhHQeKWdO+dCbpn9RjSzbW905QVAE9jQY0Br7TAgMBAAECgYBcYhbzpr5no/Nyqmf0G/6nkEAWbQYrogbs5AhvcUk8EXL1DnirNhYlj42hafC4xhflrvCtlo8NNKaLxewbwN1uuzG8A2jd+ROEXlx5HDh2ZluhtHzL/SmNcJXo684xAl2pCNVBjDcW48PcIBijke/sTVHTDsDCukLKDPUOM/mKIQJBAL96k4+jBscazsJiuZ6C3RFDVtRRDpf1dMgLgxcx63bAXkA2Arau0J49IAYmSVJoDXqDoJKWdXJVh9vHSkhN/48CQQC6Hk1/G0Y0nOylf6NOp0oMgc0A+etnwxHKqwtctPKjEYcJx2fzALzTtCoySLYXX7gLnPIQXpQBTUysG5skBKp9AkEAiSQm6fqu0Q4fRlRlc+VwpnufhgPkOuw/z0OHiaZkajJPjxfgC63bl2paNG1ZmJ8UAEqkSDlhNxmRa9UqG+1ZewJASaQxz6gwCCNLM1SkfjuM/hPh1JAOh9jUUleJQF5MXx9RSho/VBQnorB3vbutaOQzw0yPLtDtSPKX8sVdhkveVQJAIDsJP5X8Tey6zXTUISor7PF0TSiKdE4k0IwKoy9y8HmQ+AU8+xyr/iOt5lvaGxKlBK8N/7yCw5H4qHnJaHT+Bg==";

        String str = "RSA_By_Java!";
        // 公钥加密,私钥解密
        String enStr1 = RSA.encryptByPublic(str, publicKey);
        System.out.println("公钥加密后:" + enStr1);
        String deStr1 = RSA.decryptByPrivate(enStr1, privateKey);
        System.out.println("私钥解密后:" + deStr1);
        // 私钥加密,公钥解密
        String enStr2 = RSA.encryptByPrivate(str, privateKey);
        System.out.println("私钥加密后:" + enStr2);
        String deStr2 = RSA.decryptByPublic(enStr2, publicKey);
        System.out.println("公钥解密后:" + deStr2);
        // 产生签名  
        String sign = sign(enStr2, privateKey);
        System.out.println("签名:" + sign);
        // 验证签名 
        boolean status = verify(enStr2, publicKey, sign);
        System.out.println("状态:" + status);
    }


    /**
     * 公钥加密
     *
     * @param encryptingStr
     * @param publicKeyStr
     * @return
     */
    public static String encryptByPublic(String encryptingStr, String publicKeyStr) {
        try {
            // 将公钥由字符串转为UTF-8格式的字节数组
            byte[] publicKeyBytes = decryptBase64(publicKeyStr);
            // 获得公钥  
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
            // 取得待加密数据
            byte[] data = encryptingStr.getBytes("UTF-8");
            KeyFactory factory;
            factory = KeyFactory.getInstance("RSA");
            PublicKey publicKey = factory.generatePublic(keySpec);
            // 对数据加密  
            Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            // 返回加密后由Base64编码的加密信息
            return encryptBase64(cipher.doFinal(data));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 私钥解密
     *
     * @param encryptedStr
     * @param privateKeyStr
     * @return
     */
    public static String decryptByPrivate(String encryptedStr, String privateKeyStr) {
        try {
            // 对私钥解密  
            byte[] privateKeyBytes = decryptBase64(privateKeyStr);
            // 获得私钥 
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
            // 获得待解密数据
            byte[] data = decryptBase64(encryptedStr);
            KeyFactory factory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = factory.generatePrivate(keySpec);
            // 对数据解密
            Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            // 返回UTF-8编码的解密信息
            return new String(cipher.doFinal(data), "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 私钥加密
     *
     * @param encryptingStr
     * @param privateKeyStr
     * @return
     */
    public static String encryptByPrivate(String encryptingStr, String privateKeyStr) {
        try {
            byte[] privateKeyBytes = decryptBase64(privateKeyStr);
            // 获得私钥  
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
            // 取得待加密数据
            byte[] data = encryptingStr.getBytes("UTF-8");
            KeyFactory factory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = factory.generatePrivate(keySpec);
            // 对数据加密 
            Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
            // 返回加密后由Base64编码的加密信息
            return encryptBase64(cipher.doFinal(data));
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 公钥解密
     *
     * @param encryptedStr
     * @param publicKeyStr
     * @return
     */
    public static String decryptByPublic(String encryptedStr, String publicKeyStr) {
        try {
            // 对公钥解密  
            byte[] publicKeyBytes = decryptBase64(publicKeyStr);
            // 取得公钥  
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
            // 取得待加密数据
            byte[] data = decryptBase64(encryptedStr);
            KeyFactory factory = KeyFactory.getInstance("RSA");
            PublicKey publicKey = factory.generatePublic(keySpec);
            // 对数据解密  
            Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
            cipher.init(Cipher.DECRYPT_MODE, publicKey);
            // 返回UTF-8编码的解密信息
            return new String(cipher.doFinal(data), "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 用私钥对加密数据进行签名
     *
     * @param encryptedStr
     * @param privateKey
     * @return
     */
    public static String sign(String encryptedStr, String privateKey) {
        String str = "";
        try {
            //将私钥加密数据字符串转换为字节数组
            byte[] data = encryptedStr.getBytes();
            // 解密由base64编码的私钥  
            byte[] bytes = decryptBase64(privateKey);
            // 构造PKCS8EncodedKeySpec对象  
            PKCS8EncodedKeySpec pkcs = new PKCS8EncodedKeySpec(bytes);
            // 指定的加密算法  
            KeyFactory factory = KeyFactory.getInstance("RSA");
            // 取私钥对象  
            PrivateKey key = factory.generatePrivate(pkcs);
            // 用私钥对信息生成数字签名  
            Signature signature = Signature.getInstance("SHA1withRSA");
            signature.initSign(key);
            signature.update(data);
            str = encryptBase64(signature.sign());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return str;
    }

    /**
     * 校验数字签名
     *
     * @param encryptedStr
     * @param publicKey
     * @param sign
     * @return 校验成功返回true,失败返回false
     */
    public static boolean verify(String encryptedStr, String publicKey, String sign) {
        boolean flag = false;
        try {
            //将私钥加密数据字符串转换为字节数组
            byte[] data = encryptedStr.getBytes();
            // 解密由base64编码的公钥  
            byte[] bytes = decryptBase64(publicKey);
            // 构造X509EncodedKeySpec对象  
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
            // 指定的加密算法  
            KeyFactory factory = KeyFactory.getInstance("RSA");
            // 取公钥对象  
            PublicKey key = factory.generatePublic(keySpec);
            // 用公钥验证数字签名  
            Signature signature = Signature.getInstance("SHA1withRSA");
            signature.initVerify(key);
            signature.update(data);
            flag = signature.verify(decryptBase64(sign));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * BASE64 解码
     *
     * @param key 需要Base64解码的字符串
     * @return 字节数组
     */
    public static byte[] decryptBase64(String key) {
        return Base64.getDecoder().decode(key);
    }

    /**
     * BASE64 编码
     *
     * @param key 需要Base64编码的字节数组
     * @return 字符串
     */
    public static String encryptBase64(byte[] key) {
        return new String(Base64.getEncoder().encode(key));
    }

}