⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rijndael_util.java

📁 用JAVA编写的rijndael工具
💻 JAVA
字号:
package mit.Rijndael;

import java.security.InvalidKeyException;

/**
 * 这个类用于方便对数据使用AES算法对数据进行加密。AES算法只能一块一块对数据进行加密。
 * 
 * @author szuJobs
 * 
 */
public class Rijndael_Util {
	private static final int DEFAULT_BLOCK_SIZE = 16;

	/**
	 * 将4个byte组装成一个整数
	 * 
	 * @param bytes
	 * @param offSet
	 * @return
	 */
	public final static int getInt(byte[] bytes, int offSet) {
		return ((((bytes[offSet + 0] & 0xff) << 24)
				| ((bytes[offSet + 1]) << 16)
				| ((bytes[offSet + 2] & 0xff) << 8) | ((bytes[offSet + 3] & 0xff) << 0)));
	}

	/**
	 * 将一个整数拆为4个byte
	 * 
	 * @param val
	 * @param bytes
	 * @param offSet
	 */
	public final static void putInt(int val, byte[] bytes, int offSet) {
		bytes[offSet] = (byte) (val >> 24);
		bytes[offSet + 1] = (byte) (val >> 16);
		bytes[offSet + 2] = (byte) (val >> 8);
		bytes[offSet + 3] = (byte) val;
	}

	public static String byte2String(byte[] bytes) {
		StringBuffer buff = new StringBuffer();
		for (int i = 0; i < bytes.length; ++i) {
			if (i != 0) {
				buff.append(", ");
			}
			buff.append(bytes[i]);
		}
		return buff.toString();
	}

	public static byte[] make_kb_16(String strKey) {
		return make_kb(strKey, 16);
	}

	public static byte[] make_kb_24(String strKey) {
		return make_kb(strKey, 24);
	}

	public static byte[] make_kb_32(String strKey) {
		return make_kb(strKey, 32);
	}

	private static byte[] make_kb(String strKey, int size) {
		byte[] kb = new byte[size];
		byte[] bytes = strKey.getBytes();
		System.arraycopy(bytes, 0, kb, 0, bytes.length > size ? size
				: bytes.length);
		return kb;
	}

	public static String encode(String key, String strData)
			throws InvalidKeyException {
		byte[] kb = make_kb_32(key);
		byte[] pt = strData.getBytes();
		byte[] ct = encode(kb, pt, DEFAULT_BLOCK_SIZE);
		return Base64.encode(ct);
	}

	public static String encode(String key, String strData, int blockSize)
			throws InvalidKeyException {
		byte[] kb = make_kb_32(key);
		byte[] pt = strData.getBytes();
		byte[] ct = encode(kb, pt, blockSize);
		return Base64.encode(ct);
	}

	public static String decode(String key, String strData)
			throws InvalidKeyException {
		byte[] kb = make_kb_32(key);
		byte[] ct = Base64.decode(strData);
		byte[] cpt = decode(kb, ct, DEFAULT_BLOCK_SIZE);
		return new String(cpt);
	}

	public static String decode(String key, String strData, int blockSize)
			throws InvalidKeyException {
		byte[] kb = make_kb_32(key);
		byte[] ct = Base64.decode(strData);
		byte[] cpt = decode(kb, ct, blockSize);
		return new String(cpt);
	}

