`
Jatula
  • 浏览: 276711 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java对称加密编码:IDEA

阅读更多
package cn.lake.util;

/**
 * Java对称加密编码:IDEA
 * 
 * @author lake_xie
 * 
 */
class IDEADemo {

	/* 源数据 */
	private byte m_string[];
	/* 目标数据 */
	private byte c_string[];
	/* 密钥 */
	private byte k_string[];
	/* 数据块 1, 2, 3, 4 */
	private char X1, X2, X3, X4;
	/* 加密子密钥 */
	private char Z[];
	/* 解密子密钥 */
	private char Z_1[];
	/*   */
	private char temp1, temp2, temp3, temp4, temp5;
	private char temp6, temp7, temp8, temp9, temp10;

	/* 初始化 */
	IDEADemo() {
		m_string = new byte[8];
		c_string = new byte[8];
		k_string = new byte[16];
		Z = new char[53];
		Z_1 = new char[53];
	}

	/*   */
	private char inv(char x) {
		char t0, t1, q, y;
		if (x <= 1)
			return x; /* 0 and 1 are self-inverse */
		t1 = (char) (0x10001 / x);
		/* Since x >= 2, this fits into 16 bits */
		y = (char) (0x10001 % x);
		if (y == 1)
			return (char) (1 - t1);
		t0 = 1;
		do {
			q = (char) (x / y);
			x = (char) (x % y);
			t0 += (char) (q * t1);
			if (x == 1)
				return t0;
			q = (char) (y / x);
			y = (char) (y % x);
			t1 += (char) (q * t0);
		} while (y != 1);
		return (char) (1 - t1);
	}

	/*   */
	private char multiply(char input1, char input2) {
		long p = input1 * input2;
		if (p == 0)
			input2 = (char) (65537 - input1 - input2);
		else {
			input1 = (char) (p >> 16);
			input2 = (char) p;
			input1 = (char) (input2 - input1);

			if (input2 < input1)
				input1 += 65537;
		}
		return input1;
	}

	/*   */
	private void Separate_m_2_X() {
		// 本函数的目的是从m string中得到X1,X2,X3,X4
		// get X1,X2,X3,X4 from m string
		char temp;

		X1 = (char) m_string[0];
		X1 <<= 8;
		temp = (char) m_string[1];
		temp &= 0xFF;
		X1 |= temp;

		X2 = (char) m_string[2];
		X2 <<= 8;
		temp = (char) m_string[3];
		temp &= 0xFF;
		X2 |= temp;

		X3 = (char) m_string[4];
		X3 <<= 8;
		temp = (char) m_string[5];
		temp &= 0xFF;
		X3 |= temp;

		X4 = (char) m_string[6];
		X4 <<= 8;
		temp = (char) m_string[7];
		temp &= 0xFF;
		X4 |= temp;
	}

	/**
	 * 设置密钥
	 * 
	 * @param input_k_string
	 *            input the 128bit key(16 byte)
	 * @return No return value
	 */
	void Set_k(byte[] input_k_string) {
		// 本函数的目的是设置密钥
		for (int i = 0; i <= 15; i++)
			k_string[i] = input_k_string[i];
	}

	/**
	 * 加密用子密钥运算
	 * 
	 * @param No
	 *            param
	 * @return No return value
	 */
	void Creat_encrypt_sub_k() {
		// 本函数的目的是生成加密子密钥
		// creat encrypt sub key and store to Z[57]
		char temp;
		byte temp1, temp2, temp3;
		int i;
		int num;
		for (num = 0; num <= 6; num++) {
			Z[1 + num * 8] = (char) k_string[0];
			Z[1 + num * 8] <<= 8;
			temp = (char) k_string[1];
			temp = (char) (temp & 0x00FF);
			Z[1 + num * 8] |= temp;

			Z[2 + num * 8] = (char) k_string[2];
			Z[2 + num * 8] <<= 8;
			temp = (char) k_string[3];
			temp = (char) (temp & 0x00FF);
			Z[2 + num * 8] |= temp;

			Z[3 + num * 8] = (char) k_string[4];
			Z[3 + num * 8] <<= 8;
			temp = (char) k_string[5];
			temp = (char) (temp & 0x00FF);
			Z[3 + num * 8] |= temp;

			Z[4 + num * 8] = (char) k_string[6];
			Z[4 + num * 8] <<= 8;
			temp = (char) k_string[7];
			temp = (char) (temp & 0x00FF);
			Z[4 + num * 8] |= temp;
			if (num != 6) {
				Z[5 + num * 8] = (char) k_string[8];
				Z[5 + num * 8] <<= 8;
				temp = (char) k_string[9];
				temp = (char) (temp & 0x00FF);
				Z[5 + num * 8] |= temp;
			}
			if (num != 6) {
				Z[6 + num * 8] = (char) k_string[10];
				Z[6 + num * 8] <<= 8;
				temp = (char) k_string[11];
				temp = (char) (temp & 0x00FF);
				Z[6 + num * 8] |= temp;
			}
			if (num != 6) {
				Z[7 + num * 8] = (char) k_string[12];
				Z[7 + num * 8] <<= 8;
				temp = (char) k_string[13];
				temp = (char) (temp & 0x00FF);
				Z[7 + num * 8] |= temp;
			}
			if (num != 6) {
				Z[8 + num * 8] = (char) k_string[14];
				Z[8 + num * 8] <<= 8;
				temp = (char) k_string[15];
				temp = (char) (temp & 0x00FF);
				Z[8 + num * 8] |= temp;
			}

			// now,start to left move 25 bit
			// first left move 24 bit
			temp1 = k_string[0];
			temp2 = k_string[1];
			temp3 = k_string[2];
			for (i = 0; i <= 12; i++)
				k_string[i] = k_string[i + 3];
			k_string[13] = temp1;
			k_string[14] = temp2;
			k_string[15] = temp3;

			// then left move 1 bit,sum 25 bit
			byte store_bit[] = new byte[16]; // store k_strings first bit.
			for (i = 15; i >= 0; i--) {
				// from high bit to low
				store_bit[i] = (byte) (k_string[i] >> 7);
				store_bit[i] &= 0x01;
				k_string[i] <<= 1;
				if (i != 15)
					k_string[i] += store_bit[i + 1];
			}
			k_string[15] += store_bit[0];
			// complete to left move 25 bit
		} // All encrypt sub key created
	}

	/**
	 * 解密子密钥计算
	 * 
	 * @param No
	 *            param
	 * @return No return value
	 */
	void Creat_decrypt_sub_k() {
		// 本函数的目的是生成解密子密钥
		Z_1[1] = inv(Z[49]);
		Z_1[2] = (char) (0 - Z[50]);
		Z_1[3] = (char) (0 - Z[51]);
		Z_1[4] = inv(Z[52]);
		Z_1[5] = (char) (Z[47]);
		Z_1[6] = Z[48];

		for (int i = 1; i <= 7; i++) {
			Z_1[1 + i * 6] = inv(Z[49 - i * 6]);
			Z_1[2 + i * 6] = (char) (0 - Z[51 - i * 6]);
			Z_1[3 + i * 6] = (char) (0 - Z[50 - i * 6]);
			Z_1[4 + i * 6] = inv(Z[52 - i * 6]);
			Z_1[5 + i * 6] = Z[47 - i * 6];
			Z_1[6 + i * 6] = Z[48 - i * 6];
		}
		Z_1[49] = inv(Z[1]);
		Z_1[50] = (char) (0 - Z[2]);
		Z_1[51] = (char) (0 - Z[3]);
		Z_1[52] = inv(Z[4]);
	}

	/**
	 * 设置源数据
	 * 
	 * @param input_m_string
	 *            input the source data to be processed
	 * @return No return value
	 */
	void Set_m(byte[] input_m_string) {
		// 本函数的目的是设置源数据
		for (int i = 0; i <= 7; i++)
			m_string[i] = input_m_string[i];
	}

	/**
	 * 加密运算
	 * 
	 * @param No
	 *            param
	 * @return No return value
	 */
	void Encrypt() {
		// 本函数的目的是加密

		// 把m分成X1,X2,X3,X4
		Separate_m_2_X();

		// 下面做8圈叠代
		for (int num = 0; num <= 7; num++) {
			temp1 = multiply(Z[1 + num * 6], X1); // 1
			temp2 = (char) (X2 + Z[2 + num * 6]); // 2
			temp3 = (char) (X3 + Z[3 + num * 6]); // 3
			temp4 = multiply(Z[4 + num * 6], X4); // 4
			temp5 = (char) (temp1 ^ temp3); // 5
			temp6 = (char) (temp2 ^ temp4); // 6
			temp7 = multiply(Z[5 + num * 6], temp5); // 7
			temp8 = (char) (temp7 + temp6);
			temp10 = multiply(Z[6 + num * 6], temp8);
			temp9 = (char) (temp7 + temp10);

			X1 = (char) (temp1 ^ temp10);
			if (num != 7) {
				X2 = (char) (temp3 ^ temp10);
				X3 = (char) (temp2 ^ temp9);
			} else {
				X2 = (char) (temp2 ^ temp9);
				X3 = (char) (temp3 ^ temp10);
			}
			X4 = (char) (temp4 ^ temp9);
		} // end of 8 times

		// 输出变换
		X1 = multiply(Z[49], X1);
		X2 += Z[50];
		X3 += Z[51];
		X4 = multiply(Z[52], X4);

		// 把X1,X2,X3,X4复制到c_string中。
		// now,creat c_string from X1..X4;
		c_string[1] = (byte) X1;
		c_string[0] = (byte) (X1 >> 8);
		c_string[3] = (byte) X2;
		c_string[2] = (byte) (X2 >> 8);
		c_string[5] = (byte) X3;
		c_string[4] = (byte) (X3 >> 8);
		c_string[7] = (byte) X4;
		c_string[6] = (byte) (X4 >> 8);

		// end of encryption
	}

	/**
	 * 解密运算
	 * 
	 * @param No
	 *            param
	 * @return No return value
	 */
	void Decrypt() { // 本函数的目的是解密

		// 把m分成X1,X2,X3,X4
		Separate_m_2_X();

		// 下面做8圈叠代
		for (int num = 0; num <= 7; num++) {
			temp1 = multiply(Z_1[1 + num * 6], X1); // 1
			temp2 = (char) (X2 + Z_1[2 + num * 6]); // 2
			temp3 = (char) (X3 + Z_1[3 + num * 6]); // 3
			temp4 = multiply(Z_1[4 + num * 6], X4); // 4
			temp5 = (char) (temp1 ^ temp3); // 5
			temp6 = (char) (temp2 ^ temp4); // 6
			temp7 = multiply(Z_1[5 + num * 6], temp5); // 7
			temp8 = (char) (temp7 + temp6);
			temp10 = multiply(Z_1[6 + num * 6], temp8);
			temp9 = (char) (temp7 + temp10);

			X1 = (char) (temp1 ^ temp10);
			if (num != 7) {
				X2 = (char) (temp3 ^ temp10);
				X3 = (char) (temp2 ^ temp9);
			} else {
				X2 = (char) (temp2 ^ temp9);
				X3 = (char) (temp3 ^ temp10);
			}
			X4 = (char) (temp4 ^ temp9);
		} // end of 8 times

		// 输出变换
		X1 = multiply(Z_1[49], X1);
		X2 += Z_1[50];
		X3 += Z_1[51];
		X4 = multiply(Z_1[52], X4);

		// 把X1,X2,X3,X4复制到c_string中。
		// now,creat c_string from X1..X4;
		c_string[1] = (byte) X1;
		c_string[0] = (byte) (X1 >> 8);
		c_string[3] = (byte) X2;
		c_string[2] = (byte) (X2 >> 8);
		c_string[5] = (byte) X3;
		c_string[4] = (byte) (X3 >> 8);
		c_string[7] = (byte) X4;
		c_string[6] = (byte) (X4 >> 8);
		// end of decryption
	}

	/**
	 * 结果输出
	 * 
	 * @param output_c_string
	 *            output the result
	 * @return No return value
	 */
	void Get_c(byte[] output_c_string) {
		// 本函数的目的是获得目标数据
		for (int i = 0; i <= 7; i++)
			output_c_string[i] = c_string[i];
	}

	public static void main(String[] args) {
		int i;
		IDEADemo demoTest = new IDEADemo();
		byte[] m = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		byte[] k = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6 };
		byte[] c = new byte[8];
		demoTest.Set_k(k);
		demoTest.Creat_encrypt_sub_k();
		demoTest.Creat_decrypt_sub_k();
		System.out.println("密钥:");
		for (i = 0; i <= 15; i++)
			System.out.print(k[i]);
		System.out.println("");

		demoTest.Set_m(m);
		System.out.println("明文:");
		for (i = 0; i <= 7; i++)
			System.out.print(m[i]);
		System.out.println("");

		demoTest.Encrypt();
		demoTest.Get_c(c);
		System.out.println("密文:");
		for (i = 0; i <= 7; i++)
			System.out.print((int) (c[i]) + "   ");
		System.out.println("");

		demoTest.Set_m(c);
		demoTest.Decrypt();
		demoTest.Get_c(c);
		System.out.println("解密后明文:");
		for (i = 0; i <= 7; i++)
			System.out.print(c[i]);
		System.out.println("");

		System.out.println("hello!");
	}
}

 

分享到:
评论

相关推荐

    Oracle环境下的IDEA加密方法

    IDEA(International Data Encryption Algorithm,国际数据加密算法)是一种高效且安全的对称加密算法,以其快速和强大的安全性在许多应用场景中得到广泛应用。在Oracle数据库中实现IDEA加密,可以确保存储在数据库...

    ToolsFx密码学工具箱-Java语言编写,是爬虫工程师的好用工具

    通过使用这款软件,就能帮助用户对编解码、编码转换、字符处理、哈希、MAC、对称加密、非对加密。软件是用Java语言编写的,要运行该软件,需要安装JDK环境。安装好JDK环境后,直接运行解压目录下的ToolsFx .bat文件...

    基于Java的加密算法演示项目.zip

    DesDemo: 展示了DES对称加密算法的基本实现,包括加密和解密操作。 IDEADemo: 演示了如何使用IDEA加密算法进行加密和解密,包括密钥生成和转换。 MD5Demo: 提供了一个MD5哈希算法的实现,展示了如何计算字符串的...

    Java中常用的加密方法(JDK)

    在Java的JDK中,提供了多种加密方法,包括对称加密和非对称加密。这里我们主要讨论对称加密,因为它是Java中最常用且基础的加密方式。 对称加密是一种使用同一密钥进行加密和解密的加密技术。它的优点在于加解密...

    IDEA:Java实现的国际数据加密算法

    "IDEA:Java实现的国际数据加密算法" 指的是这个项目是用Java编程语言实现的一种名为IDEA(International Data Encryption Algorithm)的加密算法。IDEA是一种对称密钥加密算法,它在数据加密领域中被广泛应用,提供...

    Idea加密与解密算法的具体实现

    IDEA加密算法是一种高效的对称加密算法,在JAVA环境中实现IDEA不仅可行而且具有较高的安全性。通过利用JAVA提供的加密库(如JCA和JCE),开发者可以轻松地实现IDEA算法,并确保其实现的安全性和性能。尽管IDEA在某些...

    RSA加密JAVA实现+sun.misc.BASE64Decoder.jar

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,特别是在数据传输的安全性上。这个Java实现的示例提供了RSA加密和解密的功能,并且结合了`sun.misc.BASE64Decoder.jar`来处理Base64编码,使得加密后...

    Scala版3des加密算法,用来实现对数据库配置文件的用户名密码加密。一个idea项目,包含pom文件

    在这个项目中,我们关注的是使用Scala实现的3DES(Triple Data Encryption Standard)加密算法,这是一种广泛使用的对称加密算法,常用于保护敏感数据,如数据库中的用户名和密码。 3DES,也称为TDES或3DES-EDE(三...

    Java中对字符串进行加密和解密[文].pdf

    DES(Data Encryption Standard)是一种对称加密算法,使用64位的数据分组,56位的密钥,并且加密和解密使用相同的算法,只是密钥不同。尽管DES现在已经不够安全,但作为示例,它可以用来演示Java中如何实现加解密...

    RSA_JS_JAVA

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,例如数据加密、数字签名等。该算法基于两个大素数的乘积是难以分解的数学难题,从而实现加密和解密。在这个"RSA_JS_JAVA"项目中,我们看到涉及到...

    java 云秘通信小项目

    1. **开发工具**:可能使用IDEA、Eclipse等Java集成开发环境进行编码和调试。 2. **版本控制**:如Git,用于代码版本管理和协作。 3. **构建工具**:Maven或Gradle,帮助管理依赖,自动化构建和打包项目。 4. **测试...

    字符串加密算法详解.pdf

    ### 字符串加密算法详解 #### 一、引言 在信息安全领域,字符串加密是...Java AES加密算法作为一种广泛使用的对称加密算法,不仅适用于保护数据的机密性和完整性,而且其实现相对简单,易于集成到各种应用程序中。

    获取证书和证书信息以及检测证书是否有效demo-java

    RSA是一种非对称加密算法,广泛应用于公钥基础设施(PKI)中,而SM2是中国国家标准的公钥密码算法,支持签名、加密和密钥交换。在Java中,`java.security.KeyPairGenerator`类可以用来生成RSA或SM2的密钥对,而`...

    org.bouncycastle完整资源包

    1. **加密算法支持**:`org.bouncycastle`提供了大量的对称和非对称加密算法,例如AES(高级加密标准)、Blowfish、DES(数据加密标准)、3DES(三重DES)、RSA(公钥加密标准)、DSA(数字签名算法)等。...

    java编程语言的知识结构_副本_76941.pdf

    17. **编码与加解密**:Base64用于编码,MD5用于消息摘要,对称加密如AES,非对称加密如RSA,为数据传输提供安全性。 18. **测试与日志**:JUnit用于单元测试,log4j等工具用于记录程序运行日志。 19. **IDE**:...

    java开发工具

    AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,用于保护数据安全。开发者可能需要这样的工具来加密敏感信息,如数据库密码或用户数据。Java提供内置的javax.crypto包来实现AES加密,通过定义...

    pgp 5.0 源代码开发工具(4030KB)

    IDEA则是一种对称加密算法,提供快速的数据加密。 2. **数字签名**:PGP 提供了数字签名功能,通过用户的私钥对数据进行签名,任何人都可以使用对应的公钥验证签名的真实性,确保信息未被篡改。 3. **密钥管理**:...

    Cipher_Program:编程分配1

    1. **加密算法**:在Cipher Program中,你可能需要实现或使用已有的加密算法,如对称加密(如AES,DES)或非对称加密(如RSA,ECC)。这些算法在信息安全领域起着至关重要的作用,用于保护数据的隐私和完整性。 2. ...

    C#和Java有什么区别和联系

    - RSA是一种非对称加密算法,C#和Java都支持,但它们在存储和表示密钥的方式上有差异。 - C#使用XML字符串存储公私钥,而Java通常采用PKCS#8(私钥)和X.509(公钥)格式,这些格式基于ASN.1编码规则。 5. **密钥...

Global site tag (gtag.js) - Google Analytics