希尔密码(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. 【GOF23设计模式】命令模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_命令模式.数据库事务机制底层架构实现.撤销和回复 package com.test.command; public cla ...

  2. <<摩托车修理技术与禅>>读书笔记

    一旦想要求快,就表示你再也不关心它,而想去做别的事. 感触比较大的一句话.其实每个人看书,都有不同的侧重点,不同经历的人看同样的书,收获是不一样的,所以不能在乎收获多少,只要有收获就行.

  3. Crash日志符号化

    1.符号化crash日志需要3样东西: 1).crash日志本身(如:example.crash),从Xcode的organizer导出或者来自Itunes Connect. 2).crash日志所对 ...

  4. 消除 activity 启动时白屏、黑屏问题

    默认情况下 activity 启动的时候先把屏幕刷成白色,再绘制界面,绘制界面或多或少有点延迟,这段时间中你看到的就是白屏,显然影响用户体验,怎么消除呢? 在 Activity theme 设置sty ...

  5. 【读书笔记】iOS-NSString的length

    NSString的length方法能够准确无误地处理国际字符串,如含有俄文,中文或者日本文字符的字符串,以及使用Unicode国际字符标准的字符串.在C语言中处理这些国际字符串是件令人非常头疼的事情 ...

  6. UnityShader之Shader格式篇【Shader资料1】

    关于Shader,在Unity里面我们一般叫做ShaderLab,只要你的职业是与渲染搭边,Unity就与ShaderLab有着直接的关联,你都应该试着去学会它,其实我们在新手未有入门的时候,我们总是 ...

  7. iOS UIWebView和网页的交互(OC中调执行JS)

    UIWebView和网页的交互(OC中调执行JS)- (void)viewDidLoad{[super viewDidLoad];// 1.webViewUIWebView *webView = [[ ...

  8. iOSQuartz2D-03-定制个性头像

    效果图 将一张图片剪切成圆形 在图片周围显示指定宽度和颜色的边框 实现思路 效果图中主要由不同尺寸的两大部分组成 蓝色的背景区域,尺寸等于图片的尺寸加上边框的尺寸 图片区域,尺寸等于图片的尺寸 绘制一 ...

  9. 使用eclipse遇到问题:the-package-collides-with-a-type

    相似问题:http://stackoverflow.com/questions/12236909/the-package-collides-with-a-type

  10. Android精品开源整理

    一.兼容类库 ActionBarSherlock : Action Bar是Android 3.0后才开始支持的,ActionBarSherlock是让Action Bar功能支持2.X后的所有平台, ...