先前發過帖子,讓大家猜將一段文字變成位圖的加密方法。
XXXXXXXXXXXXXXXXXXXXXXXX/t/45664
ASCII碼字符總共有65536個,而我們常用的24位BMP則能夠表達16777216種顔色,能不能利用一下呢?
RGB大家都很熟悉,256連續乘以3次就是24位BMP所能表達的顔色。而65536=256*256,好像多了一位……
多一位又如何?合併起來一起用——結果就是兩個像素表達三個漢字/拉丁字母了。
具體做法:將字符串挨個取其ASCII碼值,然後對其用256取整取餘。這就解釋了爲什麽有人解碼時候發現大量拉丁字母的原因。
因爲英文字母ASCII碼取整為0,所以一串網址就變成了".b.b.s...k.e.c.h.u.a.n.g...o.r.g"之類的形式。這是初始版本的最大軟肋,我估計會員十九就是靠這點想到的破解方式。
但是,不是每段文字字數都是3的倍數(一個像素含有三個顔色參數),到了結尾,全部用0代替。
另外,弄成正方形矩陣的方式,其實等於提示這段文字字數不多於多少個。
其實説穿了,個人覺得一文不值。寫這個密碼,不能用於打印機輸出(打印機那種顔色誤差,我等退散吧),但是能在屏幕上用盡量小的區域表達盡量多的意義。(畫外音:我能用一片指甲蓋大小的屏幕記錄下虎哥酒後口胡過程,不管你懂不懂,反正我是懂了)
這工具用VB寫的,下面的源代碼是屬於加花版本,和給大家競猜那個有點不同,這個版本運行出來會有常規解碼途中出現大量口胡的情況。
Dim N() '這段是定義全局變量,數組N用於裝載取整取餘後的數據,r,g,b是顔色,x,y是坐標,aa是矩陣變長
Dim r, g, b
Dim x, y
Dim aa
Private Sub Encrypt_Click() '加密程序段
On Error Resume Next ‘無視空字符加密
L = Len(Text1.Text) '取得字符串長度
aa = Int(Sqr(2 * L / 3)) + 1 ‘矩陣邊長和字符串長度的關係
ReDim N(2 * L - 1) ’重定義數組N的元素個數
For i = 1 To L '取ASCII代碼
c = AscW(Mid(Text1.Text, i, 1))
If c < 0 Then c = c + 65536 'ASCW函數有個很蛋疼的缺點,就是超過32768的時候改爲從-1開始排,所以這句話把它調回來
N(2 * (i - 1)) = c \ 256 '取整賦值
N(2 * (i - 1) + 1) = c Mod 256 '取餘賦值
Next i
For y = 0 To aa '用數組N的數據填充像素片段
For x = 0 To aa
If i > 2 * L - 1 Then '當超過數組元素個數的處理方法,就是將其全部為零——純黑色
r = 0
g = 0
b = 0
GoTo f
End If
If i + 1 > 2 * L - 1 Then '當局部數據超過數組元素個數的處理方法
r = N(i)
g = 0
b = 0
GoTo f
End If
If i + 2 > 2 * L - 1 Then
r = N(i)
g = N(i + 1)
b = 0
GoTo f
End If
r = N(i) '正常情況下,RGB的賦值語句
g = N(i + 1)
b = N(i + 2)
f: Call fill
i = i + 1
Next x
Next y
SavePicture XXXXXXXXXXXage, "d:\XXXXXXXXXXXXp" '將編碼好的密文輸出文件End Sub
Private Sub fill() ’在Picturebox控件上挨個像素寫入顔色信息
XXXXXXXXXXXet (x, y), RGB(r, g, b)End Sub
Private Sub Form_Load() '加花片段,首先在界面内已經畫好了80*60像素的區域
For p = 0 To Picture1.Height ‘不斷出現的Randomize就是希望不斷取種,生成看似沒有規律的偽隨機數
Randomize
For o = 0 To Picture1.Width
Randomize
q = Int(Rnd * 9999)
Randomize
qq = 1 + Int(Rnd * 100)
If q Mod qq = 0 Then
Randomize
XXXXXXXXXXXet (o, p), RGB(Int(Rnd * 64) + 192, Int(Rnd * 64) + 192, Int(Rnd * 64) + 192) '加花方式:盡量相近於密文的色調,通常生成的密碼因爲是有中文意義在裏面,會比較多出現連續色調若干像素的現象,比方説“叮嚀”、“開開心心”之類的 Randomize
Else
Randomize
XXXXXXXXXXXet (o, p), RGB(Int(Rnd * 64), Int(Rnd * 64), Int(Rnd * 64)) ‘之所以出現兩種填充方式,是配合偶爾出現的亮色調,要不然一看就知道那一段就是密文邊界了 End If
Next o
Next p
End Sub
這個密碼我覺得還有更多發展地方(就是惡整解密者的方法)。比方説一個圖像内,不用正方形排列文章,改用星形、心形、梯形等;又或者排列字符順序是倒序填充;又或者改爲BRG(相對於)方式存取數組數據……還有,和常規正方形一樣排列加密,但是好幾篇文章拼成一個更大的矩陣……
配合數字移位法……
或者一個像素表示一個字符,但其中某個顔色參數表示這個像素後第幾個像素才是有意義密文,其他全部亂碼……
這種加密應該歸類為綫性密碼,還是屬於替換字符表之類的。不知在科研上、商業上還有沒有發展市場?