Java实现S-DES加密算法

2023-11-13

S-DES

为了更好的理解DES算法,美国圣塔克拉拉大学的Edward Schaefer教授于1996年开发了Simplified DES方案,简称S-DES方案。它是一个供教学二非安全的加密算法,它与DES的特性和结构类似,但参数小,明文分组为8位,主密钥分组为10位,采用两轮迭代。

S-DES加密原理

加密原理图
1.初始置换IP:将8位的明文按照顺序(26314857)进行位置变化,置换后分为左4位L0和右4位R0.
2.第1轮运算,R0一方面直接输出作为下一轮的L1,另一方面作为f函数的输入与8位的子密钥K1参与函数运算,运算结果与L0异或,结果作为下一轮的R1.
3.第2轮运算,R1一方面直接输出作为下一轮R2,另一方面作为f函数的输入与8位的子密钥K2参与函数运算,运算结果与L1异或,结果作为下一轮的L2.
4.逆置换IP-1.在S-DES的整个加密过程中,包含两个重要的组成部分,一个是子密码生成过程,一个是f函数结构

子密钥的生成:

在这里插入图片描述
1.主密钥K进行P10置换(3、5、2、7、4、10、1、9、8、6).
2.分成左5位和右5位,再分别进行LS-1操作(左循环1位),其结果一方面作为下一轮的初始值,一方面进行P8置换(6、3、7、4、8、5、10、9),得到K1(P8相当于将10位截取成8位)。
3.再分别左循环2位,经过P8置换,得到K2.

f函数:

在这里插入图片描述
1.E/P扩展及置换:将4位R0或R1扩展为8位。
2.扩展后的8位与密钥K1或K2异或,输出8位
3.左边4位作为S1盒输入,右边作为S2盒输入。
4.在S1和S2中,第1位与第4位结合形成2位代表S盒的行号,第2位与第3位结合形成2位代表S盒的列号,得到S盒的输出。S-DES盒在下面有。
5.进行P4置换,得到f函数的输出

S-DES的S盒:

S1 00 01 10 11 S2 00 01 10 11
00 01 00 11 10 00 00 01 10 11
01 11 10 01 00 01 10 00 01 11
10 00 10 01 11 10 11 10 01 00
11 11 01 00 10 11 10 01 00 11

代码:

import java.util.Scanner;

