日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hill密码源代码c语言,古典密码(Hill加密算法)(示例代码)

發(fā)布時間:2023/12/10 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hill密码源代码c语言,古典密码(Hill加密算法)(示例代码) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

“Hill的加密與解密”

Hill加密是另一種多字母代替密碼,與多表代替密碼不同的是,Hill密碼要求將明文分成同等規(guī)模的若干個分組(最后一個分組涉及到填充),每一個分組被整體的加密代換,即希爾密碼屬于分組加密。Hill密碼的算法思想是:將一個分組中的d個連續(xù)的明文字母通過線性變換轉(zhuǎn)換為d個密文字母。這種變換由d個線性方程決定,其中每個字母被分配一個數(shù)值(0,1,。。。,25)。解密只需要做一次逆變換就可以了,密鑰就是變換矩陣本身。

設(shè)明文為一維矩陣m,密文為一維矩陣c,密鑰用k矩陣表示,則:

即密文分組=明文分組*密鑰矩陣。

本程序使用的密鑰是:

下面是具體的源程序:—頭文件:classical.h

#pragma?once

//古典密碼之希爾加密

#include?

#include?

#define?ROW?4????//行

#define?COL?4?????//列

int*?plus(int(*K)[COL],?int?*?num)?????//進行加密

{

int?*arr?=?(int?*)calloc(sizeof(int),4);

int?sum?=?0;

int?sub?=?0;

for?(int?i?=?0;?i?

{

for?(int?j?=?0;?j?

{

sum?=?(*(num?+?j))?*?(*(*(K?+?j)?+?i));

sub?=?sub?+?sum;

}

arr[i]?=?(arr[i]?+?sub)?%?26;

sub?=?0;

}

return?arr;

}

int?fun(int?i,?int?j,?int(*K)[COL])???????//求伴隨矩陣

{

int?num?=?0;

int?arr[ROW][COL]?=?{?0?};

int?left?=?0;

int?right?=?0;

for?(int?k1?=?0;?k1?

{

for?(int?k2?=?0;?k2?

{

if?(k1?

{

arr[k1][k2]?=?*(*(K?+?k1)?+?k2);

}

else?if?(k1??j)

{

arr[k1][k2?-?1]?=?*(*(K?+?k1)?+?k2);

}

else?if?(k1?>?i?&&?k2?>?j)

{

arr[k1?-?1][k2?-?1]?=?*(*(K?+?k1)?+?k2);

}

else?if?(k1?>?i?&&?k2?

{

arr[k1?-?1][k2]?=?*(*(K?+?k1)?+?k2);

}

}

}

left?=?arr[1][1]?*?arr[2][2]?*?arr[0][0]?+?arr[0][1]?*?arr[1][2]?*?arr[2][0]

+?arr[1][0]?*?arr[2][1]?*?arr[0][2];

right?=?arr[0][2]?*?arr[1][1]?*?arr[2][0]?+?arr[0][1]?*?arr[1][0]?*?arr[2][2]

+?arr[0][0]?*?arr[1][2]?*?arr[2][1];

num?=?pow((double)(-1),?(i?+?1)?+?(j?+?1))?*?(left?-?right);

return?num;

}

int*?answer(int(*K)[COL],?int?*?str,?int?det)??????//希爾解密

{

int?ptr[ROW][COL]?=?{?0?};?????//ptr為逆矩陣

int*?ans?=?(int?*)calloc(sizeof(int),?4);

int?sum?=?0;

int?sub?=?0;

int?bag?=?0;

for?(int?i?=?0;?i?

{

for?(int?j?=?0;?j?

{

bag?=?fun(i,?j,?K)?/?(det);

if?(bag?

{

ptr[j][i]?=?(26?+?bag)?%?(26);

}

else

{

ptr[j][i]?=?bag?%?(26);

}

}

}

for?(int?i?=?0;?i?

{

for?(int?j?=?0;?j?

{

sum?=?(*(str?+?j))?*?ptr[j][i];

sub?=?sub?+?sum;

}

ans[i]?=?(ans[i]?+?sub)?%?26;

sub?=?0;

}

return?ans;

}

void?menu()??????//菜單

{

printf("??????——古典密碼??????????\n\n");

printf("**********???1.加密????*******\n");

printf("**********???2.解密????*******\n");

printf("**********???0:退出????*******\n");

printf("請選擇:");

}

char*?inputclear()???????//輸入明文

{

printf("請輸入明文:");

char?num[20]?=?{‘\n‘};

char?*ptr?=?num;

int?i?=?0;

char?ch;

fflush(stdin);??????//清除緩沖區(qū)

while?((ch?=?getchar())?!=?‘\n‘)

{

num[i]?=?ch;

i++;

}

return?ptr;

}

char*?inputsecret()???????//輸入密文

{

printf("請輸入密文:");

char?num[20]?=?{?‘\n‘?};

char?*ptr?=?num;

int?i?=?0;

char?ch;

fflush(stdin);??????//清除緩沖區(qū)

while?((ch?=?getchar())?!=?‘\n‘)

{

num[i]?=?ch;

i++;

}

return?ptr;

}

void?judge(int?n,?int(*K)[4])?????//處理加密或解密

{

char?*ptr,?*pln;

int?src[20];

int?num[4]?=?{?0?};

int?*parr?=?NULL;

int?*pnum?=?NULL;

int?det?=?-1;?????//計算K的行列式的值

switch?(n)

{

case?1:?????????????????????????????????//加密

ptr?=?inputclear();

for?(int?i?=?0;?i?

{

if?(*ptr?!=?‘\n‘?&&?*ptr?!=?EOF)

{

src[i]?=?*(ptr?+?i)?-?‘A‘;

}

else

{

break;

}

}

printf("加密后得到的密文:");

pnum?=?src;

while?(*pnum?>=?0?&&?*pnum?<=?25)

{

for?(int?i?=?0;?i?

{

num[i]?=?*(pnum?+?i);

}

parr?=?plus(K,?num);

for?(int?j?=?0;?j?

{

printf("%c",?*(parr+j)?+?‘A‘);

}

pnum?=?pnum?+?ROW;

}

printf("\n");

free(parr);

break;

case?2:

pln?=?inputsecret();

for?(int?i?=?0;?i?

{

if?(*pln?!=?‘\n‘?&&?*pln?!=?EOF)

{

src[i]?=?*(pln?+?i)?-?‘A‘;

}

else

{

break;

}

}

printf("解密后得到的明文:");

pnum?=?src;

while?(*pnum?>=?0?&&?*pnum?<=?25)

{

for?(int?i?=?0;?i?

{

num[i]?=?*(pnum?+?i);

}

parr?=?answer(K,?num,?det);

for?(int?j?=?0;?j?

{

printf("%c",?*(parr?+?j)?+?‘A‘);

}

pnum?=?pnum?+?ROW;

}

printf("\n");

free(parr);

break;

case?0:

exit(EXIT_FAILURE);

default:

break;

}

}

—源文件:test.cpp

#define?_CRT_SECURE_NO_WARNINGS?1

//希爾加密

#include?

#include?

#include?"classical.h"

int?main()

{

int?K[4][4]?=?{?{?8,?6,?9,?5?},?{?6,?9,?5,?10?},?{?5,?8,?4,?9?},?{?10,?6,?11,?4?}?};???//密鑰

int?left=K[0][0]?*?K[1][1]?*?K[2][2]?*?K[3][3]?+?K[1][0]?*?K[0][3]?*?K[3][2]?*?K[2][1]+?K[2][0]?*?K[3][1]?*?K[0][2]?*?K[1][3]?+?K[3][0]?*?K[0][1]?*?K[1][2]?*?K[2][3];

int?right?=?K[0][3]?*?K[1][2]?*?K[2][1]?*?K[3][0]?+?K[0][0]?*?K[1][3]?*?K[2][2]?*

K[3][1]+?K[0][1]?*?K[1][0]?*?K[2][3]?*?K[3][2]?+?K[0][2]?*?K[1][1]?*?K[2][0]?*?K[3][3];

int?n?=?0;

menu();

scanf("%d",?&n);

judge(n,?K);

system("pause");

return?0;

}

—運行結(jié)果:

Hill加密:

Hill解密:

很明顯,Hill密碼將解密的長消息分組,分組的長度取決于密鑰矩陣的維數(shù),Hill密碼的強度在于完全隱藏了單字母的頻率。字母和數(shù)字的對應(yīng)也可以更改為其他的方案,使得不容易攻擊成功。一般來說,對抗僅有密文的攻擊強度較高,但易受到已知明文攻擊。

本文出自 “無心的執(zhí)著” 博客,謝絕轉(zhuǎn)載!

總結(jié)

以上是生活随笔為你收集整理的hill密码源代码c语言,古典密码(Hill加密算法)(示例代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。