【密码学-凯撒密码】
现代密码学-单表代换密码
- 凯撒密码原理
- 移位变换
- 仿射变换
- 代码实现-凯撒密码
- 代码实现-放射变换
凯撒密码原理
凯撒密码的加密代换和解密代换分别为
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;}
}
【密码学-凯撒密码】相关推荐
- python密码学凯撒密码_凯撒密码在Python
python密码学凯撒密码 Hello everyone, in this tutorial you'll learn about Caesar cipher in Python. If you ha ...
- 密码学入门1——凯撒密码和三重DES加解密
实验目的 1.完成第一个入门加解密--凯撒密码 2.完成当下较为流行的三重DES加解密技术 3.熟悉所学的实际运用方向 实验准备 硬件:计算机或笔记本电脑 操作系统:Mac操作系统 IDE环境:Ecl ...
- 凯撒密码和栅栏密码 - 密码学01
凯撒密码和栅栏密码 让编程改变世界 Change the world by program 我们将会学到什么?! 这相信是大家广泛关注的话题,因为如果一开始给大家一个强大而震撼的目录,然后就是一屁股的 ...
- 有趣的密码学介绍~古典密码之凯撒密码来咯~
游说万乘苦不早,著鞭跨马涉远道.仰天大笑出门去,我辈岂是蓬蒿人! 文章目录 前言 正文 古典密码 一.古典密码概述介绍 1.置换密码 2.代换密码 二.古典密码分类介绍 1.置换密码 2.编辑本段代换 ...
- 凯撒密码加密解密——Java代码(密码学)
凯撒密码加密解密--Java代码(密码学) 凯撒密码: 恺撒密码(英语:Caesar cipher),或称恺撒加密.恺撒变换.变换加密,是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文 ...
- Python密码学入门:凯撒密码
1 什么是密码学 自古以来,间谍.士兵.黑客.海盗.商人等人,大多依靠密码学来确保他们的秘密不会人尽皆知.密码学是一门使用秘密编码的学科.想要明白密码长什么样,看一看下面两段文本. nyr N.vNw ...
- 凯撒密码加密算法python_CTF中会用到的密码学基础(节选)
Hello,大家好,好耐冇见,我系初音 今天我们来学习一下关于CTF中会用到的部分密码学基础(很简单的那部分) 01第一节.凯撒密码 在密码学中,凯撒密码(Caesar cipher),或称凯撒加密. ...
- 密码学(第二讲)---凯撒密码破译和简单替换密码
上节课,我们已经初步学习了凯撒密码和一些密码学的概念.今天,我们来学习破译和简单替换密码. 一.凯撒密码 凯撒密码是将字母往后平移3个,(列如apple加密的方式为: a–>a+3–>d ...
- 凯撒密码加密算法python_Python密码学入门:凯撒密码
1 什么是密码学 自古以来,间谍.士兵.黑客.海盗.商人等人,大多依靠密码学来确保他们的秘密不会人尽皆知.密码学是一门使用秘密编码的学科.想要明白密码长什么样,看一看下面两段文本. nyr N.vNw ...
最新文章
- Android自定义View:ViewGroup(三)
- 一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现
- 《NoSQL精粹》思维导图读书笔记
- CSS 工程化 小结
- 如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误...
- 【学术相关】国内考博需要怎么准备?难度大吗?有什么建议?
- linux可用的ftp,linuxunix下有很多可用的ftp服务器
- linux命令收集录
- 零门槛!ZBLibrary仿微信朋友圈自定义View,就是这么简单!
- 程序员创业其实相比其他行业也有一些优势
- linux每日命令(20):find命令概览
- 苹果登陆qq邮箱服务器,腾讯QQ邮箱配置,在苹果邮件配置和第三方spark登录qq邮箱账号...
- CSS3淘宝支付成功打勾动画代码
- 安卓第三方ROM----AOKP和CM
- 程序员学人工智能,为什么必须要懂数学建模?
- 如何通过企业微信便捷访问华为云、阿里云?
- springboot Possibly consider using a shorter maxLifetime value.
- 【SIM卡】Sim 卡热插拔
- 《博弈论导论》课程讲义,人大聂辉华教授主讲
- Debian 11 DNS服务器修改不生效解决方法