手搓DES·Java实现·按步梳理

本文介绍了如何使用Java实现DES加密解密算法,详细讲解了从输入明文和密钥开始,经过IP置换、密钥生成、16轮迭代过程,包括轮函数中的E扩展、密钥加、S盒代换和P置换等步骤,最后进行IP逆置换输出64比特密文的完整流程。并提供了完整的代码示例链接。
摘要由CSDN通过智能技术生成

输入
明文 64比特
0011100011010101101110000100001011010101001110011001010111100111
密钥 64比特
1010101100110100100001101001010011011001011100111010001011010011

Scanner input = new Scanner(System.in);
		String P = input.nextLine();
		String K = input.nextLine();

首先 IP置换
在这里插入图片描述
在这里插入图片描述

//IP置换
		int[] IP = {
   58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7};
		String P0 = "";
		for(int i = 0; i < 64; i++) {
   
			P0 += (P.substring(IP[i]-1, IP[i]));
		}
		System.out.println("P: " + P);
		System.out.println("P0:" + P0);

P0拆开得到L0与R0

//L与R
		String[] L = new String[16];
		String[] R = new String[16];
		L[0] = P0.substring(0,32);
		R[0] = P0.substring(32);
		System.out.println("L0:" + L[0]);
		System.out.println("R0:" + R[0]);

密钥生成
在这里插入图片描述
在这里插入图片描述

//密钥生成
		int[] Kn = new int[64];
		for(int i = 0; i < 64; i++){
   
			Kn[i] = Integer.parseInt(K.substring(i, i+1));
		}
		int[][] subKeys = generateSubKeys(Kn);
		String SK[] = {
   "","","","","","","","","","","","","","","",""};
		for(int i = 0; i < 16; i++) {
   
			for (int j = 0; j < 48; j++) {
   
				SK[i] += subKeys[i][j];
			}
		}
public static int[][] generateSubKeys(int[] K){
   
		int[][] subKeys = new int[16][48];
		int[] PC1_C = {
   57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36};
		int[] PC1_D = {
   63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4};
		int[] shiftTable = {
   1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
		int[] PC2 = {
   14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32};

		int[] C = new int[28];
		int[] D = new int[28];

		for(int i = 0; i < 28; i++){
   
			C[i] = K[PC1_C[i] - 1];
			D[i] = K[PC1_D[i] - 1];
		}

		for(int i = 0; i < 16; i++){
   
			C = LeftShift(C, shiftTable[i]);
			D = LeftShift(D, shiftTable[i]);
			for(int j = 0; j < 48; j++){
   
				if(PC2[j] <= 28)
					subKeys[i][j] = C[PC2[j] - 1];
				else
					subKeys[i][j] = D[PC2[j] - 29];
			}
		}

		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值