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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

仿射加密加解密算法

發(fā)布時間:2024/3/13 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 仿射加密加解密算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概述:基本上和數(shù)學(xué)上的仿射變換類似 y=ax+b,通過如此達(dá)到一一對應(yīng)加密。


仿射變換加密加密過程: 加密算法:c=a*m+ b(mod n)

加密過程: 1.獲取a,b(密鑰),n(字符個數(shù))

2.獲取明文。 3.加密成密文,明文轉(zhuǎn)換成各個字符所對應(yīng)的數(shù)字,將所得數(shù)字帶入上面的算法公式,得到數(shù)字再轉(zhuǎn)換成對應(yīng)的字符

解密過程: 算法:m=a^-1(m-b)(mod n)這里a^-1不是指倒數(shù),而是a關(guān)于字符數(shù)量模的乘法可逆元,下面介紹一下乘法可逆元

乘法可逆元定義;
群G中任意一個元素a,都在G中有唯一的逆元a‘,具有性質(zhì)aa'=a'a=e,其中e為群的單位元 這個官方的定義不學(xué)數(shù)論什么肯定看不太懂。。沒事我們只研究數(shù)學(xué)應(yīng)用,不學(xué)理論,

舉個例子好了: 4關(guān)于模7的乘法逆元為多少?

可令4X≡1mod7,即可等價于4X=7K+1,其中X,K為整數(shù),求X和K。 由此看出可逆元的通俗定義

如果ax≡1modf,那么a為關(guān)于模f的乘法逆元。 另外也有條件,當(dāng)a與f互素時,a關(guān)于模f的乘法逆元有解。如果不互素,則無解。如果f為素數(shù),則從1到f-1的任意數(shù)都與f互素,即在1到f-1之間都恰好有一個關(guān)于模f的乘法逆元。

再來一個更具體的例子, 求5關(guān)于14的乘法逆元

用輾轉(zhuǎn)相除法 14=5*2+4

5=4*1+1 反過來寫 1=5-4=5-(14-5*2)=5*3-14

因此5關(guān)于模14的乘法逆元為3. 如此即可求出逆元,然后再帶入公式即可實現(xiàn)解密。

下面給出仿射加密算法的算法實現(xiàn)。(直觀起見采用C++)


#include<iostream> using namespace std; #define N 26 //這里只采用26個字母的加解密//加密 char *encry(char *Plain, int a, int b, int n); char *decry(char *Cipher, int a, int b, int n); //獲取可行仿射加密的a值數(shù)組 void setArr(int Canuse[], int n); //求GCD(最大公約數(shù)) int Gcd(int a, int b); //求a關(guān)于模n的乘法可逆元 int Multiplicative_inverse_modulo(int Canuse[], int a, int n); int main() {int a, b;char str[200] = "";cout << ("輸入密鑰a,b的值") << endl;cin >> a >> b;cout << "輸入明文內(nèi)容" << endl;cin >> str;cout << "明文為" << endl;cout << str << endl;//加密encry(str, a, b, N);//輸出密文cout << str << endl;//解密decry(str, a, b, N);//輸出解密內(nèi)容cout << str << endl;return 0; } //加密函數(shù)實現(xiàn) char *encry(char *Plain, int a, int b, int n) {char *tmp = Plain;if (Plain == NULL)return NULL;while (*Plain) {if (' ' == *Plain){++Plain;continue;}if ((*Plain < 'A') || (*Plain > 'Z'))return NULL;*Plain -= 'A';*Plain = (a*(*Plain) + b) % n;*Plain += 'A';++Plain;}return tmp; } //解密所需基礎(chǔ)算法實現(xiàn) void setArr(int Canuse[], int n) {for (int i = 1; i < n; i++) {if (1 == Gcd(n, i))*(Canuse++) = i;} } int Gcd(int a, int b) {int gcd = 0;int div = 0;//輾轉(zhuǎn)相除法do {div = a%b;gcd = b;a = b;b = div;} while (div);return gcd; } //求乘法可逆元 int Multiplicative_inverse_modulo(int Canuse[], int a, int n) {for (int i = 0; Canuse[i] != 0; i++) {if (1 == (a*Canuse[i]) % n)return Canuse[i];}return 0; } //解密實現(xiàn) char *decry(char *Cipher, int a, int b, int n) {char *tmp = Cipher;int Canuse[32] = { 0 };//符合條件的a值int moda = 0;//a的乘法可逆元int i = 0;if (Cipher == NULL)return NULL;for (; i < 32; i++)Canuse[i] = 0;setArr(Canuse, n);//存放符合條件的a.moda = Multiplicative_inverse_modulo(Canuse, a, n);while (*Cipher) {if (' ' == *Cipher) {++Cipher;continue;}if ((*Cipher < 'A') || (*Cipher > 'Z'))return NULL;*Cipher -= 'A';*Cipher = (moda*(*Cipher - b + n)) % n;*Cipher += 'A';++Cipher;}return tmp; }只恨數(shù)學(xué)學(xué)的不夠多啊。

總結(jié)

以上是生活随笔為你收集整理的仿射加密加解密算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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