放射密碼可以說是凱撒密碼的升級,在凱撒密碼中,明文字母表向前或者向后移動一個固定數(shù)值,得到密文,在仿射密碼中,給加密函數(shù)添加了一個系數(shù)。
加密函數(shù)有參數(shù)(a,b),作為密鑰,x表示的就是明文字符。明文字母可以轉(zhuǎn)換為0~25這些數(shù)值,p=26.解密函數(shù)中,需要求a的逆元,例如a=7,那么a的逆元可以是15(最小的正整數(shù))。
(乘法逆元的求解,可以借助擴展歐幾里得算法實現(xiàn)。)
仿射密碼的實現(xiàn)過程如下。
#include
#include
//最大公約數(shù)
int gcd(int m, int n)
{
int r;
while (0 != n)
{
r = m % n;
m = n;
n = r;
}
return m;
}
//擴展歐幾里得算法
//m*x+n*y=gcd(m,n)
int exgcd(int a, int p, int *x, int *y)
{
if (0 == p) //遞歸終止條件
{
*x = 1;
*y = 0;
return a;
}
int gcd = exgcd(p, a % p, x, y); //遞歸求解最大公約數(shù)。
int temp = *x;
*x = *y; //回溯表達式1:x1 = y2;
*y = temp - a / p * (*y); //回溯表達式2:y1 = x1 - m/n * y2;
return gcd;
}
//a*x=1(mod p) 乘法逆元
//a與p互素,a關于模p的乘法逆元有解
int inv(int a, int p, int *x, int *y)
{
int gcd = exgcd(a, p, x, y);
if (1 != gcd) //說明乘法逆元不存在
{
return -1;
}
else
{
return (*x + p) % p; //為了使余數(shù)一定為正數(shù)
}
}
//加密算法
void encrypt(char data[], int a, int b, int p){
int i = 0;
while(data[i]){
if(data[i] >= 'A' && data[i] <= 'Z'){
data[i] = (a * (data[i] - 'A') + b) % p + 'A';
}
else if(data[i] >= 'a' && data[i] <= 'z'){
data[i] = (a * (data[i] - 'a') + b) % p + 'a';
}
else{
data[i] = data[i];
}
i ++;
}
}
//解密算法
void decrypt(char data[], int a, int b, int p){
int i = 0;
int x = 0, y = 0;
int invA = inv(a, p, &x, &y);
while(data[i]){
if(data[i] >= 'A' && data[i] <= 'Z'){
data[i] = (invA * (data[i] - b - 'A') % p + p) % p + 'A';
}
else if(data[i] >= 'a' && data[i] <= 'z'){
data[i] = (invA * (data[i] - b - 'a') % p + p) % p + 'a';
}
else{
data[i] = data[i];
}
i ++;
}
}
int main(){
int a = 7, b = 3, p = 26, x = 0, y = 0;
printf("%d\\n", exgcd(a, p, &x, &y));
printf("%d,%d\\n", x, y);
printf("%d\\n", inv(a, p, &x, &y));
char data[] = "hot";
char result[20]={0};
encrypt(data, a, b, p);
printf("%s\\n", data);
decrypt(data, a, b, p);
printf("%s\\n", data);
return 0;
}
審核編輯:劉清
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
加密解密算法
+關注
關注
0文章
7瀏覽量
1616 -
GCDM
+關注
關注
0文章
4瀏覽量
2148
發(fā)布評論請先 登錄
相關推薦
科普一下CAN總線的基礎知識
CAN總線是一種常用的總線,對于剛開始接觸CAN總線的,面對著各式各樣的資料,可能不知道從何看起,今天科普一下CAN總線的基礎知識。CAN2.0協(xié)議分為A版本和B版本,A版本協(xié)議為11位標識符(標準幀),B版本在兼容11位ID標
發(fā)表于 05-16 09:49
?3283次閱讀
科普一下ZYNQ是什么
關注、星標公眾號,直達精彩內(nèi)容來源:ZYNQ作者:watchman最近公司開始做一個項目,再一次使用到ZYNQ,今天給大家科普一下ZYNQ是什么,以及ZYNQ在嵌入式系統(tǒng)中的應用情況。
發(fā)表于 11-05 08:53
科普一下筆記本電腦BIOS芯片是個啥
刷寫B(tài)IOS是一個相對危險的事,如果刷寫過程中出了意外那么電腦就會壞掉,只能拆開電腦把BIOS芯片卸下來用編程器重新刷寫了。首先科普一下筆記本電腦BIOS芯片是個啥?來自360百科的釋義
發(fā)表于 02-16 07:55
PSoC的動態(tài)配置能力及其實現(xiàn)方法
首先闡述Cypress 公司的可編程片上系統(tǒng)(PSoC) 的動態(tài)配置能力及其實現(xiàn)結(jié)構(gòu),概要地列出幾種對PSoC 微控制器在系統(tǒng)編程(ISP)的方法;在此基礎上分析CY8C26443-24PI 通過串口實現(xiàn)在系統(tǒng)
發(fā)表于 05-14 16:24
?17次下載
一種基于RS485總線的網(wǎng)絡協(xié)議及其實現(xiàn)方法1
一種基于RS485總線的網(wǎng)絡協(xié)議及其實現(xiàn)方法
發(fā)表于 05-15 14:26
?19次下載
Silabs MCU低功耗優(yōu)勢及其實現(xiàn)方法
Silabs MCU低功耗優(yōu)勢及其實現(xiàn)方法:現(xiàn)在的電子產(chǎn)品,對低功耗的要求越來越高。產(chǎn)品低功耗的問題是經(jīng)常讓產(chǎn)品設計者頭痛而又不得不面對的一個問題。以單片機為核心的系統(tǒng),其功
發(fā)表于 01-16 15:23
?18次下載
基于GPS的異地數(shù)據(jù)采集的改進同步方法及其實現(xiàn)
基于GPS的異地數(shù)據(jù)采集的改進同步方法及其實現(xiàn)
工程中經(jīng)常需要實現(xiàn)異地數(shù)據(jù)的同步采集。現(xiàn)有的該類系統(tǒng)大多采用對采集的數(shù)據(jù)打“時間戳”的方法來實現(xiàn)
發(fā)表于 03-08 16:41
?990次閱讀
CAN總線通信協(xié)議的分析和實現(xiàn) CAN總線通信協(xié)議以及其實現(xiàn)方法
CAN總線通信協(xié)議的分析和實現(xiàn) CAN總線通信協(xié)議以及其實現(xiàn)方法
發(fā)表于 09-04 08:45
?40次下載
基于ADMCF341DSP控制器的改進型單次電流傳感方法及其實現(xiàn)
基于ADMCF341DSP控制器的改進型單次電流傳感方法及其實現(xiàn)
發(fā)表于 05-18 20:36
?1次下載
分享一下Cortex-M裸機環(huán)境下臨界區(qū)保護的幾種實現(xiàn)方法
RTOS有臨界區(qū),裸機依然有臨界區(qū)。今天給大家分享一下Cortex-M裸機環(huán)境下臨界區(qū)保護的幾種實現(xiàn)方法。
發(fā)表于 06-13 09:08
?774次閱讀
科普一下MTU是什么,如何設置MTU
歡迎來到東用知識小課堂,下面我們就來科普一下一下MTU是什么,如何設置MTUMTU是最大傳輸單元的意思,代指一類通訊協(xié)議某一層上所能通過的最大數(shù)據(jù)包大小(以byte為單位)。最大傳輸單
給大家科普一下什么是APN及配置方法
歡迎來到東用知識小課堂,今天東東來給大家簡單科普一下APN以及它在路由器上面的配置方法APN(AccessPointName)指一種網(wǎng)絡接入技術(shù),它決定了手機通過哪種接入方式來進行撥號
評論