3 多字母代替密码

单表代替密码的缺点是通过分析每个字母出现的频率可以破解出密码, 那么如果我们把多个字母当成一个单元整体替换,那么这种概率就会小很多。

比如最著名的Playfair 密码:

一、首先确定一个由加密词所构成的一个5*5的加密矩阵, 比如我们使用monarchy,

M O N A R
C H Y B D
E F G I/J K
L P Q S T
U V W X Z

这个矩阵的规则是:

1. 先将加密词中的不重复字母填充到矩阵的开头;

2. 按照字母顺序将剩余字母填充进矩阵,I和J 当成同一个字母处理。

二、对明文进行加密, 比如加密单词balloon,

1, 将明文拆成字母对,如果该字母对是相同的字母,则在他们之间填充一个固定的字母,这里我们使用x, 那么上面的单词就变成了如下的字母对:

ba-lx-lo-on

2,对上一步奏的字母对进行加密:

a), 落在矩阵同一行的明文字母对由其右边的字母代替,每行最右边的那个字母就使用该列最左边的字母代替, 比如AR-> RM

b),落在矩阵同一列的明文字母对由其下面的字母代替,没列最后一个字母就使用该列第一个字母字母代替,比如MU->CM

c),其他的每组明文字母对的中的字母按照如下方式代替,该字母所在行为密文所在行,另一个字母所在列作为密文所在列, 比如HS->BP,EA->IM

写了个大概的Java实现,可能有点问题, 用语表达意思:

  1 public class Playfair {
  2     public static final String KEY = "MONARCHY";
  3     public static char[][] getKeyMatrix(String key){
  4         key = key.toUpperCase(Locale.ENGLISH).replace(‘J‘,‘I‘);
  5         List<Character> chars = new ArrayList<Character>();
  6         for (char c : key.toCharArray()){
  7             if(!chars.contains(c)){
  8                 chars.add(c);
  9             }
 10         }
 11         char flag;
 12         for(int i = 65 ; i < 91 ; i++){
 13             flag = (char)i;
 14             if(flag == ‘J‘){
 15                 flag = ‘I‘;
 16             }
 17             if (!chars.contains(flag)){
 18                 chars.add(flag);
 19             }
 20         }
 21         char[][] keyMatrix = new char[5][5];
 22         for(int i = 0 ; i < 5 ; i ++){
 23             for(int j = 0 ; j < 5 ; j++){
 24                 keyMatrix[i][j] = chars.get(i*5 + j);
 25             }
 26         }
 27         return keyMatrix;
 28     }
 29
 30     public static short[] getLocation(char c, char[][] keyMatrix){
 31         c = c == ‘J‘ ? ‘I‘ : c;
 32         for (short i = 0 ; i < 5 ;i++){
 33             for(short j = 0 ; j < 5 ; j++){
 34                 if( c == keyMatrix[i][j]){
 35                     return new short[]{i,j};
 36                 }
 37             }
 38         }
 39         return null;
 40     }
 41
 42     public static char[] mapKeyMatrix(char[] inputs, char[][] keyMatrix){
 43         short[] location1 = getLocation(inputs[0],keyMatrix);
 44         short[] location2 = getLocation(inputs[1],keyMatrix);
 45         if (location1[0] == location2[0]){
 46             if(location1[1] == 4){
 47                 return new char[]{keyMatrix[location1[0]][0],keyMatrix[location1[0]][location2[1]+1]};
 48             }
 49             if (location2[1] == 4){
 50                 return new char[]{keyMatrix[location1[0]][location1[1]+1],keyMatrix[location1[0]][0]};
 51             }
 52             return new char[]{keyMatrix[location1[0]][location1[1]+1],keyMatrix[location1[0]][location2[1]+1]};
 53         }
 54         if(location1[1] == location2[1]){
 55             if(location1[0] == 4){
 56                 return new char[]{keyMatrix[0][location1[1]],keyMatrix[location1[1]+1][location2[1]]};
 57             }
 58             if (location2[0] == 4){
 59                 return new char[]{keyMatrix[location1[0]+1][location1[1]],keyMatrix[0][location2[1]]};
 60             }
 61             return new char[]{keyMatrix[location1[0]+1][location1[1]],keyMatrix[location1[0]+1][location2[1]]};
 62         }
 63         return new char[]{keyMatrix[location1[0]][location2[1]], keyMatrix[location2[0]][location1[1]]};
 64     }
 65     public static String encode(String str,String key){
 66         if (str == null || key == null){
 67             return null;
 68         }
 69         char[][] keyMatrix = Playfair.getKeyMatrix(key);
 70         char[] chars = str.toUpperCase(Locale.ENGLISH).toCharArray();
 71         StringBuffer encode = new StringBuffer();
 72         char[] maps = new char[2];
 73         for (int i = 0 ; i < chars.length ; i++){
 74             if(chars[i] < 65 || chars[i] > 90){
 75                 encode.append(chars[i]);
 76                 continue;
 77             }
 78             if((i+1) < chars.length && (chars[i+1] < 65 || chars[i+1] > 90)){
 79                 maps = new char[]{chars[i],‘X‘};
 80                 encode.append(mapKeyMatrix(maps,keyMatrix));
 81                 i++;
 82                 continue;
 83             }
 84             if( i == chars.length - 1){
 85                 maps = new char[]{chars[i],‘X‘};
 86                 encode.append(mapKeyMatrix(maps,keyMatrix));
 87                 break;
 88             }
 89             if(chars[i] == chars[i+1]){
 90                 encode.append(mapKeyMatrix(new char[]{chars[i],‘X‘},keyMatrix));
 91                 continue;
 92             }else{
 93                 encode.append(mapKeyMatrix(new char[]{chars[i],chars[i+1]},keyMatrix));
 94             }
 95             i++;
 96         }
 97         return encode.toString();
 98     }
 99     public static void main(String[] args) {
100         System.out.println(encode("I am Jerry, I come from Jian Yang, I don‘t know where is the future", KEY));
101     }
102 }

这种密码算法可以掩盖一部分字母出现频率导致密码被破译的问题, 但是这只是并没有解决本质问题, 还是可以通过分析字母出现的频率破解密码。

-wellmax

时间: 2024-10-19 09:21:06

3 多字母代替密码的相关文章

随机生成一个6/8/12位密码,数字加字母的密码

一  数字密码: 二 封装的数字密码 三  数字加字母的密码 四  随机不重复的6-8位密码 原文地址:https://www.cnblogs.com/pxzbky/p/10324495.html

python3-随机生成10位包含数字和字母的密码

方法一: 知识点:random.sample(sequence, k) 从指定序列中随机获取指定长度的片断 import random,string num=string.ascii_letters+string.digits print ( "".join(random.sample(num,10)) ) 方法二: 知识点:random.choice(sequence) 从序列中获取一个随机元素 import random,string passwd="" num

五种方法实现python3-随机生成10位包含数字和字母的密码

方法一: 知识点:random.sample(sequence, k) 从指定序列中随机获取指定长度的片断 import random,string num=string.ascii_letters+string.digits print ( "".join(random.sample(num,10)) ) 方法二: 知识点:random.choice(sequence) 从序列中获取一个随机元素 import random,string passwd="" num

Linux下随机生成密码的命令总结

有时候经常为如何设置一个安全.符合密码复杂度的密码而绞尽脑汁,说实话,这实在是一个体力活而且浪费时间,更重要的是设置密码的时候经常纠结.终于有一天实在忍不住了,于是学习.整理了一下如何使用Linux下命令来随机生成安全.符合密码复杂度的命令. 俗话说"工欲善其事必先利其器".如果能用挖土机的,你为什么要用锄头? 最近一直在反思自己:习惯性用原始.老旧的方式解决问题.而不擅长利用一些工具快捷.方便的解决问题. 1:mkpaswd命令 mkpasswd 是Linux自带的一个密码生成工具,

破解MSSQL的HASH密码

破解MSSQL的HASH密码 原文名称 :Microsoft SQL Server Passwords (Cracking the password hashes) 原文地址 :http://www.ngssoftware.com/papers/cracking-sql-passwords.pdf 作者 :David Litchfield <[email protected]>  Term   : FreeXploiT   Author : ALLyeSNO  Date   : 2005-3-

去你妹的密码规则

公司企业邮箱改用了腾讯的, 重新设置密码, 这SB玩意的密码规则还必须包含数字字母, 而且还TMD同时需要有大小写字母 TMD老子在网上混了这么多年就没用过同时包含大小写字母的密码, 你TMD一个密码规则我就必须记个新密码出来 怕泄密老子自己会创建复杂密码, 用不着你个破企鹅在这强制设置规定 去你妹的密码规则 规矩太多会被人骂祖宗十八代的

古典密码(Hill加密算法)

"Hill的加密与解密" Hill加密是另一种多字母代替密码,与多表代替密码不同的是,Hill密码要求将明文分成同等规模的若干个分组(最后一个分组涉及到填充),每一个分组被整体的加密代换,即希尔密码属于分组加密.Hill密码的算法思想是:将一个分组中的d个连续的明文字母通过线性变换转换为d个密文字母.这种变换由d个线性方程决定,其中每个字母被分配一个数值(0,1,...,25).解密只需要做一次逆变换就可以了,密钥就是变换矩阵本身. 设明文为一维矩阵m,密文为一维矩阵c,密钥用k矩阵表

python 使用正则表达式判断密码强弱

学python的re模板,写了个文章发现没人看,所以总结出来经验,理论没人爱,实战的人心,那么既然没人喜欢理论就直接上实战,在实战中精炼理论.不多说直接先上代码 def password_level(password): weak = re.compile(r'^((\d+)|([A-Za-z]+)|(\W+))$') level_weak = weak.match(password) level_middle = re.match(r'([0-9]+(\W+|\_+|[A-Za-z]+))+|

Office密码破解工具最好用的是哪款

很多的用户朋友设置密码的office文档一般都含有比较重要的信息.因此,忘记密码在破解的过程中非常重视安全保密性.现在有很多款office密码破解工具,很多的用户朋友不知道用哪一款比较好,其中Advanced Office Password Recovery这款密码破解工具可以在破解的高效性和安全性都做的很好.下面就给大家分享一下Office密码破解工具最好用的是哪款? 一.如何设置office密码 使用一款稍好的office密码破解工具都可以实现以下破解效果:如果密码只包含有六个小写字母,那么