//置换还有S盒的设置
public class S_DES {
public static String key1;
public static String key2;
public static int[] IP = new int[] { 2, 6, 3, 1, 4, 8, 5, 7 };
public static int[] EP = new int[] { 4, 1, 2, 3, 2, 3, 4, 1 };
public static int[] P10 = new int[] { 3, 5, 2, 7, 4, 10, 1, 9, 8, 6 };
public static int[] P8 = new int[] { 6, 3, 7, 4, 8, 5, 10, 9 };
public static int[] P4 = new int[] { 2, 4, 3, 1 };
public static int[] IP_1 = new int[] { 4, 1, 3, 5, 7, 2, 8, 6 };
public static String[][] S1_box = new String[][] {
		{ "01", "00", "11", "10" }, { "11", "10", "01", "00" },
		{ "00", "10", "01", "11" }, { "11", "01", "00", "10" } };
public static String[][] S2_box = new String[][] {
		{ "00", "01", "10", "11" }, { "10", "00", "01", "11" },
		{ "11", "10", "01", "00" }, { "10", "01", "00", "11" } };
public static String substitue(String str, int[] P) { //进行置换操作    
	StringBuilder sb = new StringBuilder();
	for (int i = 0; i < P.length; i++) {
		sb.append(str.charAt((P[i]) - 1));
	}
	return new String(sb);
}

public static String xor(String str, String key) { //进行异或操作
	StringBuilder sb = new StringBuilder();
	for (int i = 0; i < str.length(); i++) {
		if (str.charAt(i) == key.charAt(i)) {
			sb.append("0");
		} else {
			sb.append("1");
		}
	}
	return new String(sb);
}

public static String searchSbox(String str, int n) { //S盒的查找
	StringBuilder sb = new StringBuilder();
	sb.append(str.charAt(0));
	sb.append(str.charAt(3));
	String ret = new String(sb);
	StringBuilder sb1 = new StringBuilder();
	sb1.append(str.charAt(1));
	sb1.append(str.charAt(2));
	String ret1 = new String(sb1);
	String retu = new String();
	if (n == 1) {
		retu = S1_box[Integer.parseInt(ret, 2)][Integer.parseInt(ret1, 2)];
	} else {
		retu = S2_box[Integer.parseInt(ret, 2)][Integer.parseInt(ret1, 2)];
	}
	return retu;
}

public static void getkey() { //获得key1和key2
	System.out.println("-----请输入主密钥(10位)------");
	Scanner sc = new Scanner(System.in);
	String mainkey = sc.nextLine();
	mainkey = substitue(mainkey, P10);
	String Ls11 = mainkey.substring(0, 5);
	Ls11 = move(Ls11, 1);//移位后
	String Ls12 = mainkey.substring(5, 10);
	Ls12 = move(Ls12, 1);//移位后
	key1 = Ls11 + Ls12;
	key1 = substitue(key1, P8);
	System.out.println("key1= " + key1);
	String Ls21 = move(Ls11, 2);
	String Ls22 = move(Ls12, 2);
	key2 = Ls21 + Ls22;
	key2 = substitue(key2, P8);
	System.out.println("key2= " + key2);
}

public static String move(String str, int n) { //进行移位操作,只能1位或者2位
	char[] ch = str.toCharArray();
	char[] copy_ch = new char[5];
	for (int i = 0; i < ch.length; i++) {
		int a = ((i - n) % ch.length);
		if (a < 0) {
			if (n == 1) {
				copy_ch[ch.length - 1] = ch[i];
			}
			if (n == 2) {
				if (i == 0) {
					copy_ch[ch.length - 2] = ch[i];
				} else {
					copy_ch[ch.length - 1] = ch[i];
				}

			}
		} else {
			copy_ch[a] = ch[i];
		}
	}
	return new String(copy_ch);
}

public static void encrypt() { //加密主体
	System.out.println("-----请输入要加密的信息(8位)------");
	Scanner sc = new Scanner(System.in);
	String plaintext = sc.nextLine();
	plaintext = substitue(plaintext, IP);
	String L0 = plaintext.substring(0, 4);
	String R0 = plaintext.substring(4, 8);
	String R0E = substitue(R0, EP);
	R0E = xor(R0E, key1);
	String S1 = R0E.substring(0, 4);
	String S2 = R0E.substring(4, 8);
	S1 = searchSbox(S1, 1);
	S2 = searchSbox(S2, 2);
	String SS = S1 + S2;
	String f1 = substitue(SS, P4);
	String L1 = R0;
	String R1 = xor(f1, L0);
	//这里求出L1,R1
	//-----------------第二轮-------------
	String R11 = substitue(R1, EP);
	R11 = xor(R11, key2);
	S1 = R11.substring(0, 4);
	S2 = R11.substring(4, 8);
	S1 = searchSbox(S1, 1);
	S2 = searchSbox(S2, 2);
	SS = S1 + S2;
	String f2 = substitue(SS, P4);
	String L2 = xor(f2, L1);
	String R2 = R1;
	//这里求出L2,R2
	String ciphertext = L2 + R2;
	ciphertext = substitue(ciphertext, IP_1);
	System.out.println("密文: " + ciphertext);
}

public static void main(String[] args) {
	getkey();
	encrypt();
 }
 }

