希尔密码(Hill Password)是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。每个字母当作26进制数字:A=, B=, C=... 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果MOD26。注意用作加密的矩阵(即密匙)在\mathbb_^n必须是可逆的,否则就不可能译码。只有矩阵的行列式和26互质,才是可逆的

#include<stdio.h>  
#include<string.h>
#include<ctype.h>
#include<stdlib.h>

][];//转化矩阵
][];//单位矩阵[A E]
][];//矩阵的逆矩阵A^(-1)
][];//明文矩阵
][];//密文矩阵
int n;//矩阵的阶数
void input()//输入数据
{
    int i, j;
    ; i <= n; i++ )
        ; j <= n; j++ )
            A[i][j] = rand() % ;
    memcpy( a, A, sizeof( A ) );//将矩阵A复制给a
    ; i <= n; i++ )//将矩阵变成[a E]的形式,E为单位矩阵
    {
        ; j <= *n; j++ )
        {
            if( i + n == j )
                a[i][j] = ;
            else
                a[i][j] = ;
        }
    }
}

void output()     //输出函数
{
    int i,j;
    printf("矩阵A的元素\n");
    ; i <= n; i++ )
    {
        ; j <= n; j++ ){
            printf("%d ",A[i][j]);
        }
        printf("\n");
    }
    printf("A矩阵的逆矩阵B为\n");
    ; i <= n; i++ )//输出A矩阵的逆矩阵B
    {
        ; j <= n; j++ )
        {
            B[i][j] = a[i][j+n];
            printf("%d ",B[i][j]);

        }
        printf("\n");
    }
}

int Extend_Gcd( int a, int b, int &x, int &y )//扩展欧几里得算法
{
     )
    {
        x = ;
        y = ;
        return a;
    }
    int r = Extend_Gcd( b, a % b, x, y );
    int t = x;
    x = y;
    y = t - a / b * y;
    return r;
}

int ni( int a)//求逆a*x=1(mod n)
{
    int x, y;
    , x, y );
     )
         +  ) % ;
    else
        ;
}

int gaosi()//高斯-约当消元求A矩阵的逆矩阵B
{
    int i, j, k;
    ; k <= n; k++ )//高斯-约当消元
    {
        int Ni = ni( a[k][k] );
         ) ;
        ; i <=  * n; i++ )
            a[k][i] = ( a[k][i] *  Ni %  +  ) % ;
        ; i <= n; i++ )
        {
            if( i == k ) continue;
            ; j <=  * n; j++ )
                a[i][j] = ( ( a[i][j] - a[i][k] * a[k][j] %  ) %  +  ) % ;
        }
    }
    ;
}

void jiami()    //加密过程
{
    int i, j, k;
    ];
    char mingc;

    printf("请输入明文");
    scanf("%s",&mingstr);
    int len = strlen( mingstr );
    if( len % n )
    {
        for( i = len; i < len/n*n+n; i++)
            mingstr[i] = 'a';
        mingstr[i] = '\0';
    }
    puts( mingstr );
    int Len = strlen( mingstr );
    ; i <= Len/n; i++ )//将明文分成len/n段
    {
        ; j <= n; j++ )//求每一段的明文转换为矩阵
        {
            )*n+j-] >= )*n+j-] <= 'z' )
                ming[i][j] = mingstr[(i-)*n+j-] - 'a';
            else
                ming[i][j] = mingstr[(i-)*n+j-] - 'A';
        }
    }
    ; k <= Len/n; k++ )//求len/n段的密文矩阵
    {
        ; i <= n; i++ )//利用矩阵的乘法
        {
            mi[k][i] = ;
            ; j <= n; j++ )
                mi[k][i] = ( mi[k][i] + ming[k][j] * A[j][i] %  +  ) % ;
        }
    }
    printf("密文为");
    ; i <= Len/n; i++ )//输出密文
    {
        ; j <= n; j++ )
        {
            mingc = mi[i][j] + 'A';

            printf("%c",mingc);
        }

    }
    printf("\n");
}

void jiemi()   //解密过程
{
    int i, j, k;
    ];
    char mingc;
    printf("请输入密文");
    scanf("%s",&mistr);
    int len = strlen( mistr );
    ; i <= len/n; i++ )//将密文分成len/n段
    {
        ; j <= n; j++ )//求每一段的密文转换为矩阵
        {
            )*n+j-] >= )*n+j-] <= 'z' )
                mi[i][j] = mistr[(i-)*n+j-] - 'a';
            else
                mi[i][j] = mistr[(i-)*n+j-] - 'A';
        }
    }
    ; k <= len/n; k++ )//求len/n段的明文矩阵
    {
        ; i <= n; i++ )//利用矩阵的乘法
        {
            ming[k][i] = ;
            ; j <= n; j++ )
                ming[k][i] = ( ming[k][i] + mi[k][j] * B[j][i] %  +  ) % ;
        }
    }
    printf("明文为");
    ; i <= len/n; i++ )//输出明文
    {
        ; j <= n; j++ )
        {
            mingc = ming[i][j] + 'A';

            printf("%c",mingc);
        }

    }
    printf("\n");

}

