古典密码学
密码学的应用历史可以追溯到几千年前。自从有了战争就有了保密通信,也有了密码的应用。1949年前,对密码的研究与应用没有形成一门学科,仅是文字变换技术,简称密码术。1949年,香农发表了“保密系统的通信理论”,为密码学的发展奠定了坚实的理论基础。密码技术的研究上了科学的轨道,此后的密码技术真正称得上密码学。
古典密码从古代到19世纪末,长达几千年。纸、笔或者简单器械实现的代换及置换,是一种艺术(富有创造性的方式、方法)
1、隐写术
公元前440年,隐写术在古希腊战争中被应用,当时为了安全地传送军事情报,奴隶主剃光奴隶地头发,将情报写在奴隶地头上,待头发长起后将奴隶送到另一个部落里,从而实现了两个部落之间地秘密通信
2、藏头诗
我国古代也通过藏头诗、藏尾诗、绘画等一些形式,将想要表达地意思隐藏在诗词中。如《水浒传》在“吴用智赚玉麒麟”一回中,由吴用口诉,卢俊义在墙上写下一首诗,粗看这首诗没有什么特别之处,但诗的含义藏于每句诗的首字中。
芦花丛中一扁舟
俊杰俄从此地游
义士若能知此理
反躬难逃可无忧
宋代文学家苏轼和秦观是好朋友。有一次,秦观外出游玩,很长时间没有回来。苏轼很惦记他,就写信询问他的情况。不久,秦观给苏轼回了一封奇怪的信。只见信纸上写了这样14个字:
苏轼看后,连声叫好。原因是秦观写的是一首回环诗,诗中描述了自己在外的生活和情趣。读这首诗时,从“赏”字开始七字一句,第二句从“去”字开始,第三句从“酒”字开始,第四句从“醒”字开始,来回循环转了一圈,正好成为一首七言绝句:“赏花归去马如飞,去马如飞酒力微。酒力微醒时已暮,醒时已暮赏花归。
近代密码学
从20世纪初到50年代,即一战至二战时期。采用手工或机械设备实现复杂的代换及置换,仍是一门艺术。其主要代表是Vernam密码、转轮密码。
传统密码技术
- 1949年香农发表“保密系统的通信理论”之前,密码学算法主要通过字符间的置换和代换实现,一般认为这些密码体制属于传统密码范畴
- 传统密码体制是指那些比较简单的、采用手工或机械操作对明文进行加密、对密文进行解密的密码体制,其安全性大多数与加解密算法的保密性密切相关
- 传统密码体制的技术、思想及分析方法虽然很简单,但是反映了密码设计和分析的思想,是学习密码学的基本入口,对于理解、设计和分析现代密码仍然具有借鉴的价值
置换密码
置换密码又叫换位密码,根据一定的规则重新排列明文,打破明文的结构特性。其特点是保持明文的所有字符不变,只是打乱了明文字符的位置和次序。
- 列置换密码:明文遵照密钥的规则按列换位并且按列得到密文
- 周期置换密码:将明文按固定长度进行分组,然后对每组按照某种重排位置得到密文
应用
在公元前5世纪,古希腊的斯巴达人使用一种叫做scytale的棍子来传递加密信息。在scytale上,斯巴达人会呈螺旋形地缠绕上一条羊皮纸或皮革。发信人在缠绕的羊皮纸上横着写下相关信息,然后将羊皮纸取下,这样羊皮纸上就是一些毫无意义的字符顺序。如果要将这条信息解码,收件人只要将羊皮纸再次缠绕在相同直径的棍棒上,这样就可以读出信件的内容了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LbHfyxf9-1649394532210)(./images/9/9-2.png)]
特点
- 多步换位有助于加强混乱
- 易受频率分析攻击
- 与代换密码技术结合,可以得到有效的强密码编码方案
代换密码
代换,就是将明文中的一个字母由其它字母、数字或者符号替代的一种方法。代换密码建立一个代换表,加密时将需要加密的明文依次通过查表,替换为相应的字符,明文字符被逐个替换后,生成无任何意义的字符串,即密文。这样的代换表被称为密钥
- 单表代换密码(凯撒、仿射):对明文消息中出现的同一个字母,在加密时都使用同一固定的字母来代换,不管它出现在什么地方。
- 多表代换密码(维吉利亚、Playfair、转轮等):明文消息中出现的同一个字母,在加密时不是完全被同一固定的字母代换,而是根据其出现的位置次序,用不同的字母代换。
单表代换密码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zrNzHfeb-1649394532210)(./images/9/9-7.png)]
应用
1、 凯撒密码
原文:A B C D E F G H I J K L M N O P Q R S T U V W X Y
密文:D E F G H I J K L M N O P Q R S T U V W X Y Z A B
将26个字母对应数字0~25
加密时,密文 c = (m + 3) % 26
解密时,明文 m = (c – 3) % 26例子:明文“chain”经过凯撒密码加密后为“fkdlq”
2、仿射密码
加密: y = f ( x ) = k 1 x + k 2 ( m o d 26 ) y = f(x) = k_1x + k_2(mod26) y=f(x)=k1x+k2(mod26)
解密: x = f − 1 ( y ) = k 1 − 1 ( y − k 2 ) ( m o d 26 ) x = f^{-1}(y) = k_1^{-1}(y – k_2)(mod26) x=f−1(y)=k1−1(y−k2)(mod26)
仿射加密要求, g c d ( k 1 , 26 ) = 1 gcd(k_1,26) = 1 gcd(k1,26)=1 ,否则就退化为 y = f ( x ) = k 2 ( m o d 26 ) y = f(x) = k_2(mod26) y=f(x)=k2(mod26)。故密钥空间大小为 ( k 1 , k 2 ) (k_1,k_2) (k1,k2) = 12 * 26 = 312
举例:
k = ( 7 , 3 ) , 7 − 1 ( m o d 26 ) = 15 k = (7,3) , 7^{-1}(mod 26) = 15 k=(7,3),7−1(mod26)=15
加密函数: y = f ( x ) = 7 x + 3 ( m o d 26 ) y = f(x) = 7x + 3 (mod 26) y=f(x)=7x+3(mod26)
解密函数: x = f − 1 ( y ) = 15 ( y − 3 ) ( m o d 26 ) x = f^{-1}(y) = 15(y-3)(mod 26) x=f−1(y)=15(y−3)(mod26)
所以,以 c 为例,其数字记为2,7 * 2 + 3 (mod 26) = 17,加密后为 r
单表代换密码特点
在明文中相同的字符在密文中也是被相同的字符代换,没有将明文字母出现的概率掩藏起来,很容易受到频率分析的攻击
一个较长的英文文本中各个字母出现的频率如下图
多表代换密码
多表密码是利用多个单表代替密码构成的密码体制。它在对明文进行加密的过程中依照密钥的指示轮流使用多个单表代替密码。
应用
1、playfair密码
将明文字母按两个字母一组分成若干个单元,然后将这些单元替换为密文字母组合,替换时基于一个5×5字母矩阵,该矩阵使用一个密钥(选定的关键词,譬如一段话)来构造,其构造方法如下:从左到右,从上到下依次填入关键词的字母,若关键词中有重复字母,则第二次出现时略过。如果没填满,在字母表中剩下的字母按字母顺序依次填入矩阵中,其中字母i和j看作是同一个字符。同时约定如下规则:表中的第一列看作是第五列的右边一列,第一行看作是第五行的下一行。
加解密过程
- 若在同一行,则对应的密文分别是紧靠右端的字母
- 若在同一列,则对应的密文分别是紧靠下端的字母
- 如不在同一行,也不再用一列,则对应的密文以对角顶点确定的矩形的另外的两个顶点字母,按同行的原则对应
- 若相同,则插入一个事先约定好的字母,并用上述方法处理
- 若明文字母数为奇数,则明文的末端添加一个事先约定好的字母进行填充
- 解密过程与加密过程基本相似,只是把其中的右边改为左边,把其中的下面改为上面即可
举例:
设置密钥为:playfair is a digram cypher
则字母矩阵为如下,加粗字母是密钥所含字母,i/j共用一个位置
p l a y f i/j r s d g m c h e b k n o q t u v w x z 明文:pl ay fa ir cy ph er
经palyfair加密后的密文:la yf py rs el am cd
2、转轮密码机
从19世纪20年代,人们开始发明各种机械加密设备用来处理数据的加解密。起初普遍使用的是转轮机和转轮加密算法。转轮密码机是由一个用于输入的键盘和一组转轮组成,每个轮转上有26个字母的任意组合。转轮之间由齿轮进行连接,当一个轮转转动时,可以将一个字母转化成为另一个字母。
事实上,转轮密码机中的每个转轮都有可能在转动,其规律是:当快转子转动26次以后,中转子就转动一个位置;而当中转子转动26次以后,慢转子就转动一个位置。因此,在加解(或解密)26x26x26个字母以后,所有转轮都恢复到初始状态。也就是说,一个有3个转轮的转轮密码机是一个周期长度为26x26x26(17576)的多表代换密码。
转轮密码机的使用大大提高了密码加解密速度,在二战期间有广泛的应用。
转轮密码机加密过程如下图
java实现凯撒密码
package com.bc.utils;
import org.apache.tomcat.util.net.openssl.ciphers.Encryption;
import org.web3j.abi.datatypes.Int;
import java.util.Scanner;
public class CaesarCipher {
public static void main(String[] args){
while(true){
System.out.println("请选择:1 -> 加密; 2 -> 解密; 3 -> 退出循环");
Scanner scanner = new Scanner(System.in); // 创建对象
String input = scanner.nextLine(); // 获取键盘输入
if(input.equals("1")){
// 加密
System.out.print("请输入需要加密的明文:");
String text = scanner.nextLine();
System.out.print("请输入密钥:");
int key = scanner.nextInt();
String ciphertext = Encryption(text, key);
System.out.println("加密后的密文为:" + ciphertext);
System.out.println("==========================================================");
}else if(input.equals("2")){
// 解密
System.out.print("请输入需要解密的密文:");
String text = scanner.nextLine();
System.out.print("请输入密钥:");
int key = scanner.nextInt();
String plaintext = Decrypt(text, key);
System.out.println("解密后的明文为:" + plaintext);
System.out.println("==========================================================");
}else {
break;
}
}
}
// caeser加密算法
public static String Encryption(String date, int key){
String str = "";
for (int i = 0; i < date.length(); i++){
int ch = (int)date.charAt(i);
ch += key % 95;
if(ch > 126){
ch = 31 + ch % 126;
}
str += (char)ch;
}
return str;
}
// caeser解密算法
public static String Decrypt(String date, int key){
String str = "";
for (int i = 0; i < date.length(); i++){
int ch = (int)date.charAt(i);
ch -= key % 95;
if(ch < 32){
ch = 127 - (32 - ch);
}
str += (char)ch;
}
return str;
}
}
今天的文章古典密码学_世界十大古典密码分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/77558.html