zoukankan      html  css  js  c++  java
  • 逆向DES算法

    该文章配合参考里面的链接使用哦~

    一、正文

    DES对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接受者在进行信息的传输和处理时,必须共同持有该密码,称为对称密码,是一种对称加密算法,全称是Des Symmetric Encryption。

    下面展示一个比较简单的加解密的例子。

    import java.util.Base64;
    
    import javax.crypto.Cipher;
    
    import javax.crypto.spec.SecretKeySpec;
    
    public class DES {
    	// 算法的模式:DES、3DES、AES、RC
    	public static final String MODE_ALGORITHM = "DES";
    	// 编码格式
    	public static final String CHARSET = "UTF-8";
    	// 明文
    	public static final String TEXT = "abcde";
    	// 原始密钥
    	public static final String KEY = "ST83=@XV";
    
    	/**
    	 * Base64编码
    	 * 
    	 * @param bytes
    	 * @return String
    	 */
    	public static String Base64Encrypt(byte[] bytes) {
    		return Base64.getEncoder().encodeToString(bytes);
    	}
    
    	/**
    	 * Base64解码
    	 * 
    	 * @param bytes
    	 * @return byte[]
    	 */
    	public static byte[] Base64Decrypt(byte[] bytes) {
    		return Base64.getDecoder().decode(bytes);
    	}
    
    /**
    	 * DES加密
    	 * 
    	 * @param text
    	 * @param key
    	 * @param charset
    	 * @return String 经过Base64编码后的内容
    	 * @throws Exception
    	 */
    	public static String DESEncrypt(String text, String key, String charset) throws Exception {
    		// 通过给定的字节数组构建一个密钥
    		SecretKeySpec sks = new SecretKeySpec(key.getBytes(charset), MODE_ALGORITHM);
    		// 1.获取加解密的算法工具类
    		Cipher cipher = Cipher.getInstance(MODE_ALGORITHM);
    		// 2.对工具类进行初始化
    		cipher.init(Cipher.ENCRYPT_MODE, sks);
    		// 3.用加密工具类对象对明文进行加密
    		byte[] doFinal = cipher.doFinal(text.getBytes(charset));
    		// 防止出现乱码,所以采用Base64编码
    		return Base64Encrypt(doFinal);
    
    	}
    
    	/**
    	 * DES解密
    	 * 
    	 * @param text
    	 * @param key
    	 * @param charset
    	 * @return String
    	 * @throws Exception
    	 */
    	public static String DESDecrypt(byte[] text, String key, String charset) throws Exception {
    		//先进行Base64解码
    		text = Base64Decrypt(text);
    		// 通过给定的字节数组构建一个密钥
    		SecretKeySpec sks = new SecretKeySpec(key.getBytes(charset), MODE_ALGORITHM);
    		// 1.获取加解密的算法工具类
    		Cipher cipher = Cipher.getInstance(MODE_ALGORITHM);
    		// 2.对工具类进行初始化
    		cipher.init(Cipher.DECRYPT_MODE, sks);
    		// 3.用加密工具类对象对明文进行解密
    		return new String(cipher.doFinal(text));
    	}
    	public static void main(String[] args) {
    		System.out.println("明    文:" + TEXT);
    		try {
    			String desEncrypt = DESEncrypt(TEXT, KEY, CHARSET);
    			System.out.println("加密后:" + desEncrypt);
    			System.out.println("解密后:" + DESDecrypt(desEncrypt.getBytes(CHARSET), KEY, CHARSET));
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    	}
    }
    

    输出结果:

    明 文:abcde
    加密后:Gq2d+EeoY7A=
    解密后:abcde

    通过这个例子,我们再结合参考的文章中的反编译所获取到的内容,来实现加解密算法。

    import java.util.Base64;
    import java.util.UUID;
    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import net.sf.json.JSONObject;
    
    public class CpdailyExtension {
    	// 算法的模式:DES、3DES、AES、RC
    	private static final String MODE_ALGORITHM = "DES";
    	// 算法的标准转化名称
    	private static final String NAME = "DES/CBC/PKCS5Padding";
    	// 编码格式
    	private static final String CHARSET = "UTF-8";
    	// 明文
    	private static final String TEXT = "abcde";
    	// 原始密钥
    	private static final String KEY = "ST83=@XV";
    	// 初始化向量,简称IV
    	private static byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };
    
    	/**
    	 * Base64编码
    	 * 
    	 * @param bytes
    	 * @return String
    	 */
    	public static String Base64Encrypt(byte[] bytes) {
    		return Base64.getEncoder().encodeToString(bytes);
    	}
    
    	/**
    	 * Base64解码
    	 * 
    	 * @param bytes
    	 * @return byte[]
    	 */
    	public static byte[] Base64Decrypt(byte[] bytes) {
    		return Base64.getDecoder().decode(bytes);
    	}
    
    	/**
    	 * DES加密
    	 * 
    	 * @param text
    	 * @param key
    	 * @param charset
    	 * @return String 经过Base64编码后的内容
    	 * @throws Exception
    	 */
    	public static String DESEncrypt(String text, String key, String charset) throws Exception {
    		// 通过给定的字节数组构建一个密钥
    		SecretKeySpec sks = new SecretKeySpec(key.getBytes(charset), MODE_ALGORITHM);
    		// 使用IV构造对象
    		IvParameterSpec ivPS = new IvParameterSpec(iv);
    		// 1.获取加解密的算法工具类
    		Cipher cipher = Cipher.getInstance(NAME);
    		// 2.对工具类进行初始化
    		cipher.init(Cipher.ENCRYPT_MODE, sks, ivPS);
    		// 3.用加密工具类对象对明文进行加密
    		byte[] doFinal = cipher.doFinal(text.getBytes(charset));
    		// 防止出现乱码,所以采用Base64编码
    		return Base64Encrypt(doFinal);
    
    	}
    
    	/**
    	 * DES解密
    	 * 
    	 * @param text
    	 * @param key
    	 * @param charset
    	 * @return String
    	 * @throws Exception
    	 */
    	public static String DESDecrypt(byte[] text, String key, String charset) throws Exception {
    		// 先进行Base64解码
    		text = Base64Decrypt(text);
    		// 通过给定的字节数组构建一个密钥
    		SecretKeySpec sks = new SecretKeySpec(key.getBytes(charset), MODE_ALGORITHM);
    		// 使用IV构造对象
    		IvParameterSpec ivPS = new IvParameterSpec(iv);
    		// 1.获取加解密的算法工具类
    		Cipher cipher = Cipher.getInstance(NAME);
    		// 2.对工具类进行初始化
    		cipher.init(Cipher.DECRYPT_MODE, sks, ivPS);
    		// 3.用加密工具类对象对明文进行解密
    		return new String(cipher.doFinal(text));
    	}
    	/**
    	 * 生成CpdailyExtension
    	 * @param id
    	 * @return String
    	 */
    	public static String generateCpdailyExtension(String id) {
    		JSONObject object = new JSONObject();
    		object.put("systemName", "android");
    		object.put("systemVersion", "11");
    		object.put("model", "MI 11");
    		object.put("deviceId", UUID.randomUUID().toString());
    		object.put("appVersion", "8.1.11");
    		//清华大学水木年华的经纬度
    		object.put("lon", 116.32284422133253);
    		object.put("lat", 40.00301874717021);
    		//学号
    		object.put("userId", id);
    		try {
    			return DESEncrypt(object.toString(), KEY, CHARSET);
    		} catch (Exception e) {
    			e.printStackTrace();
    			return null;
    		}
    	}
    	public static void main(String[] args) {
    		System.out.println(generateCpdailyExtension("5201314"));
    	}
    }
    

    以上,就完成了一个通过学号生成CpdailyExtension的工具类

    二、参考

    1. 逆向破解今日校园app加密值
  • 相关阅读:
    Android studio关于点击事件后的页面跳转,选择完成后返回(onActivityResult)
    关于Android对话框简单实用方法总结
    Eclipse键盘输出文字,显示到屏幕上方法
    indexOf实际试用方法
    LiteOS裸机驱动移植01-以LED为例说明驱动移植
    LiteOS内核教程06-内存管理
    LiteOS内核教程05-互斥锁
    LiteOS内核教程04-信号量
    LiteOS内核教程03-任务管理
    LiteOS内核教程02-HelloWorld
  • 原文地址:https://www.cnblogs.com/meethigher/p/14224709.html
Copyright © 2011-2022 走看看