int main()
{
int flag;
    do{
        printf( "1.加密2.解密3.退出\n");
        scanf("%d",&flag);
        )
        {printf("请输入加密矩阵的阶数n:");
        scanf("%d",&n);
        do{
            input();//数据输入
        }while( !gaosi() );
         output();
         jiami();}//加密过程
        )
        {jiemi();//解密过程
        }
        &&flag!=&&flag!=) printf("输入错误,请重新输入!\n");
    });
      ;
}

Hill密码的更多相关文章

  1. 信息安全-2:python之hill密码算法[原创]

    转发注明出处:http://www.cnblogs.com/0zcl/p/6106513.html 前言: hill密码算法我打算简要介绍就好,加密矩阵我用教材上的3*3矩阵,只做了加密,解密没有做, ...

  2. Hill密码解密过程(Java)

    Hill密码是一种传统的密码体系.加密原理:选择一个二阶可逆整数矩阵A称为密码的加密矩阵,也就是这个加密体系的密钥.加密过程: 明文字母依次逐对分组,例如加密矩阵为二阶矩阵,明文就两个字母一组,如果最 ...

  3. javascript实现playfair和hill密码算法

    时至期末,补习信息安全概论作业.恰巧遇古典密码学算法中的playfair算法和hill算法,用javascript语言实现起来是在有趣,边查百度边编码,顺便好好补习一下javascript基础. pl ...

  4. 4 多表代替密码之Hill 密码 2实现

    该解密方法的KEY 不是一个数或者一段字符串,而是一个矩阵, 比如有个3*3的KEY: 那么如果我们要加密一个长度为N的字符串, 那么把N除以3,分成M个3个字母组成的小段, 对每个小段尽心加密: 1 ...

  5. 4 多表代替密码之Hill 密码_1 矩阵工具类

    在说明Hill加密之前要先复习线性代数的知识,主要是关于矩阵的一些运算和概念. 一.矩阵的逆: 定义方阵M的逆矩阵应该满足M*M^-1==I,其中I是单位矩阵,比如: 但是这个地方是对英文字母进行加密 ...

  6. 信息安全-1:python之playfair密码算法详解[原创]

    转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...

  7. 希尔密码(Hill Cipher)的实现

    原理应该不用多讲了,自己百度就可以. C++实现: #include <iostream> #include <string> #include <memory.h> ...

  8. ctf古典密码从0到

    本文首发于“合天智汇”公众号 作者:淡灬看夏丶恋雨 古典密码和现代密码的区别: 代换密码 单表代换密码 字符或数学型 凯撒密码 仿射密码 四方密码 培根密码 图表 标准银河字母 圣堂武士密码 猪圈密码 ...

  9. 对抗密码破解 —— Web 前端慢 Hash

    (更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...

随机推荐

  1. [WP8] ListBox的Item宽度自动填满

    [WP8] ListBox的Item宽度自动填满 范例下载 范例程序代码:点此下载 问题情景 开发WP8应用程序的时候,常常会需要使用ListBox作为容器来呈现各种数据集合.但是在ListBox呈现 ...

  2. TeamCity配置笔记

    1.编译sln 2.发布网站 3.重复代码检测 4.代码分析 5.单元测试&覆盖率测试 查看代码覆盖率 7.代码签入时自动触发编译 8.通知 1.在teamcity安装目录中找到TrayNot ...

  3. swift学习笔记之-错误处理

    //错误处理 import UIKit /*错误处理(Error Handling):响应错误以及从错误中恢复的过程 在 Swift 中,错误用符合ErrorType协议的类型的值来表示.这个空协议表 ...

  4. javascript --- Ajax基础

    神马是Ajax? Ajax即‘Asynchronous javascript and XML’(异步javascript和XML),也就是所谓的无刷新页面读取技术. http请求 首先要了解http请 ...

  5. JAVA-使用commos-fileupload实现文件上传与下载

    一文件的上传 实体类 在CODE上查看代码片派生到我的代码片 import java.sql.Timestamp; /** * * @Decription 文件上传实体类 * @author 刘楠 * ...

  6. android 进程间通信---bind的前世

    在分析bind机制之前,我发现已经有一篇文章讲解的非常清晰,并且提出了很多问题. 地址:http://my.oschina.net/keeponmoving/blog/64218 一.Linux系统进 ...

  7. select_tag 选择后自动提交,并且保持选择的项

    使用select来选择,,,选择就响应真是花了好大的功夫....你妹...在controller设置变量来储存选择后的值...js中如果select选择为空那么传入的值是””而不是null selec ...

  8. android5.x新特性之Tinting

    Android5.X对图形操作上有更多的功能.下面来看看Tinting(着色) Tinting的使用非常简单,几乎 没什么好说的,只要在xml中配置好tint和tintMode即可.直接看实际例子吧. ...

  9. Effective Java 27 Favor generic methods

    Static utility methods are particularly good candidates for generification. The type parameter list, ...

  10. Effective Java 72 Don't depend on the thread scheduler

    Principle Any program that relies on the thread scheduler for correctness or performance is likely t ...