zoukankan      html  css  js  c++  java
  • [PHP][位转换积累]之异或运算的简单加密应用

    异或的符号是^。按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0.
    xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为密钥。1314520 xor 19880516 = 20665500,我就把20665500告诉MM。MM再次计算20665500 xor 19880516的值,得到1314520,于是她就明白了我的企图。
    相同位不同则为1,相同则为0。
    00101
    11100
    (^或者xor)
    ----------------
    11001
    运算结果
    x <- x # y
    y <- x @ y
    x <- x @ y
    执行了第一句后x变成了x # y。那么第二句实质就是y <- x # y @ y,由于#和@互为逆运算,那么此时的y变成了原来的x。第三句中x实际上被赋值为(x # y) @ x,如果#运算具有交换律,那么赋值后x就变成最初的y了。这三句话的结果是,x和y的位置互换了。
    通过这个原理运用PHP可实现简单高效的加密
    function xorencrypt( $str, $key ){
    	$slen = strlen( $str );
    	$klen = strlen( $key );
    	$cipher = '';
    	for ($i=0;$i<$slen;$i=$i+$klen) {
    		$cipher .= substr( $str, $i, $klen )^$key;
    	}
    	return $cipher;
    }
    

    接收端实现简单的解密

    function xordecrypt( $str, $key ){
    	$slen = strlen( $str );
    	$klen = strlen( $key );
    	$plain = '';
    	for ($i=0;$i<$slen;$i=$i+$klen) {
    		$plain .= $key^substr( $str, $i, $klen );
    	}
    	return $plain;
    }
    
  • 相关阅读:
    [王爽汇编语言笔记]内存地址空间
    [zt]Tutorial: Make Vim as Your C/C++ IDE Using c.vim Plugin
    ubuntu下root 密码忘记的解决方法
    脱壳
    远程访问linux服务器
    【自己动手写操作系统学习笔记】1.hello world!
    不会溢出的除法
    javascript 数据类型和值(基础版)
    WebService 使用的简单例子
    SQL group by 和 having
  • 原文地址:https://www.cnblogs.com/yiyide266/p/5576784.html
Copyright © 2011-2022 走看看