仿射密碼簡介:
仿射密碼和移位密碼一樣, 也是一種替換密碼. 不同的是, 移位密碼中, 我們使用的是模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...