摘要:常见的对称加密算法有等,它们的复杂程度也各不相等。还有一点就是,请慎重使用那些不公开的加密算法,毕竟这些公开算法相对经得起考验。
传递甜甜蜜蜜小纸条在互联网如此发达的年代,信息的安全也变得越来越重要,我们也使用了各式各样的加密手段来保护数据的安全,但是各种加密算法你真的了解它么?他们的原理又是什么呢?
常见的加密分为对称加密、非对称加密还有散列算法(严格来说,散列不算加密),这篇文章我们来了解一下对称加密
穿越到初中的你,凭借着程序员"高贵"的气息成功的和一个小女生"勾搭"上了。
然而在那个不是谁都有手机的年代,上课的时候想和她传递信息,貌似只能写在纸上,然后借助同学之手,慢慢传递。最关键的是,万一某个同学好奇心太重偷偷看到你们的"甜甜蜜蜜",你也许会不太爽吧?
作为一个从未来穿越回来的程序员,你立马在周末的时候买了两本班上谁都没有的大字典(康熙字典),从此你俩的小纸条上出现的是如下的内容:
123:5 564:3 11:8 665:2 123:3 456:6 789:2...
123(代表页码):5(代表行)
从此之后,妹子再也不理你了(查字典太TM麻烦!)。。。
当然藏头诗也可以看做一种加密手段,前提是:你会写诗。。。
对称加密简单来说就是使用同一密钥加密和解密内容,双方使用的密钥必须是相同的(其他任何人都不知道),这样才能保证内容的安全(正如上面的传递小纸条)。
常见的对称加密算法有DES、3DES、AES、Blowfish等,它们的复杂程度也各不相等。
那么在计算机中如何做到类似上面小纸条的加密手段呢?
ASCII大家应该都熟悉,通过7位或者8位来表示一个字符,比如65表示字符A,66表示字符B,对应的二进制形式为:
字符 | 二进制形式 |
---|---|
A | 01000001 |
B | 01000010 |
0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 = 0;
相同异或等于0,不同为1,然后我们把^和=对换一下:
0 = 0 ^ 0; 0 = 1 ^ 1; 1 = 0 ^ 1; 1 = 1 ^ 0;
依然成立,为了更形象的说明,我们把上面的等式假设为:A ^ B = C
我们只要把结果C与B进行异或运算就会得到结果A,对称加密的精髓就在这里!
//这是我们的加密key $key = "[Lvn[o]6e{y=q#82]G.]rDzv.j"; $keyLen = strlen($key); //准备加密的内容 $string = "大家好,欢迎关注假装是个程序员!"; //被加密的内容长度 $stringLen = strlen($string); //如果加密key没有内容长,那么我们不断重复key,直到大于等于被加密内容(当然在实际使用中,这不是个好方法) if($keyLen < $stringLen) { $key = str_pad($key, $stringLen, $key); } $content = ""; //每个字节与对应的key做异或运算 for($i = 0; $i < $stringLen; $i++) { $content .= chr(ord($string[$i]) ^ ord($key[$i])); } //这个就是我们加密后的密文 var_dump($content); //输出:string(48) "��ы�ٸ�ؔű��������������ܤ������ў��Ƃ��ֶ���" //为了提高可读性,一般会将加密后的字符通过base64编码 var_dump(base64_encode($content)); //输出:string(64) "vujRi/XZuJPYlMWxl4+a2uLJy9jBosney+vcpNXrvffy0t3RnpX6xoK9uNa2ss7F" //解密 $string = ""; for($i = 0; $i < $stringLen; $i++) { $string .= chr(ord($content[$i]) ^ ord($key[$i])); } var_dump($string); //输出:string(48) "大家好,欢迎关注假装是个程序员!"
上面的加密和解密其实是完全一样的算法,我这里只是为了演示,重复了一遍。
就这样我们轻轻松松就把我们的数据加密了,那么文件可以通过这种方式加密吗?当然可以,毕竟计算机里面储存的都是比特位,我下面给做一个简单的例子看一下。
这个是加密前的图片
这张图用来做加密key
加密算法几乎和上面一致:
$file = "/Users/zhjx922/Downloads/jiami.jpg"; $string = file_get_contents($file); //被加密内容长度 $stringLen = strlen($string); $file = "/Users/zhjx922/Downloads/jiami2.jpg"; $key = file_get_contents($file); //key长度 $keyLen = strlen($key); //如果加密key没有内容长,那么我们不断重复key,直到大于等于被加密内容(当然在实际使用中,这不是个好方法) if($keyLen < $stringLen) { $key = str_pad($key, $stringLen, $key); } $content = ""; for($i = 0; $i < $stringLen; $i++) { $content .= chr(ord($string[$i]) ^ ord($key[$i])); } file_put_contents("jiami_content.jpg", $content); $string = file_get_contents("jiami_content.jpg"); $content = ""; for($i = 0; $i < $stringLen; $i++) { $content .= chr(ord($string[$i]) ^ ord($key[$i])); } file_put_contents("jiami_yuantu.jpg", $content);
其中jiami_content.jpg为加密后的图片,但是根本打不开,这也说明这不是一个好的加密方法(因为不太了解jpg格式是如何储存的,如果你了解jpg的结构,调整算法,应该可以输出一张和原图完全不一样的图片)
而jiami_yuantu.jpg为解密后的图片,可以打开,完全和原图一样。
这几天看了一下DES和3DES的算法原理(原理看似挺简单),但是对应的算法实现没有看太明白,之后如有突破,会多带带写篇文章分享。
还有一点就是,请慎重使用那些不公开的加密算法,毕竟这些公开算法相对经得起考验。前两天我在公司的代码库中看到一段加密函数,看似写的很高深,仔细读了一下,发现加密后的内容几乎不攻自破。。。
欢迎关注我的公众号,交流学习
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/11224.html
摘要:前言总括原文博客地址协议之数据加密过程详解知乎专栏简书专题前端进击者知乎前端进击者简书博主博客地址的个人博客生活只要你听过,不可能没听过协议吧,协议是一种安全协议。 前言 总括: 原文博客地址:SSL协议之数据加密过程详解 知乎专栏&&简书专题:前端进击者(知乎)&&前端进击者(简书) 博主博客地址:Damonare的个人博客 生活 SSL 只要你听过HTTPS,不可能没听过...
摘要:算法公钥加密算法是年由罗纳德李维斯特阿迪萨莫尔和伦纳德阿德曼一起提出的。是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被推荐为公钥数据加密标准。 上篇文章介绍了对称加密的原理,但是它的最大问题就是加密和解密的密钥是相同的,并且不能保证密钥能安全的送到双方手里,即使安全的送到双方手里,免不了内部会有卧底的存在 非对称加密 既然有对称加密,那么自然会联想到非...
摘要:假如黎曼猜想被证实,区块链将毁灭近日,黎曼猜想四个字疯狂刷屏。黎曼猜想由数学家波恩哈德黎曼于年提出。因此,黎曼猜想一旦被证明,则意味着素数之密被解开,算法也就将被攻破了。而大多数区块链所用的加密算法不是,而是椭圆曲线加密算法。 玛丽女王的密码之生死命悬一线 showImg(https://segmentfault.com/img/bVbhD7s?w=740&h=876); 16世纪伊丽...
摘要:所谓对称加密,就是加密和解密使用同一秘钥,这也是这种加密算法最显著的缺点之一。非对称加密算法由于对称加密在通信加密领域的缺陷,年和提出了非对称加密的概念。非对称加密,其主要缺点之一就是慢,适合加密少量数据。 1. 加密的目的 加密不同于密码,加密是一个动作或者过程,其目的就是将一段明文信息(人类或机器可以直接读懂的信息)变为一段看上去没有任何意义的字符,必须通过事先约定的解密规则才能将...
阅读 1398·2021-09-02 09:53
阅读 2666·2021-07-29 13:50
阅读 1714·2019-08-30 11:07
阅读 1570·2019-08-30 11:00
阅读 1449·2019-08-29 14:00
阅读 1843·2019-08-29 12:52
阅读 2559·2019-08-29 11:11
阅读 3414·2019-08-26 12:23