仿射密碼與擴充套件歐幾里德變換

2022-08-31 05:30:20 字數 3130 閱讀 2789

仿射密碼簡介:

仿射密碼和移位密碼一樣, 也是一種替換密碼. 不同的是, 移位密碼中, 我們使用的是模n加; 而在下面的仿射密碼中, 我們使用的上一節中介紹的模n乘. 在安全性方面, 仿射密碼同移位密碼一樣, 都是極其差的, 不僅因為他們的原理簡單, 更要命的是這兩種替換密碼沒有隱藏明文的字頻資訊, 這很容易導致破解者輕易的攻破.

放射密碼中的一些概念:

1) 明密文字母表為z26

2) 秘匙 k = (a,b) ∈ z26_ × z26 . 其中z26_ 表示小於26且與26互素(或叫互質)的正整數的集合,這點非常重要的.

3) 加密變換為 y = (ax + b) mod 26 ;

很簡單?(呵呵, 先別急.) 我們先來引入乙個定義.

大家知道, 好多東西都有逆, 大家讀小學時都知道,兩個數相乘乘機為1,則互為倒數, 其實是最簡單的逆. 後來, 我們到了高中, 我們學習了逆函式; 到了大學, 我們學習線性代數, 知道兩個矩陣的乘積為單位矩陣的話, 則這兩個矩陣互為逆矩陣.

現在我跟大家介紹另一種逆. 叫模逆. 其實很好理解的, 如下:

若a,b兩數的乘積對正整數n取模的結果為1. 則稱a,b 互為另外乙個的模逆.

比如:3*7 = 21; 21 % 20 = 1 ; 所以3,7 互為 20 的 模逆.

9*3 = 27; 27 % 26 = 1 ; 所以9,3 互為 26 的 模逆.

如何標記?

若a,b互為n的模逆 , 即b 為a 的模n的逆元 , 則記 b 為 a-1mod n (這裡沒公式編輯器, a-1中的-1在右上角, 見諒了呵呵).

看了上面的定義, 我們知道:

只有當 a 與 n 互素的時候, a 才是有模逆的. 其他情況下是不存在模逆的, 比如 2 對26 就沒有模逆. 這是個很簡單的數學問題, 大家動下手, 畫幾筆就清楚了.我就不多羅嗦了.

[思考] 大家能快速的求出11對123的模逆嗎? (放心,11和123是互素的.)

可能大家會這樣想:

設其模逆為 b , 則 必定存在乙個整數 t   , 使得等式 11b = 123t + 1 成立.

我們再變化一下, 也即所求為 必須使得 (11b - 1) % 123 = 0 恆成立.

到了這裡, 如果使用筆算對b從2開始依次遞加窮舉的話,將會非常辛苦, 若將123換成乙個更大一點的數, 用筆算窮舉更是不可能的.

聰明你的肯定想說, 寫個程式算就行了啊. 不錯, 寫個程式幫我們窮舉的確很棒, 充分發揮了計算機的作用.

但這裡, 我介紹給大家另外一種巧妙的方法 ----擴充套件歐幾里德變換:

123 =      1*123+       0*11

11   =      0*123+       1*11      |11

2    =      1*123+      (-11)*11   |5

1    =     (-5)*123+     56*11

聰明的你, 一定看出來了吧. 對! 我們將123和11都表示成 x * 123 + y * 11 的 格式, 然後相減, 在最右側一欄寫上每次減去的被減數的倍數. 依次進行, 知道減數變為1為止. 然後我們取第三列的最下面的乙個數, 再對123 取模 即得11 對123的模逆.

對於這個變換, 不清楚的朋友,我勸你們最好動筆畫幾下. 那樣比我在這裡說的起作用的多.嘿嘿~~

這個演算法的好處:

我們編寫這個演算法的程式去求任何模逆都是非常高效的, 它幫我們以及cpu都節省了不少時間.

為了加深理解, 來看乙個例子:

[例子] :求 1211對13211的模逆 .

13211     1     0           //這一行的1和0是固定的.

1211      0     1     |10    //這一行0和1也是固定的, 後面的10是13211減掉的1211的倍數.意思為減掉10個1211.

1101      1     -10   |1     //第乙個1為上一行的第二個1抄下來;-10 = 0 - 1*10 (上一行的算這一行的);後面的1依然為減掉的倍數.

110      -10    11    |10    //-10 為帶抄下來, 11 = 1 - (-10) *1 , 10 為倍數.

1             -120         //很快就到1了, 這時的 -120 就是我們要的.

-120 % 13211= 13091 即為 1211 對13211 的模逆. 怎麼樣? 不錯吧.   呵呵.

以上為引用

仿射密碼:

加密函式是e(x) =ax

+b(modm);

解碼函式是d(x) =

a− 1(x

−b)(mod

m),其中a

- 1是a

對m的模逆

。例子:明文:"cryptography".key(5,7);5對7的模逆為21;密文:"roxezyloheqx",a~z對映為0~25.

**

#include

<

iostream

>

using

namespace

std;

inta,b,c;

void

encode(

char

*seq,

char

*out

)cout

<<

endl;

}void

decode(

char

*seq)

cout

<<

endl;}//

求a對b的模逆

intmo(

inta,

intb)y=

y%res;

if(y

<0)

res+=

y;else

res=

y;return

res;}//

參考int

moni(

inta,

intn)y =

y%n;if

(y<0)

returny;}

intmain()

仿射變換與透視變換

仿射變換與透視變換是機器視覺中繞不開的幾何知識之一.我以前在做相機標定的時候研究了一下,現在寫出來,免得以後忘記.1.透視變化 透視變換與透視投影密切相關.我們先來理解一下什麼是透視投影,所謂透視投影,通俗地講就是 遠小近大 前段時間,一張在網上流行.如果你明白了透視原理,就不會出現 道理我都懂,可...

仿射變換與透視變換

旋轉 線性變換 平移 向量加 縮放 線性變換 錯切,反轉 仿射變換是一種二維座標到二維座標之間的線性變換,它保持了二維圖形的 平直性 直線經過變換之後依然是直線 和 平行性 二維圖形之間的相對位置關係保持不變,平行線依然是平行線,且直線上點的位置順序不變 任意的仿射變換都能表示為乘以乙個矩陣 線性變...

OpenCV與仿射變換

拉伸 收縮 扭曲 旋轉是影象的幾何變換,在三維視覺技術中大量應用到這些變換,又分為仿射變換和透視變換。由圖可以看出,仿射變換是透視變換的子集。仿射變換包括平移,旋轉,縮放。由三對點計算仿射變換 src 輸入影象的三角形頂點座標。dst 輸出影象的相應的三角形頂點座標。返回乙個2x3的變換矩陣。2.w...