南琦 发表于 2012-12-10 13:25:04

视觉密码(VisualCrypto)

视觉密码(VisualCrypto)

<div id="cnblogs_post_body">先看效果图:
http://pic002.cnblogs.com/images/2012/312543/2012071003020874.jpg
将其中一个图更改透明度为50%,重叠两张图后:
http://pic002.cnblogs.com/images/2012/312543/2012071003022633.jpg
源于:http://leemon.com/crypto/VisualCrypto.html

大家可以先去看看,作者的意思是,甲乙两方需要传递消息,可以事先说好密钥,传递消息时只要给其发送stream(明文)图片即可,另一方解密,只需输入密钥和相应的消息长度(输入等量空格)即可得到ciphertext(密钥)图片,最终得到消息内容。同一张密钥图片可以匹配多张明文。

原理很简单,作者根据所给口令(PASSPHRASE),使用http://pic002.cnblogs.com/images/2012/312543/2012071003035796.jpg和http://pic002.cnblogs.com/images/2012/312543/2012071003040739.jpg两张图片组成了一个图片,这张图片只与口令有关。然后对于加密内容,不需要替换的地方使用相反的图片,需要替换的使用原本的图片,这样两张图片相叠就能达到需要的效果。

暂不讨论此等加密的好坏,仅看到作者在最后那一串font的Array就让我感叹。

闲来无事,也想自己写个支持中文的,于是就有了C#版的VisualCrypto
由于其中使用了caozhy的字模点阵提取程序:
参见:http://topic.csdn.net/u/20120629/17/a33f88b5-7ee8-4a0c-8915-c0c721bb30c9.html

http://pic002.cnblogs.com/images/2012/312543/2012071003042353.jpg
http://pic002.cnblogs.com/images/2012/312543/2012071003042768.jpg
http://pic002.cnblogs.com/images/2012/312543/2012071003043216.jpg
http://pic002.cnblogs.com/images/2012/312543/2012071003043828.jpg

源码也已上传:http://files.cnblogs.com/nanqi/VisualCryptography.zip

个人思路:
首先将http://pic002.cnblogs.com/images/2012/312543/2012071003035796.jpg和http://pic002.cnblogs.com/images/2012/312543/2012071003040739.jpg使用私有字段_unit代替
bool[][] _unit = new bool[][] { new bool[] { true, false, false, true }, new bool[] { false, true, true, false } };

将用户输入的口令处理为bool dataCode即16*16的矩阵。
为true则使用第一个,为false使用第二个。最后得到bool _resultCode即32*32的矩阵。

通过字模点阵获取bool dataMsg即16*16的矩阵。

与口令获取的bool dataCode进行对比生成bool dataDiff,dataMsg中为false的对dataCode取反,为true的不变。
与获得resultCode方式相同,使用dataDiff获得相应的_resultMsg。

画出两张图。

具体代码:
<div class="cnblogs_code"> 1 //密码 2 byte[] code = System.Text.Encoding.Default.GetBytes(textBox1.Text.Trim()); 3 4 if (code.Length == 0) 5 { 6    code = DEF_CODE; 7 } 8 else if (code.Length > 16) 9 {10    code = code.Take(16).ToArray();11 }12 else13 {14    while (code.Length < 4)15    {16       code = code.Concat(code).ToArray();17    }18 }19 20 code = code.Concat(DEF_CODE.Skip(code.Length)).ToArray();21 22 IEnumerable<byte> tmpDataCode = Enumerable.Empty<byte>();23 24 for (int i = 0; i < code.Length; i += 4)25 {26    tmpDataCode = tmpDataCode.Concat(SHA512Encrypt(code.Where((by, index) => (index & 3) == (i / 4 & 3)).ToArray()));27 }28 29 bool[] dataCode = tmpDataCode.Select(by => Convert.ToBoolean(by & 1)).ToArray();
页: [1]
查看完整版本: 视觉密码(VisualCrypto)