现代密码学-单表代换密码

  • 凯撒密码原理
  • 移位变换
  • 仿射变换
  • 代码实现-凯撒密码
  • 代码实现-放射变换

凯撒密码原理

凯撒密码的加密代换和解密代换分别为
c=Ek(m)=m+3(mod26)c=E_{k}(m)=m + 3(mod 26)c=Ek​(m)=m+3(mod26) 0<=m<=250<= m <= 250<=m<=25
m=Dk(c)=c−3(mod26)m=D_{k}(c)=c - 3(mod 26)m=Dk​(c)=c−3(mod26) 0<=c<=250<=c<=250<=c<=25
其中,3是加解密使用的密钥,即k=3k=3k=3,加密时,每个字母向后移3位(循环移位,字母xxx移到aaa,yyy移到bbb,zzz移到ccc)。解密时,每个字母向前移3位(循环移位)

移位变换

移位变换的加解密分别是
c=Ek(m)=m+k(mod26)c=E_{k}(m)=m+k(mod 26)c=Ek​(m)=m+k(mod26) 0<=m,k<=250<=m,k<=250<=m,k<=25
m=Dk(c)=c−k(mod26)m=D_{k}(c)=c - k(mod 26)m=Dk​(c)=c−k(mod26) 0<=c,k<=250<=c,k<=250<=c,k<=25

仿射变换

仿射变换的加解密分别是
c=Ea,b(m)=am+b(mod26)c=E_{a,b}(m)=am+b(mod 26)c=Ea,b​(m)=am+b(mod26)
m=Da,b(c)=a−1(c−b)(mod26)m=D_{a,b}(c)=a^{-1}(c-b)(mod 26)m=Da,b​(c)=a−1(c−b)(mod26)
其中,a,ba,ba,b是密钥,为满足0<=a,b<=250<=a,b<=250<=a,b<=25和gcd(a,26)=1gcd(a,26)=1gcd(a,26)=1的整数,其中gcd(a,26)gcd(a,26)gcd(a,26)表示a,26a,26a,26的最大公因子,gcd(a,26)=1gcd(a,26)=1gcd(a,26)=1表示aaa和262626是互素的,a−1a^{-1}a−1表示aaa的逆元,即a−1∗a=1mod26a^{-1}*a=1mod 26a−1∗a=1mod26

代码实现-凯撒密码

package com.cqu;public class KaiSaEncryptionTest {public static void main(String args[]) {String input = "Hello World";Integer key = 3;String c1 = encryptionByKasStra(input);System.out.println(c1);String p1 = decryptByKasStra(c1);System.out.println("解密后的明文为: " + p1);}/*** 凯撒加密*/private static String encryptionByKasStra(String input) {char[] inputArray = input.toCharArray();StringBuilder cipherText = new StringBuilder();for (char ia : inputArray) {int b = ia;b = (b + 3);char newb = (char) b;cipherText.append(newb);}return cipherText.toString();}/*** 凯撒解密*/private static String decryptByKasStra(String cipherText) {char[] cipherArray = cipherText.toCharArray();StringBuilder plainText = new StringBuilder();for (char ca : cipherArray) {int m = ca;m = m - 3;char newm = (char) m;plainText.append(newm);}return plainText.toString();}
}

代码实现-放射变换

