playfair密码解密加密

#include
#include
#include
#include

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

void output()     //输出函数
{
    int i,j;
    printf("矩阵A的元素\n");
    for( i = 1; i <= n; i++ )
    {
        for( j = 1; j <= n; j++ ){
            printf("%d ",A[i][j]);
        }
        printf("\n");
    }
    printf("A矩阵的逆矩阵B为\n");
    for( i = 1; i <= n; i++ )//输出A矩阵的逆矩阵B
    {
        for( j = 1; 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 )//扩展欧几里得算法
{
    if( b == 0 )
    {
        x = 1;
        y = 0;
        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;
    int d = Extend_Gcd( a, 26, x, y );
    if( d == 1 )
        return ( x % 26 + 26 ) % 26;
    else
        return -1;
}

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

void jiami()    //加密过程
{
    int i, j, k;
    char mingstr[100];
    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 );
    for( i = 1; i <= Len/n; i++ )//将明文分成len/n段
    {
        for( j = 1; j <= n; j++ )//求每一段的明文转换为矩阵
        {
            if( mingstr[(i-1)*n+j-1] >= ‘a‘ && mingstr[(i-1)*n+j-1] <= ‘z‘ )
                ming[i][j] = mingstr[(i-1)*n+j-1] - ‘a‘;
            else
                ming[i][j] = mingstr[(i-1)*n+j-1] - ‘A‘;
        }
    }
    for( k = 1; k <= Len/n; k++ )//求len/n段的密文矩阵
    {
        for( i = 1; i <= n; i++ )//利用矩阵的乘法
        {
            mi[k][i] = 0;
            for( j = 1; j <= n; j++ )
                mi[k][i] = ( mi[k][i] + ming[k][j] * A[j][i] % 26 + 26 ) % 26;
        }
    }
    printf("密文为");
    for( i = 1; i <= Len/n; i++ )//输出密文
    {
        for( j = 1; j <= n; j++ )
        {
            mingc = mi[i][j] + ‘A‘;

            printf("%c",mingc);
        }

    }
    printf("\n");
}

void jiemi()   //解密过程
{
    int i, j, k;
    char mistr[100];
    char mingc;
    printf("请输入密文");
    scanf("%s",&mistr);
    int len = strlen( mistr );
    for( i = 1; i <= len/n; i++ )//将密文分成len/n段
    {
        for( j = 1; j <= n; j++ )//求每一段的密文转换为矩阵
        {
            if( mistr[(i-1)*n+j-1] >= ‘a‘ && mistr[(i-1)*n+j-1] <= ‘z‘ )
                mi[i][j] = mistr[(i-1)*n+j-1] - ‘a‘;
            else
                mi[i][j] = mistr[(i-1)*n+j-1] - ‘A‘;
        }
    }
    for( k = 1; k <= len/n; k++ )//求len/n段的明文矩阵
    {
        for( i = 1; i <= n; i++ )//利用矩阵的乘法
        {
            ming[k][i] = 0;
            for( j = 1; j <= n; j++ )
                ming[k][i] = ( ming[k][i] + mi[k][j] * B[j][i] % 26 + 26 ) % 26;
        }
    }
    printf("明文为");
    for( i = 1; i <= len/n; i++ )//输出明文
    {
        for( j = 1; 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);
        if(flag==1)
        {printf("请输入加密矩阵的阶数n:");
        scanf("%d",&n);
        do{
            input();//数据输入
        }while( !gaosi() );
         output();
         jiami();}//加密过程
        else if(flag==2)
        {jiemi();//解密过程
        }
        else if(flag!=1&&flag!=2&&flag!=3) printf("输入错误,请重新输入!\n");
    }while(flag!=3);
      return 0;
}
*******************************************************************************************

#ifndef _PLAY_FAIR_H_
#define _PLAY_FAIR_H_

void cst_playfair_table (char *in_key);
void prnt_playfair_table ();
int playfair_encrypt (char *plain_txt, char *cipher_txt);
int playfair_decrypt (char *cipher_txt, char *plain_txt);

#endif

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

#include
#include
#include
#include "playfair.h"
#include "playfair.c"
int main ()
{
    char plain_txt[1000], cipher_txt[1000];
    char key[26] = {0};
    printf ("输入加密密钥: ");
    scanf ("%s", key);
    cst_playfair_table (key);
    printf ("密钥矩阵为:\n");
    prnt_playfair_table ();
    printf ("输入明文: ");
    scanf ("%s", plain_txt);
    playfair_encrypt (plain_txt, cipher_txt);
    printf ("密文为: %s\n", cipher_txt);
    playfair_decrypt (cipher_txt, plain_txt);
    printf ("把密文解密 :%s\n", plain_txt);

    return 0;
}
*****************************************************
时间: 2024-10-18 18:08:18

playfair密码解密加密的相关文章

[Offer收割]编程练习赛6 题目1 : Playfair密码表 (密码学——模拟)

传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho经常用Playfair密码表加密自己的代码. 密码表是按以下步骤生成的. 随机选择一个只包含大写字母的单词S作为密钥. 将S中的所有字母J替换为字母I. 将S中的字母依次填写进一个5x5的矩阵,按照从上到下.从左到右的顺序填充格子.填充过程中略过已经在密码表中的字母. 将'A'-'I', 'K'-'Z'(除去J之外的所有大写字母)中没有出现在密码表中的大写字母按照字母表顺序填入矩阵剩余的格子中.

使用kettle转换中的JavaScript对密码进行加密和解密

日常开发中,为了确保账号和密码的安全,时常要对密码进行加密和解密.然而kettle是怎么对密码进行加密和解密的呢? 下面的代码需要再转换中的JavaScript中运行. var encrypted_password = 'not encrypted'; 加密(js中调用): encrypted_password = "Encrypted " + Packages.org.pentaho.di.core.encryption.Encr.encryptPassword(clear_pass

将 Shiro 作为应用的权限基础 五:密码的加密/解密在Spring中的应用

考虑系统密码的安全,目前大多数系统都不会把密码以明文的形式存放到数据库中. 一把会采取以下几种方式对密码进行处理 密码的存储 "编码"存储 Shiro 提供了 base64和 16 进制字符串编码/解码的 API支持,方便一些编码解码操作. Shiro内部的一些数据的存储/表示都使用了 base64和 16 进制字符串. 下面两端代码分别对其进行演示 Stringstr = "hello"; Stringbase64Encoded = Base64.encodeTo

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

转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere(维吉尼尔)密码.Playfair密码.Hill密码-- 明文:未经过加密的信息:密文:加密后的信息 加密解密的过程:如下图 二.Caesar密码 这里我先简单讲下恺撒密码,咸觉挺简单的,后面再主要讲Playfair算法原理与编程. 基本原理: 在开拓罗马帝国的时候,恺撒担心信使会阅读他送给士兵的命

playfair密码java实现

这次,使用java来模拟现实playfair密码加密解密过程 import java.util.HashSet; import java.util.Scanner; public class Test1 { public static char a[][] = new char[5][5]; public static String Encryptkey = ""; public static void main(String[] args) { // TODO Auto-genera

密码学笔记——playfair密码

 Playfair密码(Playfair cipher 或 Playfair square)一种替换密码,1854年由查尔斯·惠斯通(Charles Wheatstone)的英国人发明. 例题: 某种加密方式,玩一玩吧 密钥:shiyanb 密文:KQSAMFPAOPMFPA hint:一律采用横向 Hint: key小写 1.编制密码表 编一个5*5的密码表,共有5行5列字母.第一列(或第一行)是密钥,其余按照字母顺序,如果密钥过长可占用第二列或行.密钥是一个单词或词组,若有重复字母,可将后面

Linux-weblogic 10.3.6控制台密码解密过程

weblogic控制台密码丢失影响系统更新版本 在保证中间件正常运行的情况下,将加密后的密码解密从而登录控制台 前提是有中间件所在服务器的权限,普通用户即可 需要的文件: SerializedSystemIni.dat   这是weblogic的加密密钥,仅有一个,若找不到可使用find命令查找 我的路径为:/home/anker/domains/anker_domain/security/SerializedSystemIni.dat setWLSEnv.sh   配置环境变量用 我的路径:/

discuz 密码解密

百无聊赖中想看看discuz密码的加密方式,发现密码和邮箱这个东西最好有好几个,不然被脱库一个,你的网络上的帐号都是危险,然后分等级去用. 比如:支付宝.银行卡.网银之类的密码和邮箱最好单独使用一个,分为最高等级. 第二级是一些重要但是不涉及资产的,如:12306之类的,单独一个,此为第二等级 第三级是一些其他帐号密码,就算丢了对自己损失不大,既没有隐私也没有财产损失 第四类是一些垃圾网站非得注册,丢了重新注册无所谓的. 以下是解密步骤 mysql> select username,passwo

如何保证用户登陆时提交密码已经加密

如何保证用户登陆时提交密码已经加密?密码是否已加密,需要客户端和服务端建立约定,双方按约定办事就行了. 这里提到的另一个问题是,如何保证传输安全?最理想的方案当然是走 HTTPS 协议. HTTPS 在理论上是可靠的,但在国内会打一些折扣:你可以随便找一台电脑看看有没有安装商业公司或机构的根证书,这些根证书为线路某节点成为中间人提供了可能性:同时,在木马横行的年代,密码在加密提交前可能就被拿到了,此时 HTTPS 成了摆设,这是为什么国内流行密码控件的一个重要原因. 从成本和需求上考虑,对于众多