网络加密算法之置换与替代算法
主程序
/*** 程序控制台* @author 落霞不孤*/
public class Main {private static Scanner in = new Scanner(System.in);public static void main(String[] args) {while (true) {System.out.println("实现的密码算法");System.out.println("\t1.替代算法");System.out.println("\t2.置换算法");System.out.println("\t3.退出");System.out.print("请输入需要的密码算法:");int choice = in.nextInt();switch (choice) {case 1:chooseFun(new SubstitutePassword());break;case 2:chooseFun(new ReplacementPassword());break;case 3:in.close();return;default:System.out.println("选择有误~请重新输入...");}}}private static void chooseFun(AbstractPassword abstractPassword) {System.out.println("密码算法功能:");System.out.println("\t1.加密");System.out.println("\t2.解密");System.out.print("请输入需要的密码算法功能:");int fun = in.nextInt();if (fun == 1) {System.out.print("请输入明文:");in.nextLine();String plaintext = in.nextLine();System.out.println("明文加密后的密文:" + abstractPassword.encryption(plaintext));}if (fun == 2) {System.out.print("请输入密文:");in.nextLine();String ciphertext = in.nextLine();System.out.println("密文解密后的明文:" + abstractPassword.decryption(ciphertext));}}
}
密码加密解密接口
/*** 加密解密接口* @author 落霞不孤*/
public interface FindPassword {/*** 加密* @param plaintext 明文* @return 加密后的密文*/String encryption(String plaintext);/*** 解密* @param ciphertext 密文* @return 解密后的明文*/String decryption(String ciphertext);
}
密码加密解密抽象类
/*** 抽象类密码* @author 落霞不孤*/
public abstract class AbstractPassword implements FindPassword {public static String key;public static int k;/*** 输入密钥 k*/void inputK() {Scanner in = new Scanner(System.in);System.out.print("请输入密钥k:");k = in.nextInt();}/*** 输入密钥 key*/void inputKey() {Scanner in = new Scanner(System.in);System.out.print("请输入密钥key:");key = in.nextLine();}/*** 找出字母的位置,从0算起** @param c 字母* @return 字母在字母表的位置*/int posInAlphabet(char c) {int pos = Character.toLowerCase(c) - 97;return pos;}/*** 找出c偏移量为k的字母** @param c 字母* @param k 偏移量* @return c偏移量为k的字母*/char findAlphabetByPos(char c, int k) {if (Character.isLowerCase(c)) {return (char) ((posInAlphabet(c) + k) % 26 + 97);}return (char) (char) ((posInAlphabet(c) + k) % 26 + 65);}/*** 获得密钥中每个字母出现的顺序** @param cipher 密钥* @return map<Character, Integer> k 是字母,v是出现的顺序*/public Map<Character, Integer> findCipherPos(String cipher) {Map<Character, Integer> map = new HashMap<Character, Integer>();int weight = 0;char min;// 每次找出cipher的最小字符,并赋权重while (cipher.length() > 0) {for (int i = 0; i < cipher.length(); i++) {min = cipher.charAt(i);for (int j = i + 1; j < cipher.length(); j++) {if (Character.toUpperCase(min) > Character.toUpperCase(cipher.charAt(j))) {min = cipher.charAt(j);}}// 找出最小的字母后,用""取代cipher = cipher.replace(Character.toString(min), "");map.put(min, weight++);break;}}return map;}/*** 将明文变成二维数组* @param plaintext 明文* @return 明文的二维数组*/public char[][] getCipherTextArr(String plaintext) {// 去除明文空格plaintext = plaintext.replace(" ", "");int col = key.length();int row = (int) Math.ceil(plaintext.length()*1.0 / col);// 存储明文的二维数组char[][] plainArr = new char[row][col];// 存储密文的二维数组char[][] chars;// 把明文存入明文的二维数组,用空格填充不存在的元素for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (i * col + j >= plaintext.length()) {plainArr[i][j] = ' ';} else {plainArr[i][j] = plaintext.charAt(i * col + j);}}}chars = rule(plainArr);return chars;}/*** 获取按照密钥字母顺序加密或者解密的二维数组* @param text 密文或明文的二维数组* @return 加密或者解密的二维数组*/private char[][] rule(char[][] text) {char[][] chars = new char[text.length][text[0].length];Map<Character, Integer> map = findCipherPos(key);// 加密或解密int j = 0;for (char tmp : key.toCharArray()) {int pos = map.get(tmp);for (int i = 0; i < text.length; i++) {chars[i][j] = text[i][pos];}j++;}return chars;}/*** 按照约定打印密文数组* @param chars 密文数组* @return 密文*/public String getCipherTextArrStr(char[][] chars) {StringBuilder sb = new StringBuilder();Map<Character, Integer> cipherPos = findCipherPos(key);for (char tmp : key.toCharArray()) {int pos = cipherPos.get(tmp);for (int i = 0; i < chars.length; i++) {if(chars[i][pos] != ' ') {sb.append(chars[i][pos]);}}}return sb.toString();}/*** 将密文变成二维数组* @param cipherText 密文* @return 密文的二维数组*/public char[][] getPlainTextArr(String cipherText) {// 去除密文空格cipherText = cipherText.replace(" ", "");int col = key.length();int row = (int) Math.ceil(cipherText.length()*1.0 / col);// 存储密文的二维数组char[][] plainArr = new char[row][col];// 把密文存入二维数组// 不是填满矩阵boolean flag = col * row > cipherText.length();for (int i = 0; i < row; i++) {// 统计列数int count = 0;for (int j = i; j <= cipherText.length(); j+=row) {// 填充空格if (i * col + count >= cipherText.length()) {plainArr[i][count] = ' ';} else if(flag) {if (count > 1) {j--;}if (j == cipherText.length()) {j = cipherText.length() - 1;}if (j >= cipherText.length()) {j -= row;}plainArr[i][count] = cipherText.charAt(j);} else {if (j == cipherText.length()) {break;}plainArr[i][count] = cipherText.charAt(j);}count++;}}return plainArr;}/*** 将密文的二维数组解密,返回明文* @param cipherArr 密文的二维数组解密* @return 明文*/public String getPlainTextArrStr(char[][] cipherArr) {StringBuilder sb = new StringBuilder();char[][] tmp = rule(cipherArr);char[][] plainArr = rule(tmp);for (char[] chars : plainArr) {for (int j = 0; j < plainArr[0].length; j++) {if (chars[j] != ' ') {sb.append(chars[j]);}}}return sb.toString();}
}
置换算法具体实现
/*** 置换密码* @author 落霞不孤*/
public class ReplacementPassword extends AbstractPassword{@Overridepublic String encryption(String plaintext) {inputKey();char[][] cipherTextArr = getCipherTextArr(plaintext);return getCipherTextArrStr(cipherTextArr);}@Overridepublic String decryption(String ciphertext) {inputKey();char[][] cipherTextArr = getPlainTextArr(ciphertext);return getPlainTextArrStr(cipherTextArr);}
}
替代算法
/*** 替代算法* @author 落霞不孤*/
public class SubstitutePassword extends AbstractPassword{@Overridepublic String encryption(String plaintext) {inputK();char[] chars = plaintext.toCharArray();StringBuilder sb = new StringBuilder();for (char ch : chars) {if (Character.isLetter(ch)) {char e = findAlphabetByPos(ch, k);sb.append(e);} else {sb.append(ch);}}return sb.toString();}@Overridepublic String decryption(String ciphertext) {inputK();char[] chars = ciphertext.toCharArray();StringBuilder sb = new StringBuilder();for (char ch : chars) {if (Character.isLetter(ch)) {if (posInAlphabet(ch) < k) {// 找出密文字母在字母表位置,例如a,字母表位置为1,密钥假设k=2// 计算出 newPos = 1 是需要倒退的距离,从z开始倒退// 即可得到明文应该是yint newPos = posInAlphabet(ch) + 1 - k;if (Character.isLowerCase(ch)) {sb.append(findAlphabetByPos('z', newPos));} else {sb.append(findAlphabetByPos('Z', newPos));}} else {sb.append(findAlphabetByPos(ch, -k));}} else {sb.append(ch);}}return sb.toString();}
}
网络加密算法之置换与替代算法相关推荐
- 简析无线网络加密算法之CCMP加密算法
原文地址:http://www.jiamisoft.com/blog/2586-ccmpjiamisuanfa.html [导读] 为了加强无线网络的安全性,增加被破解的难度,局域网/城域网标准委员会 ...
- 密集场景下的行人跟踪替代算法,头部跟踪算法 | CVPR 2021
点击下方"AI算法与图像处理",一起进步!重磅干货,第一时间送达 报告链接:https://www.bilibili.com/video/BV1Ug411M7Kt/ https:/ ...
- 多层感知机MLP、RBF网络、Hopfield网络、自组织映射神经网络、神经网络算法地图
多层感知机MLP.RBF网络.Hopfield网络.自组织映射神经网络.神经网络算法地图 目录
- 对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度
对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的 边.说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度
- 计算机网络二分法划分网络,三种经典复杂网络社区结构划分算法研究_GN算法
论文导读::复杂网络是复杂系统的高度抽象.即社区结构特性[3].算法是一种试探优化法[4].算法. 关键词:复杂网络,社区结构,Laplace图谱,Kernighan-Lin算法,GN算法 1引言 现 ...
- 深度学习图像处理目标检测图像分割计算机视觉 04--神经网络与误差反向传播BP算法
深度学习图像处理目标检测图像分割计算机视觉 04--神经网络与误差反向传播BP算法 摘要 一.神经元 二.前馈网络 2.1 Delta学习规则 2.2 目标函数J(w) 三.误差反向传播算法(BP算法 ...
- 面向智能网联汽车边缘网络的分布式端-边协同算法
本文由朱凯男,朱永东,赵志峰,刘云涛,张园联合创作 摘要 车联网高级安全服务中,智能网联车辆配备了摄像头,可以拍摄周围的视频,用于安全.交通监控和监视等目的.车辆将获取的视频上传到边缘计算节点后,可以 ...
- 无线传感器网络定位问题的大象群优化算法
无线传感器网络定位问题的大象群优化算法 摘要 提出了一种用于解决无线传感器网络定位问题的大象群优化算法.EHO是一种相对较新的群体智能元启发式算法,在处理NP-hard问题时取得了很好的效果.无线传感 ...
- ML之PFI(eli5):基于mpg汽车油耗数据集利用RF随机森林算法和PFI置换特征重要性算法实现模型特征可解释性排序
ML之PFI(eli5):基于mpg汽车油耗数据集利用RF随机森林算法和PFI置换特征重要性算法实现模型特征可解释性排序 目录 基于mpg数据集利用RF随机森林算法和PFI置换特征重要性算法实现模型特 ...
最新文章
- Redis+Mysql模式和内存+硬盘模式的异同
- HDU - 1429 胜利大逃亡(续) (BFS+状压)
- python字符串随机排序_python 随机数使用方法,推导以及字符串,双色球小程序实例...
- mysql 自动化部署,MySQL标准化、自动化部署
- Meta宣布将关闭面部识别系统 删除超10亿用户面部扫描数据
- 【Spring】Spring NoSuchMethodError okhttp3.internal.platform.Platform.log(ILjava/lang/String;Ljava/lan
- jquery相对定位(包含find的使用 find相当于后代选择器)$(选择器1,选择器2)
- libeio-异步I/O库初窥
- 漫画:如何给女朋友解释什么是单例模式?| 技术头条
- 简单识别 RESTful 接口
- PHP的continue语句,PHP continue语句
- 初始化列表和构造函数内赋值的区别
- 【网易云课堂---轻松读书:番茄工作法二】
- mesh和wifi中继的区别_科普:路由器的无线中继和Mesh的区别是什么?
- 联想服务器改xp系统,联想win7改xp蓝屏怎么解决
- 《三国空城计》何为真知己真智慧
- mysql查询时候返回一个序号
- 信息系统项目管理师学习笔记5——信息化与信息系统5
- Android PNG图片像素检测及剪裁优化
- 你不可不知的Java引用类型之——SoftReference源码详解