结果测试:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实现S-DES加密算法 的相关文章

  • 实验室服务器conda使用教程

    目录 前言 1 下载conda 2 安装conda 3 检查conda是否安装成功 4 配置conda镜像 5 创建conda环境 6 在环境中安装模型所需的库文件 7 conda的其他用法 8 服务器离线安装python库文件 以torc
  • ubuntu下移植Qt软件

    export PATH home ubuntu yhj plugins PATH export QTDIR home ubuntu yhj plugins export LD LIBRARY PATH QTDIR lib LD LIBRAR
  • Kvrocks 在 RocksDB 上的优化实践

    不久前 Kvrocks 发布 2 0 5 版本 该版本不仅增加了许多新功能 还使用了RocksDB 的新特性大大提升了性能 本文将重点介绍 Kvrocks 是如何使用这些特性来提升磁盘类型 Redis 服务的性能 希望能给大家带来一些参考
  • mock.js文档详解1及下载(数据模板)

    作用 生成随机数据 拦截Ajax请求 mock数据模板的书写规则 属性名 规则 属性值 规则共有七种 1 name min max value 针对value的不同类型会有不同意义 2 name count value 3 name min
  • 手机按键失灵怎么修复_手机触摸屏失灵了怎么办,六种方法自己就能修好它!...

    你是否碰到这种抓狂的时候 手机屏幕总是要按多几下才能反应过来 有时点了好几下也依然没反应 其实 发生这样的触屏失灵的问题 也是有多方面的原因造成 有时是外在的客观原因引起 有时是个人的主观因素导致 如今 我们的手机绝大多数都是电容屏的 而电
  • 2022全国高校计算机能力挑战赛决赛python组编程计挑赛决赛3

    输入格式 一个日期 格式 年 月 日 1 算法中要能够自动对输入的日期进行判断 若年份不是2022年或月份不是1月份至8月份中的某一个月份值 则输出 数据输入错误 2 算法中能够对输入的 日 的数字进行判断 要按照实际情况进行判断 如1 3
  • ChatGLM2-6B! 我跑通啦!本地部署+微调(windows系统)

    ChatGLM2 6B 我跑通啦 windows系统 1 跑通了啥 2 咋跑通的 2 1 ChatGLM2 6B本地部署 2 2 ChatGLM2 6B本地微调 2 3 小结 3 打算做什么 1 跑通了啥 记录一下此时此刻 2023年7月8
  • pythonSDK安装+Visual Studio Code

    安装PythonSDK 点击去下载python的SDK https www python org 去下载 双击 下载好的安装包 等待安装可能会很慢 如何验证是否成功安装了python的SDK Windows电脑 打开 CMD 窗口 如何打开
  • iOS开发之动画篇-基础篇1

    基础篇 一 制作动画的原理 十二个基本的动画原理 网页动画的十二原则 参考全部开源的HTML和CSS代码实现 二 寻找灵感 1 知名设计师共享平台 Dribbble相当于程序员的gitHub 2 pttrns 手机设计较多 三 制作动画的基
  • 2019零基础如何学好Python?学习Python的策略是什么?

    跟几个IT界的大佬提起python 他们说零基础学好python很简单 python进阶需要花费写气力 都说Python简单易学 那么零基础如何学好Python 有哪些必须学的知识 学习的策略技巧有哪些 今天这篇文章将会给你启发 Pytho
  • PHP学习笔记-MVC框架

    MVC学习笔记 1 什么使MVC框架 MVC是一种软件开发框架 MVC将程序分为三个部分 模型层 M 视图层 V 和控制层 C 对不同的层进行分层管理和控制 方便程序的修改和扩展 2 为什么使用MVC框架 在PHP中使用MVC框架 可以实现
  • GM-MCMC高斯混合马尔科夫-蒙特卡洛算法(Matlab实现)

    GM MCMC高斯混合马尔科夫 蒙特卡洛算法 Matlab实现 地震反演是一种重要的地球物理学方法 通过对震源机制 地球物质介质和地下结构等方面的研究 可以揭示地球内部构造和动力学过程 而线性地震反演则是其中比较基础的一种反演方法 它将地下
  • 错误处理-OSError: Failed to open file b‘C:\\Users\\\xe6\x96\x87...\\ AppData\\Local\\Temp\\scipy-xxxxx

    有人说是中文文件路径的问题 我改了 重启了 没用 而且之前一直好好的 安装scipy 1 6 2 然后 from sklearn model selection import train test split 这样导入就好了 莫名奇妙的错误
  • 【无标题】MySQL左连接出现空数据

    今天检查供应商档案错误的时候 遇到一个与左连接右连接相关的问题 已知 用左连接时 放于前面的表 只要其数据符合where及之后的条件 则该数据会全部查出 而放于后面的表如果有符合左连接条件的数据 则显示其数据 如果没有 则对应行显示空 例如
  • Qt5中 Lambda 表达式的使用

    在Qt中信号的槽函数可以使用Lamba表达式来代替 作为槽函数的替代函数 Lambda是C 11添加的内容 在Qt5中使用需要在项目文件中添加CONFIG c 11 Lambda的基本类型为 与普通函数void change 相比 只有括号
  • 云智慧刘洪涛:中国AIOps正走向深水区

    做企业要有危机意识 特别是TO B企业 要能从当下找到问题 找到自己的短板 作者 斗斗 编辑 皮爷 出品 产业家 干练精神 思路清晰 这是刘洪涛给我们的第一感觉 创业是孤独的 他告诉产业家 如今 云智慧正迎来特殊的时刻 7月份 云智慧刚刚宣
  • c语言程序代码分享,一些简单的C语言程序代码(最新整理)

    一些简单的C语言程序代码 最新整理 由会员分享 可在线阅读 更多相关 一些简单的C语言程序代码 最新整理 17页珍藏版 请在人人文库网上搜索 1 由键盘任意输入 1 个 4 位数整数 分别输出其中的个位 十位 百位 千位 expe 3 10
  • 01_配置yum源-银河麒麟V10(Kylin Linux Advanced Server V10 (Tercel))操作系统

    本文章收录于 国产银河服务器安装文档集 将详细的讲解 国产银河服务器操作系统各种软件的部署与说明 目录 配置yum源的两种方式 一 配置外网 yum 源 1 查看yum源 2 备份yum源 3 配置外网yum源 4 查看yum源 5 使yu
  • ValueError: x and y must have same first dimension, but have shapes (2,) and (1,)

    我的模型的epoch是从1开始训练的 画图的时候出现 ValueError x and y must have same first dimension but have shapes 2 and 1 ax1 plot np arange
  • NO.49-------Unity播放背景音乐不受场景切换影响

    原理就是在场景中放置一个预制体 设置标签为sound 挂载audio source组件 同时挂载一个场景切换时自身不会销毁的脚本 using System Collections using System Collections Gener