package com.cqu;import com.cqu.enums.EnglishCodeNumberMap;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;/*** @author wuyanling*/
public class KaiSaEncryptionTest {public static void main(String args[]) {String input1 = "security";String input2 = "vlxijh";Integer a = 7;Integer b = 21;String c1 = encryptionByKasStra(a, b, input1);System.out.println("加密后的秘文为:" + c1);
//        String c1 = encryptionByKasStra(input);
//        System.out.println(c1);String p1 = decryptByKasStra(a, b, input2);System.out.println("解密后的明文为: " + p1);//System.out.println(15*(-4) % 26);
//        System.out.println(EnglishCodeNumberMap.getNumByCode("b"));}/*** 凯撒加密*/private static String encryptionByKasStra(Integer a, Integer b, String input) {if (Objects.isNull(input)) {return "";}char[] inputArray = input.toCharArray();List<Integer> numberArray = Arrays.asList();//这一步是解决抛java.lang.UnsupportedOperationException异常List plainArray = new ArrayList(numberArray);for (char ia : inputArray) {for (EnglishCodeNumberMap map : EnglishCodeNumberMap.values()) {if(map.getCode().equals(String.valueOf(ia))) {plainArray.add(EnglishCodeNumberMap.getNumByCode(String.valueOf(ia)));continue;}}}StringBuilder cipherText = new StringBuilder();List<Integer> cipherArray = (List<Integer>) plainArray.stream().map(e -> (a*(int) e + b) % 26).collect(Collectors.toList());for (Integer ci : cipherArray) {for (EnglishCodeNumberMap map : EnglishCodeNumberMap.values()) {if (map.getNum().equals(ci)) {cipherText.append(map.getCode());continue;}}}return cipherText.toString();}/*** 凯撒解密*/private static String decryptByKasStra(Integer a, Integer b, String cipherText) {if (Objects.isNull(cipherText)) {return "";}char[] cipherArray = cipherText.toCharArray();List<Integer> numberArray = Arrays.asList();List ciphnerArray = new ArrayList(numberArray);for (char ia : cipherArray) {for (EnglishCodeNumberMap map : EnglishCodeNumberMap.values()) {if(map.getCode().equals(String.valueOf(ia))) {ciphnerArray.add(EnglishCodeNumberMap.getNumByCode(String.valueOf(ia)));continue;}}}StringBuilder plainText = new StringBuilder();Integer c = getInverseElement(a);List<Integer> plainArray = (List<Integer>) ciphnerArray.stream().map(e ->{if ((int) e - b > 0) {return c * ((int) e - b) % 26;}else{//同余 如果 a mod b中a<0,则将(a+b) mod breturn c * ((int) e - b + 26) % 26;}}).collect(Collectors.toList());for (Integer pa : plainArray) {for (EnglishCodeNumberMap map : EnglishCodeNumberMap.values()) {if (map.getNum().equals(pa)) {plainText.append(map.getCode());continue;}}}return plainText.toString();}private static Integer getInverseElement(Integer a) {if (Objects.isNull(a)) {return null;}Integer c = null;for (int i = 0; i < 26; i ++) {if (a*i % 26 == 1) {c = i;break;}}return c;}
}

其中字母与数字映射枚举如下

package com.cqu.enums;import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;/*** @author wuyanling*/public enum EnglishCodeNumberMap {a("a", 0),b("b", 1),c("c", 2),d("d", 3),e("e", 4),f("f", 5),g("g", 6),h("h", 7),i("i", 8),j("j", 9),k("k", 10),l("l", 11),m("m", 12),n("n", 13),o("o", 14),p("p", 15),q("q", 16),r("r", 17),s("s", 18),t("t", 19),u("u", 20),v("v", 21),w("w", 22),x("x", 23),y("y", 24),z("z", 25),;private String code;private Integer num;EnglishCodeNumberMap(String code, Integer num) {this.code = code;this.num = num;}public  String getCode() {return code;}public Integer getNum() {return num;}private static Map<String, EnglishCodeNumberMap> codeMap =  new HashMap<>();static {Arrays.stream(EnglishCodeNumberMap.values()).forEach(e -> codeMap.put(e.code, e));}public static EnglishCodeNumberMap ofType(String code) {if (Objects.isNull(code)) {return null;}return codeMap.get(code);}public static Integer getNumByCode(String code) {EnglishCodeNumberMap te = ofType(code);if (Objects.isNull(te)) {return -1;}return te.num;}@Overridepublic String toString() {return name()+":"+ code;}
}

【密码学-凯撒密码】相关推荐

  1. python密码学凯撒密码_凯撒密码在Python

    python密码学凯撒密码 Hello everyone, in this tutorial you'll learn about Caesar cipher in Python. If you ha ...

  2. 密码学入门1——凯撒密码和三重DES加解密

    实验目的 1.完成第一个入门加解密--凯撒密码 2.完成当下较为流行的三重DES加解密技术 3.熟悉所学的实际运用方向 实验准备 硬件:计算机或笔记本电脑 操作系统:Mac操作系统 IDE环境:Ecl ...

  3. 凯撒密码和栅栏密码 - 密码学01