	public static byte[] encode(byte[] kb, byte[] pt, int blockSize)
			throws InvalidKeyException {
		Object key = Rijndael_Algorithm.makeKey(kb, blockSize);

		int dataLength = pt.length;

		int mode = dataLength % blockSize;

		byte[] ct = new byte[mode == 0 ? pt.length : 8 + dataLength + blockSize
				- mode];

		for (int i = 0; i < dataLength; i += blockSize) {
			int restDataLength = dataLength - i;

			if (restDataLength >= blockSize) {
				byte[] block_ct = Rijndael_Algorithm.blockEncrypt(pt, i, key,
						blockSize);
				System.arraycopy(block_ct, 0, ct, i, blockSize);
			} else {
				if (blockSize == 16 || blockSize == 24) {
					Object last_block_key = Rijndael_Algorithm.makeKey(kb,
							blockSize + 8);
					byte[] block_pt = new byte[blockSize + 8];
					System.arraycopy(pt, i, block_pt, 0, restDataLength);
					putInt(dataLength, block_pt, blockSize);

					byte[] block_ct = Rijndael_Algorithm.blockEncrypt(block_pt,
							0, last_block_key, blockSize + 8);

					System.arraycopy(block_ct, 0, ct, i, blockSize + 8);
				} else { // 32
					Object key_16 = Rijndael_Algorithm.makeKey(kb, 16);
					byte[] block_24_pt = new byte[24];
					if (restDataLength > 16) {
						byte[] block_16_ct = Rijndael_Algorithm.blockEncrypt(
								pt, i, key_16, 16);
						restDataLength -= 16;
						System.arraycopy(block_16_ct, 0, ct, i, 16);

						System.arraycopy(pt, i + 16, block_24_pt, 0,
								restDataLength);
					} else {
						byte[] block_pt = new byte[16];
						System.arraycopy(pt, i, block_pt, 0, restDataLength);

						byte[] block_16_ct = Rijndael_Algorithm.blockEncrypt(
								block_pt, 0, key_16, 16);
						System.arraycopy(block_16_ct, 0, ct, i, 16);
					}

					Object key_24 = Rijndael_Algorithm.makeKey(kb, 24);

					putInt(dataLength, block_24_pt, 16);

					byte[] block_24_ct = Rijndael_Algorithm.blockEncrypt(
							block_24_pt, 0, key_24, 24);
					System.arraycopy(block_24_ct, 0, ct, i + 16, 24);
				}
			}
		}

		return ct;
	}

	public static byte[] decode(byte[] kb, byte[] ct, int blockSize)
			throws InvalidKeyException {

		int mode = ct.length % blockSize;

		Object key = Rijndael_Algorithm.makeKey(kb, blockSize);

		byte[] pt;
		if (mode == 0) {
			pt = new byte[ct.length];

			for (int i = 0; i < ct.length; i += blockSize) {
				byte[] block_pt = Rijndael_Algorithm.blockDecrypt(ct, i, key,
						blockSize);

				System.arraycopy(block_pt, 0, pt, i, blockSize);
			}
		} else {
			if (blockSize == 16 || blockSize == 24) {
				Object first_key = Rijndael_Algorithm
						.makeKey(kb, blockSize + 8);
				byte[] last_block_pt = Rijndael_Algorithm.blockDecrypt(ct,
						ct.length - blockSize - 8, first_key, blockSize + 8);

				int dataLength = getInt(last_block_pt, blockSize);

				pt = new byte[dataLength];
				System.arraycopy(last_block_pt, 0, pt, ct.length - blockSize
						- 8, dataLength % blockSize);
			} else { // 32
				Object key_24 = Rijndael_Algorithm.makeKey(kb, 24);
				byte[] last_block_24_pt = Rijndael_Algorithm.blockDecrypt(ct,
						ct.length - 24, key_24, 24);

				int dataLength = getInt(last_block_24_pt, 16);
				pt = new byte[dataLength];

				if (dataLength > ct.length - 24) {
					System.arraycopy(last_block_24_pt, 0, pt, ct.length - 24,
							dataLength - (ct.length - 24));
				}

				Object key_16 = Rijndael_Algorithm.makeKey(kb, 16);
				byte[] last_block_16_pt = Rijndael_Algorithm.blockDecrypt(ct,
						ct.length - 24 - 16, key_16, 16);
				if (pt.length > ct.length - 24) {
					System.arraycopy(last_block_16_pt, 0, pt,
							ct.length - 24 - 16, 16);
				} else {
					System.arraycopy(last_block_16_pt, 0, pt,
							ct.length - 24 - 16, pt.length
									- (ct.length - 24 - 16));
				}
			}

			for (int i = 0; i < ct.length - blockSize - 8; i += blockSize) {
				byte[] block_pt = Rijndael_Algorithm.blockDecrypt(ct, i, key,
						blockSize);
				System.arraycopy(block_pt, 0, pt, i, blockSize);
			}
		}

		return pt;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -