精华内容
下载资源
问答
  • 列置换密码

    2020-04-17 03:12:11
    列置换密码 参考教材:《现代密码学教程》P46 3.1.1 过程 加密过程 将明文p以设定的固定分组宽度m按行写出,即每行有m个字符;若明文长度不是m的整数倍,则不足部分用双方约定的方式填充,如双方约定用空格代替空缺处...

    列置换密码

    参考教材:《现代密码学教程》P46 3.1.1

    过程

    加密过程

    1. 将明文p以设定的固定分组宽度m按行写出,即每行有m个字符;若明文长度不是m的整数倍,则不足部分用双方约定的方式填充,如双方约定用空格代替空缺处字符,不妨设最后得字符矩阵[Mp]n×m
    2. 按1,2…,m的某一置换σ交换列的位置次序得字符矩阵[Mp]n×m
    3. 把矩阵按[Mp]n×m列的顺序依次读出得密文序列c

    解密过程

    1. 将密文c以分组宽度n按列写出得到字符矩阵[Mp]n×m
    2. 按加密过程用的置换σ的逆置换σ-1交换列的位置次序得字符矩阵[Mp]n×m
    3. 把矩阵[Mp]n×m按1,2…,n行的顺序依次读出得明文p

    说明

    以例3.2为例
    在这里插入图片描述
    σ=(143)(56)即每个括号里部分轮着相对应
    1→4→3→1
    5→6→5
    这里我是用字典表示

            for i in range(len(s)): 
                for j in range(len(s[i])-1):
                    Key[int(s[i][j])]=int(s[i][j+1]) #密钥字典
                    antiKey[int(s[i][j+1])]=int(s[i][j]) #反密钥字典
                Key[int(s[i][-1])]=int(s[i][0]) #解决最后一个的问题
                antiKey[int(s[i][0])]=int(s[i][-1])
                temp.append(int(s[i][-1]))
    

    当然,这儿σ=(143)(56)中没有2,因为2对应他自己即
    2→2
    所以要再单独表示

    sameKey=lenKey-set(temp) #找到没有变化的密钥
        for i in sameKey:
            Key[i]=i
            antiKey[i]=i
    

    而加密的时候,便是把明文先变为矩阵,载根据密钥进行转换
    比如本题便将矩阵第一列转换为第四列,第四列转换为第三列,第三列转换为第一列,以此类推
    这里可以用生成式完成

    M=[M[i][Key[j+1]-1] for i in range(n) for j in range(m)] #矩阵转换
    

    完整代码

    '''列置换密码
    Auher:Jarrycow
    time:2020-04-17
    '''
    import re
    
    class colCode:
        __m=0
        __n=0
        __key=[] # 密钥
        __apaMsg="" # 明文
        __secMsg="" #密文
        
        def __init__(self,m): # 初始化,定义矩阵宽
            self.__m=m
            __n=0
            __key=[] 
            __apaMsg="" 
            __secMsg="" 
        def getKey(self,s): # 密钥形成函数
            m=self.__m
            Key={}
            antiKey={}
            s=re.split(r'[()]',s) #以()分界
            while '' in s: # 消除''
                s.remove('')
            temp=[]
            lenKey={i+1 for i in range(m)} #密钥长度
            for i in range(len(s)): 
                for j in range(len(s[i])-1):
                    Key[int(s[i][j])]=int(s[i][j+1]) #密钥字典
                    antiKey[int(s[i][j+1])]=int(s[i][j]) #反密钥字典
                    temp.append(int(s[i][j])) #钥匙收录
                Key[int(s[i][-1])]=int(s[i][0]) #解决最后一个的问题
                antiKey[int(s[i][0])]=int(s[i][-1])
                temp.append(int(s[i][-1]))
            sameKey=lenKey-set(temp) #找到没有变化的密钥
            for i in sameKey:
                Key[i]=i
                antiKey[i]=i
            self.__key.append(Key)
            self.__key.append(antiKey)
    
        def enCode(self,p): #加密函数
            self.__apaMsg=p
            m=self.__m
            n=self.__n
            Key=self.__key[0]
            p=p.replace(' ','') #去除空格
            p+=' '*(m-len(p)%m) #末尾补齐
            n=len(p)//m #矩阵列数
            self.__n=n
            M=[p[i*m:(i+1)*m] for i in range(n)] #矩阵生成
            M=[M[i][Key[j+1]-1] for i in range(n) for j in range(m)] #矩阵转换
            M=''.join(M) #列表转换为字符串
            self.__secMsg=M
            return M
        
        def deCode(self,q):
            self.__apaMsg=p
            m=self.__m
            n=self.__n
            Key=self.__key[1]
            M=[q[i*m:(i+1)*m] for i in range(n)]
            M=[M[i][Key[j+1]-1] for i in range(n) for j in range(m)]
            M=''.join(M)
            self.__secMsg=M
            return M
        def Print(self):
            print(self.__m,self.__n,self.__key,self.__apaMsg,self.__secMsg)
    
    if __name__=='__main__':
        m=6
        p="Beijing 2008 Olympic Games"
        s='(143)(56)'
        a=colCode(m)
        a.getKey(s)
        q=a.enCode(p)
        e=a.deCode(q)
        a.Print()
    def main():
        pass
    
    
    展开全文
  • 数据加密——列置换加密

    千次阅读 2019-03-31 16:06:58
    刚刚看到考题中有个这样的题,考到了列置换加密,记录一下自己的理解。 列置换加密,概念性的东西就不说了,网上都有,直接写我自己的理解,干货。 从明文 ———— 密文 (加密) 现有明文:...

    刚刚看到考题中有个这样的题,考到了列置换加密,记录一下自己的理解。

    列置换加密,概念性的东西就不说了,网上都有,直接写我自己的理解,干货。

    1. 从明文 ———— 密文 (加密)

    现有明文:computrnetworkprinciple
    加密后密文为:cueripmrwpcepnoriottknl
    密钥为字符串: code
    过程:

    第一步先把密钥转换为一个数字,这个数字是加密的关键,转换方法为,首先得到字母的个数,这里code为4,然后得到1至这个数的所有数,这里为1,2,3,4.。然后按26个字母的顺序来,越靠前的,数字越小,若位置相同,则靠左边的越小,所以字符串code就等于 1423. 因为c最靠前,d其次,e第三,最后才是o, 所以c代表1,o代表4,e代表3,d代表2,连起来即1423.

    第二部,将明文转化为一个矩阵,矩阵的行个数为字母的个数,即为4,我们将明文转化后可得:
    c o m p
    u t r n
    e t w o
    r k p r
    i n c i
    p l e

    然后我们按照数字顺序去按列读取字母矩阵
    1 4 2 3
    先索引为1的列
    cuerip
    然后索引为2的列
    mrwpce
    然后3
    pnori
    然后4
    ottknl

    将上面的字符串连起来可得到密文。

    如果是解密的话,则反着填写矩阵就可以得到明文了。

    展开全文
  • 凯撒密码/列置换密码

    千次阅读 2019-09-13 00:45:33
    设Bob 给Alice 发送了frgh 和cuerippnori$ottknlmrwpce 两段密文。 其中第一段密文为密钥k=3( 字符集为26...第二段密文是采用了第一段密文的明文作为加密密钥的列置换密码( 填充字符为$) 。 试求: (1) 第一段密文...

    设Bob 给Alice 发送了frgh 和cuerippnori$ottknlmrwpce 两段密文。

    其中第一段密文为密钥k=3( 字符集为26 个小写英文字母) 的恺撒密码,

    第二段密文是采用了第一段密文的明文作为加密密钥的列置换密码( 填充字符为$) 。

    试求:
    (1) 第一段密文的明文:
    (2) 第二段密文的明文( 写出解密过程) 。

    (1) 恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左或向右移动一个固定数目的位置。
    例如,当偏移量是左移3的时候(解密时的密钥就是3): 
    明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ ;
    密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC。
    由密文frgh和密钥k=3,知明文为密文向右移动了3位,明文为code。
    (2) 第二段密文的密钥为code。列置换密码为从上往下写密文,读取为从左到右得到明文。
    密钥 c o d e
    顺序 1 4 2 3
    明文 c p o m

    u n t r
    e o t w
    r r k p
    i i n c
    p $ l e

    得到明文    comp utrn etwo  rkpr inci ple$

    去掉填充字符整理后的到明文    computer network principle 

     

    转载于:https://my.oschina.net/u/3876440/blog/3019502

    展开全文
  • 用c语言实现的古典密码算法列置换的演示程序。
  • 这是列置换加密的c程序,有关密码学的加解密
  • 行置换密码 (列置换密码)

    千次阅读 2013-05-06 23:44:18
    很多教材上对于行置换密码、列置换密码的定义都不是完全相同,甚至核心思想根本不一样。笔者就自己学习的经历,简单介绍一种一些教材上所谓的“行置换密码”的算法,大家一起交流、学习。   利用这种加密方法,...

    很多教材上对于行置换密码、列置换密码的定义都不是完全相同,甚至核心思想根本不一样。笔者就自己学习的经历,简单介绍一种一些教材上所谓的“行置换密码”的算法,大家一起交流、学习。

     

    利用这种加密方法,明文按行填写在一个矩阵中,而密文则是以预定的顺序按列读取生成的。例如如果矩阵是4列5行,那么明文“encryption algorithm”(省去空格后)可以如下写入该矩阵:

    2 3 1 4
    e n c r
    y p t i
    o n a l
    g o r i
    t h m s

     

    按一定的顺序读取列以生成密文。

    对于这个示例,如果读取顺序为递增顺序,则明文就是:“ctarm eyogt npnoh rilis”(添加空格只是为了便于观察)。这种加密法的密钥是列数和读取列的顺序。如果列数很多,记起来可能会比较困难,因此它可以表示成一个关键词,该关键词的长度等于列数,而其字母顺序决定读取列的顺序。

    例如,关键词“general”有7个字母,意味着矩阵有7列。由于“a”是“general”中字母顺序最低的,因此数字1放在第6列;从左往右,第一个“e”为其次,所以数字2放在第2列;第二个“e”则是使数字3放在第4列。最后的顺序如下:

    g  e  n  e  r  a  l

    4  2  6  3  7  1  5

    _______________________________________________________________________________________

    This scheme is to write the message in a rectangle, row by row, and read the message off, column by column, but permute the order of the columns.The order of the columns then becomes the key to the algorithm.For example, 

                Key:     4   3   1   2   5   6   7

            Plaintext:     a   t   t   a   c   k   p

                       o   s   t   p   o   n   e

                       d   u   n   t   i   l   t

                       w   o   a   m   x   y   z

         Ciphertext:  ttna aptm tsuo aodw coix knly petz (再次强调,空格只是为了便于观察)

    Thus, in this example, the key is 4312567.To encrypt, start with the column that is labeled 1, in this case column 3. Write down all the letters in that column.

    **************************************************************************************

    上述的是一次加密,也可把上述密文当做新一轮加密的明文,再次进行行置换加密。

     

    参考资料:

    《Cryptography and Network Security Principles and Practice, Fifth Edition》

                                                   ————William Stallings

    《Classical And Contemporary Cryptology》      ————Richard Spillman


    (下面这个代码运行时,代码所在文件夹下需要有“plain.txt”文件,里面必须全部是英文字母,可大小写混杂,但是不能有其他字符,如空格、回车、数字等)

    <span style="font-size:18px;">//Z26上的行置换密码
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<time.h>
    int length;//明文长度
    char plain[100000];
    char cipher[100000];
    char out[100000];
    int l;//密钥长度
    int key[100];//密钥
    int done_key[100]= {0}; //标记是否已经被转换为数字
    int num_key[100]= {0};//把密钥换成数字
    int num[100];//临时矩阵,存放使顺序递增的下标序号
    void gen();//密钥生成算法
    void encryption();
    void decryption();
    int length_str(int a[]);
    int main()
    {
        int i;
        FILE *fp;
        fp=fopen("plain.txt", "r");
        fscanf(fp, "%s", plain);//从文件读入明文
        fclose(fp);
        length=strlen(plain);
        gen();
        encryption();
        decryption();
         for(i=0;i<length;i++)
        {
            printf("%c", out[i]);
        }
        return 0;
    }
    void gen()//密钥生成算法
    {
        int i;
        printf("请输入想生成的随机密钥的长度:");
        scanf("%d", &l);
        srand(time(0));
        for(i=0; i<l; i++)
        {
            key[i]=rand()%26;
        }
        printf("\n随机产生的密钥串为:");
        for(i=0; i<l; i++)
        {
            printf("%c ", key[i]+97);
        }
        printf("\n\n");
    }//
    char a[50000][100];//临时矩阵,为了更方便的把密文转换出来
    //这个数组必须设置为全局的,在函数中声明的话申请内存会出错!!!
    void encryption()
    {
        ///转换:把密钥字符串排序,变成数字
        int k=1;
        int i, j, m;
        int small;//每轮循环给"最小"的字母编号(未编号的、靠前的、序号小的字母为最小)
        for(i=0; i<l; i++) //把字母换成从1开始的数字
        {
            m=0;
            while(done_key[m]==1)
                m++;
            small=m;
    
            for(j=0; j<l; j++)
            {
                if(done_key[j]==0)//没转换则继续
                    if(key[j]<key[small])
                        small=j;
            }
            num_key[small]=k;
            done_key[small]=1;
            k++;
        }//
        printf("The order of the key is :\n");
        for(i=0; i<l; i++)
        {
            printf("%d ", num_key[i]);
        }
        printf("\n");
        for(i=0; i<length; i++) //忽略非字母字符,把大写转换为小写
        {
            if(plain[i]>=65&&plain[i]<=90)
            {
                plain[i]+=32;
            }
        }
    
        while(length%l)
        {
            strcat(plain,"p");//不能整除时补上无效字符p
            length++;
        }
        //生成密文矩阵
        k=0;
    
        for(i=0; i<length/l; i++) //行
            for(j=0; j<l; j++) //列
            {
                a[i][j]=plain[k++];
            }
    
        k=0;
        for(i=0;i<l;i++)//列
        {
            for(j=0;j<l;j++)
                if(num_key[j]==i+1)
                    num[i]=j;
        }
    
        k=0;
        for(m=0;m<l;m++)//列
            for(j=0;j<length/l;j++)//行
                cipher[k++]=a[j][num[m]];
    }
    
    char b[50000][100];
    void decryption()//解密函数
    {
        int i, j, k;
        k=0;
        for(i=0;i<l;i++)//num[i]作为列
            for(j=0;j<length/l;j++)//行
                b[j][num[i]]=cipher[k++];
    
        k=0;
        for(i=0;i<length/l;i++)//行
            for(j=0;j<l;j++)//列
                out[k++]=b[i][j];
    
    }</span>

    展开全文
  • 置换密码(Permutation ...常见的置换密码有两种:列置换密码和周期置换密码。  一、列置换加密  将明文字符P以固定的分组宽度m按行写出,构成m x n的矩阵[M]mxn,不够的按双方约定的字符补充,比如空格字符。然...
  • https://codeday.me/bug/20180823/227497.html 我有两个文件: f1: 111 aaa 444 222 bbb 555 333 ccc 666 ...如何使用awk替换“f1”中的第二,使用“f2”中的第三? 最佳答案 尝试: awk 'F...
  • https://moriarty98.github.io/2019/06/09/%E7%BB%B4%E5%90%89%E5%B0%BC%E4%BA%9A%E8%A1%A8%E5%92%8C%E5%88%97%E7%BD%AE%E6%8D%A2%E7%BB%93%E5%90%88%E5%8A%A0%E5%AF%86/ 我将整个完整的实现过程发布在了我的博客...
  • 置换密码 代码如下: #置换密码 a = input('请输入明文:') print("逆序后的密文为:",a[::-1]) 结果如图: 代码如下: #栅栏技术(栏数为7) a = input('请输入明文:') b = [] c = [] b.extend(a) len = len(b...
  • 通过编程实现Column permutation加密,更加深入的了解其原理,掌握Column permutation算法。...只能了解一下列置换密码的原理,也就是动手练习练习,不能实际应用。 程序运行如下:
  • 行列置换(2000中的交叉表.2005中的处理方法.及相关合计字段的处理.)declare @t table(name varchar(10),object varchar(10),score int)insert into @t select a,EN,89union all select a,CH,78union ...
  • 矩阵 左乘 行向量 即 对矩阵进行 行变换: 左乘 置换矩阵:   矩阵 右乘 向量 即 对矩阵进行 变换: 右乘 置换矩阵:  
  • 在Excel中把横行与竖进行置换:复制要置换的单元,在新的单元上右键-》选择性复制,会出现对话框,选中“置换”,即可在Excel中打勾号,左手按住ALT不放,右手在小键盘也就是右边的数字键盘依次输入41420这几个数字...
  • 周期置换密码

    2020-04-17 11:04:01
    加密解密过程 ...然后对每组中的子串按1,2…,m的某个置换重新排列位置从而得到密文,其中密钥σ包含分组长度信息。解密时同样对密文c按长度m分组,并按σ的...和上次提及的列置换密码类似 代码 import re class tim...
  • C语言双重置换加密

    千次阅读 2016-11-25 17:30:25
    密钥:置换规则:(1,2,3,4,5,6,7,8)->(2,3,4,5,6,7,8,1)进行行置换,(1,2,3,4,5,6,7,8)->(3,4,5,6,7,8,1,2)进行列置换。#include #include int main(){ char yw[3][50] = {"大风起兮云飞扬,", "威加海内兮
  • 1.1)列置换密码: 明文遵照密钥规则按列换位,按列读出明文序列得到密文。 加密:明文分段,不足则填充,根据密钥以列为单位进行互换,按行从左到右写出,得到密文。 解密:密文分段,根据密钥逆置换以列为单位进行...
  • 在excel表格中,我们会碰到需要把行变成,或者是把变成行的情况, 方法一,使用复制,选择性粘贴,置换操作。 gif动画演示教程如下: 步骤: 1,复制需要置换的区域。 2,点击新的,要置换的开始位置。 3...
  • select v1.lookup_value_name as 列名1, v.lookup_value_name as 列名2 from 主表名 i  left join (lookup_type t left join lookup_value v on t.lookup_type_id = v.lookup...要置换的列名1=v.lookup_value_c...
  • 我们在高斯消元法,Gauss-Jordan求矩阵的逆,还有矩阵的 ...矩阵就是把恒等矩阵中行的次序打乱,当然,你也可以看成是将 中的次序打乱,例如: 。 可以扰动 的多行,行互换矩阵是置换矩阵的一种。 矩阵左乘 是将...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 282
精华内容 112
关键字:

列置换