主程序

/*** 程序控制台* @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();}
}

网络加密算法之置换与替代算法相关推荐

  1. 简析无线网络加密算法之CCMP加密算法

    原文地址:http://www.jiamisoft.com/blog/2586-ccmpjiamisuanfa.html [导读] 为了加强无线网络的安全性,增加被破解的难度,局域网/城域网标准委员会 ...

  2. 密集场景下的行人跟踪替代算法,头部跟踪算法 | CVPR 2021

    点击下方"AI算法与图像处理",一起进步!重磅干货,第一时间送达 报告链接:https://www.bilibili.com/video/BV1Ug411M7Kt/ https:/ ...

  3. 多层感知机MLP、RBF网络、Hopfield网络、自组织映射神经网络、神经网络算法地图

    多层感知机MLP.RBF网络.Hopfield网络.自组织映射神经网络.神经网络算法地图 目录

  4. 对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

    对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的 边.说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

  5. 计算机网络二分法划分网络,三种经典复杂网络社区结构划分算法研究_GN算法

    论文导读::复杂网络是复杂系统的高度抽象.即社区结构特性[3].算法是一种试探优化法[4].算法. 关键词:复杂网络,社区结构,Laplace图谱,Kernighan-Lin算法,GN算法 1引言 现 ...

  6. 深度学习图像处理目标检测图像分割计算机视觉 04--神经网络与误差反向传播BP算法

    深度学习图像处理目标检测图像分割计算机视觉 04--神经网络与误差反向传播BP算法 摘要 一.神经元 二.前馈网络 2.1 Delta学习规则 2.2 目标函数J(w) 三.误差反向传播算法(BP算法 ...

  7. 面向智能网联汽车边缘网络的分布式端-边协同算法

    本文由朱凯男,朱永东,赵志峰,刘云涛,张园联合创作 摘要 车联网高级安全服务中,智能网联车辆配备了摄像头,可以拍摄周围的视频,用于安全.交通监控和监视等目的.车辆将获取的视频上传到边缘计算节点后,可以 ...

  8. 无线传感器网络定位问题的大象群优化算法

    无线传感器网络定位问题的大象群优化算法 摘要 提出了一种用于解决无线传感器网络定位问题的大象群优化算法.EHO是一种相对较新的群体智能元启发式算法,在处理NP-hard问题时取得了很好的效果.无线传感 ...

  9. ML之PFI(eli5):基于mpg汽车油耗数据集利用RF随机森林算法和PFI置换特征重要性算法实现模型特征可解释性排序

    ML之PFI(eli5):基于mpg汽车油耗数据集利用RF随机森林算法和PFI置换特征重要性算法实现模型特征可解释性排序 目录 基于mpg数据集利用RF随机森林算法和PFI置换特征重要性算法实现模型特 ...

最新文章

  1. Redis+Mysql模式和内存+硬盘模式的异同
  2. HDU - 1429 胜利大逃亡(续) (BFS+状压)
  3. python字符串随机排序_python 随机数使用方法,推导以及字符串,双色球小程序实例...
  4. mysql 自动化部署,MySQL标准化、自动化部署
  5. Meta宣布将关闭面部识别系统 删除超10亿用户面部扫描数据
  6. 【Spring】Spring NoSuchMethodError okhttp3.internal.platform.Platform.log(ILjava/lang/String;Ljava/lan
  7. jquery相对定位(包含find的使用 find相当于后代选择器)$(选择器1,选择器2)
  8. libeio-异步I/O库初窥
  9. 漫画:如何给女朋友解释什么是单例模式?| 技术头条
  10. 简单识别 RESTful 接口
  11. PHP的continue语句,PHP continue语句
  12. 初始化列表和构造函数内赋值的区别
  13. 【网易云课堂---轻松读书:番茄工作法二】
  14. mesh和wifi中继的区别_科普:路由器的无线中继和Mesh的区别是什么?
  15. 联想服务器改xp系统,联想win7改xp蓝屏怎么解决
  16. 《三国空城计》何为真知己真智慧
  17. mysql查询时候返回一个序号
  18. 信息系统项目管理师学习笔记5——信息化与信息系统5
  19. Android PNG图片像素检测及剪裁优化
  20. 你不可不知的Java引用类型之——SoftReference源码详解

热门文章

  1. 接手陌生项目的一些小建议
  2. CCF HPC China 2022 | 第二届异构计算软件栈与应用论坛成功召开
  3. 用python3发短信_Python3调用阿里短信api发送短信
  4. 架构解析 | 从ABTest是啥开始说
  5. C# 中GUID生成格式的四种格式
  6. DiagramDesigner 画流程图软件使用心得
  7. 背包问题算法实现(全组合、暴力递归、动态规划及空间压缩、对数器)
  8. 这十套练习,教你如何用Pandas做数据分析
  9. 腾讯牵头成立CSA云原生安全工作组,助力标准制定和产业落地
  10. echats的基础知识及使用