自製位圖加密法過程公佈
kalimov2012/06/02软件综合 IP:澳门
先前發過帖子,讓大家猜將一段文字變成位圖的加密方法。https://www.kechuang.org/t/45664
1.jpg
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寫的,下面的源代碼是屬於加花版本,和給大家競猜那個有點不同,這個版本運行出來會有常規解碼途中出現大量口胡的情況。
2.jpg
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(相對於)方式存取數組數據……還有,和常規正方形一樣排列加密,但是好幾篇文章拼成一個更大的矩陣……
配合數字移位法……
或者一個像素表示一個字符,但其中某個顔色參數表示這個像素後第幾個像素才是有意義密文,其他全部亂碼……

這種加密應該歸類為綫性密碼,還是屬於替換字符表之類的。不知在科研上、商業上還有沒有發展市場?
+10  科创币    十九    2012/06/02 好吧……&nbsp;&nbsp;原来加密方式比我想象的复杂的多,但解密时的感觉就像是传统密码呢
来自:计算机科学 / 软件综合
3
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
invalid
11年3个月前 IP:未同步
502366
1、不能靠保密算法来保证安全性。

2、这个可以发展成密写术:你可以事先和某人分享一张位图,然后把数据调制到这张位图上。

如果这张位图不重复使用的话,上述过程也就等同于用位图本身作为一次一密的密钥对数据加密。数据在表现上,类似位图的噪点。

当对方收到这张位图后,通过和原图比对,就可以解除干扰。


不过……注意数据调制算法,最好仅调制到低位上。否则如果原始位图变化比较平缓的话,是可能从中提取出一部分数据(至少是其部分特征)的。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zx-16533
11年2个月前 IP:未同步
502736
我感觉还是写个rsa或aes加密器好,1楼说得对,不能靠保密算法来确保安全性
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
geis
11年2个月前 IP:未同步
503521
Linux下有个steghide,将数据隐藏进JPG文件或者WAV文件。

另外隐写的一个简单的的例子,可以修改位图各个像素的二进制8位数的最低1-2位。这样不会改变图像的外观,而且如果输入本来是相机照片之类的自带杂点的数据的话,这么做还是不会引起怀疑的。缺点是效率低,大约25%的数据量。

另外,既然有电脑了,请用现代密码学加密。以及密码学第一定律:破解者总是知道你用的什么算法(你不能用算法的不公开保证系统的安全)。
AES等算法在这里很好用。可以先压缩然后加密。AES就算被破解了也不会是你的责任,因为NIST已经宣布将AES作为美国政府的非机密和机密(classified)数据加密算法了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
kalimov
进士 机友 笔友
文章
82
回复
887
学术分
0
2007/09/16注册,1年4个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}