    凯撒密码和栅栏密码 让编程改变世界 Change the world by program 我们将会学到什么?! 这相信是大家广泛关注的话题,因为如果一开始给大家一个强大而震撼的目录,然后就是一屁股的 ...

  4. 有趣的密码学介绍~古典密码之凯撒密码来咯~

    游说万乘苦不早,著鞭跨马涉远道.仰天大笑出门去,我辈岂是蓬蒿人! 文章目录 前言 正文 古典密码 一.古典密码概述介绍 1.置换密码 2.代换密码 二.古典密码分类介绍 1.置换密码 2.编辑本段代换 ...

  5. 凯撒密码加密解密——Java代码(密码学)

    凯撒密码加密解密--Java代码(密码学) 凯撒密码: 恺撒密码(英语:Caesar cipher),或称恺撒加密.恺撒变换.变换加密,是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文 ...

  6. Python密码学入门:凯撒密码

    1 什么是密码学 自古以来,间谍.士兵.黑客.海盗.商人等人,大多依靠密码学来确保他们的秘密不会人尽皆知.密码学是一门使用秘密编码的学科.想要明白密码长什么样,看一看下面两段文本. nyr N.vNw ...

  7. 凯撒密码加密算法python_CTF中会用到的密码学基础(节选)

    Hello,大家好,好耐冇见,我系初音 今天我们来学习一下关于CTF中会用到的部分密码学基础(很简单的那部分) 01第一节.凯撒密码 在密码学中,凯撒密码(Caesar cipher),或称凯撒加密. ...

  8. 密码学(第二讲)---凯撒密码破译和简单替换密码

    上节课,我们已经初步学习了凯撒密码和一些密码学的概念.今天,我们来学习破译和简单替换密码. 一.凯撒密码 凯撒密码是将字母往后平移3个,(列如apple加密的方式为: a–>a+3–>d ...

  9. 凯撒密码加密算法python_Python密码学入门:凯撒密码

    1 什么是密码学 自古以来,间谍.士兵.黑客.海盗.商人等人,大多依靠密码学来确保他们的秘密不会人尽皆知.密码学是一门使用秘密编码的学科.想要明白密码长什么样,看一看下面两段文本. nyr N.vNw ...

最新文章

  1. Android自定义View:ViewGroup(三)
  2. 一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现
  3. 《NoSQL精粹》思维导图读书笔记
  4. CSS 工程化 小结
  5. 如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误...
  6. 【学术相关】国内考博需要怎么准备?难度大吗?有什么建议?
  7. linux可用的ftp,linuxunix下有很多可用的ftp服务器
  8. linux命令收集录
  9. 零门槛!ZBLibrary仿微信朋友圈自定义View,就是这么简单!
  10. 程序员创业其实相比其他行业也有一些优势
  11. linux每日命令(20):find命令概览
  12. 苹果登陆qq邮箱服务器,腾讯QQ邮箱配置,在苹果邮件配置和第三方spark登录qq邮箱账号...
  13. CSS3淘宝支付成功打勾动画代码
  14. 安卓第三方ROM----AOKP和CM
  15. 程序员学人工智能,为什么必须要懂数学建模?
  16. 如何通过企业微信便捷访问华为云、阿里云?
  17. springboot Possibly consider using a shorter maxLifetime value.
  18. 【SIM卡】Sim 卡热插拔
  19. 《博弈论导论》课程讲义,人大聂辉华教授主讲
  20. Debian 11 DNS服务器修改不生效解决方法

热门文章

  1. 江敏:数据中台驱动下的企业创新升级
  2. 游戏数据分析报告--<野蛮时代>
  3. ERP企业资源系统源码
  4. maya腿的蒙皮旋转枢轴_MAYA更改、移动枢轴点
  5. 进公司两个月了还没上手项目_27个“经验证且易于上手”的赚钱在线业务创意
  6. 爱江山更爱美人自动刷小号请安膜拜
  7. 圣诞树的雪花飘飘(结尾附源码)
  8. 计算机思维使用的方法是,计算机思维
  9. 用Python机器人监听微信群聊, 我看谁这么大的胆子敢调侃老板和前台小姐姐!
  10. 百度地图调用手机陀螺仪完成指向功能