随机推荐

  • 深度学习垃圾分类数据集

    随着科技的发展 人工智能逐渐走进我们的生活 在这个过程中 数据集的重要性不言而喻 为了推动环保事业的发展 我们需要更多高质量的垃圾分类数据集 今天 我们将探讨一个包含2500 样本的垃圾分类数据集 它涵盖了6大类别 纸板 玻璃 金属 纸张
  • 从零开始的ESP8266探索(04)-连接/建立网络

    文章目录 目的 连接到网络 建立新网络 更多方式 总结 目的 使用ESP8266主要就是为了用它的网络功能 使用网络功能首先的就是需要连接到一个现有的网络 STA模式 或是建立一个网络 soft AP模式 连接到网络 在Arduino fo
  • GitHub YOLOv5 开源代码项目运行

    本专栏将从安装到实例运用全方位系列讲解 GitHub YOLOv5 开源代码 专栏地址 GitHub YOLOv5 开源代码项目系列讲解 目 录 1 源码下载及环境配置 2 利用 Yolov5 进行预测 2 1 对项目提供图片进行预测 2
  • 在离线渲染器中应用MERL BRDF

    BRDF Bidirectional Reflection Density Function 即出射光线的radiance和入射光线的irradiance的比值 在图形学中被用来描述物体的表面反射属性 BRDF的值一般来说由几个参数决定 入
  • MyBatis的使用

    目录 一 Sring项目中关于MyBatis的配置 1 在pom xml中引入框架依赖 2 配置文件配置相关信息 3 设置mapper中的xml文件内容 4 根据以上配置实现的查询示例 1 添加实体类 2 添加mapper接口 3 添加Us
  • FreeRTOS教程——队列(三)

    Free RTOS队列 队列函数库 1 xQueueCreate queue h xQueueHandle xQueueCreate unsigned portBASE TYPE uxQueueLength unsigned portBAS
  • java中的常用语句

    Java中的常用语句 一 Java中的语句由3大类的结构 1 顺序结构 自上而下一行一行的有序的执行 2 选择结构 1 If语句结构 2 Switch语句结构 3 循环结构 1 For循环 2 While循环 3 Do while 循环 二
  • OpenCV——常用函数

    一 绘制圆形 使用OpenCV库中的 circle 函数在图像上绘制圆形的代码 cv circle overlay pt 2 cv Scalar 0 green red 1 具体来说 它的参数如下 overlay 图像 在该图像上绘制圆形
  • input框在chrome浏览器下粘贴的默认底色

    Chrome浏览器对于input输入框的值会有一个默认的记录 导致后续在输入的时候出现 选择后在input框会出现一个默认底色 如图 这样对整个界面而言就感觉恨不协调 为了消去这种现象 可以在css中引入一下代码 input webkit
  • SpringMVC配置HelloWorld

    1 配置web xml文件
  • CrossEntropyloss function

    这里写目录标题 两部分 Part One 绕绕 可以不看 Part Two 清晰易懂 一定要看 两部分 Part One 绕绕 可以不看 Cross entropy loss function又称交叉熵损失 是基于one hot编码的 举个
  • 春秋云镜 CVE-2017-1000480

    春秋云镜 CVE 2017 1000480 Smarty lt 3 1 32 PHP代码执行漏洞 靶标介绍 3 1 32 之前的 Smarty 3 在未清理模板名称的自定义资源上调用 fetch 或 display 函数时容易受到 PHP
  • 根因分析告警(进行根因分析的要素)

    本文目录一览 1 相比传统运维工具 AIOps的优势在哪里 2 根因分析法是什么 3 IT运维平台算法背后的两大 神助攻 4 系统管理提供什么 日志管理和备份恢复功能 相比传统运维工具 AIOps的优势在哪里 所谓的AIOps 简单理解就是
  • ctf.show web3 文件包含+php伪协议+命令执行

    ctf show web3 php伪协议 文件包含 命令执行 题目的提示 一开始的页面 看到这个语句 那就是文件包含了 先试下file etc passwd 有反应 试下有没有flag txt文件 好像没有这个文件 那现在我们利用php伪协
  • Ubuntu18.04找不到wifi适配器解决办法以及怎么上网

    目录 一 有线上网办法 二 ubuntu找不到wifi适配器解决办法 三 有线无线均上不了网办法 四 最终问题解决 写在前面 如果大家已经尝试了很多方法进来的 可以先看看我目录里的第四部分 说不定跟我同样的问题 一 有线上网办法 拿起你的手
  • 读傅里叶级数有感

    老实讲 傅里叶级数还真的挺厉害的 但是 想到这个东西的人很厉害 把它说明白的人也很厉害 唯一不厉害的就是 指定我们教材的那帮人和学这些教材出来自以为他们掌握了这些内容却实际上根本讲不明白的人 好吧 其实不得已 看到图像可以从时域和频域两个维
  • 五万字整理Mybatis 入门只需要一篇文章

    这里写目录标题 一 简介 1 1 什么是mybatis 1 2 持久化 1 3 持久层 1 4 为什么需要学习mybatis 二 mybatis中的专业名词 三 第一个mybatis程序 3 1 搭建环境 3 1 1 创建一个数据库 3 1
  • 堆栈详解(数据与内存中的存储方式)

    转自 http www 360doc com content 11 0428 18 6580811 112988089 shtml char r hello word char b hello word r w b w 其实应该是语法错误
  • 从远程桌面客户端提取明文凭证的工具RdpThief

    介绍 远程桌面 RDP 是用于管理Windows Server的最广泛使用的工具之一 除了被管理员使用外 也容易成为攻击者的利用目标 登录到RDP会话的凭据通常用于是具有管理权限的 这也使得它们成为红队行动的一个理想目标 站在传统的角度看
  • Java实现S-DES加密算法

    S DES 为了更好的理解DES算法 美国圣塔克拉拉大学的Edward Schaefer教授于1996年开发了Simplified DES方案 简称S DES方案 它是一个供教学二非安全的加密算法 它与DES的特性和结构类似 但参数小 明文