加密算法之对称加密 |
||||||
传递甜甜蜜蜜小纸条 穿越到初中的你,凭借着程序员高贵的气息成功的和一个小女生勾搭上了。
123:5 564:3 11:8 665:2 123:3 456:6 789:2... 123(代表页码):5(代表行) 从此之后,妹子再也不理你了(查字典太TM麻烦!)。。。 对称加密 对称加密简单来说就是使用同一密钥加密和解密内容,双方使用的密钥必须是相同的(其他任何人都不知道),这样才能保证内容的安全(正如上面的传递小纸条)。 ASCII编码 ASCII大家应该都熟悉,通过7位或者8位来表示一个字符,比如65表示字符A,66表示字符B,对应的二进制形式为:
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 PHP实现一个最简单的对称加密算法 //这是我们的加密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的结构,调整算法,应该可以输出一张和原图完全不一样的图片) 关于DES,3DES、AES等算法 这几天看了一下DES和3DES的算法原理(原理看似挺简单),但是对应的算法实现没有看太明白,之后如有突破,会单独写篇文章分享。 欢迎关注我的公众号,交流学习
|