php字符串按位异或(php 异或)

发布时间:2022-11-14

本文目录一览:

  1. 请教 php如何对字符串加密和解密,求一个相关的实例!
  2. 其他语言如何解密PHP多字符串的异或加密
  3. php异或算法
  4. 字符类型 变量 与字符类型变量异或的值这么求解 例如 '1'^'1' =? c语言 php'1'^'2'
  5. PHP语言PHP语言里的位运算符&、|、^ 、~、〈〈 、〉〉这些符号我一个也不懂,希望高手给个全面的解释!拜
  6. php中字符变量 异或 '1'^'2' 的值

请教 php如何对字符串加密和解密,求一个相关的实例!

字符串加密解密算法 php5.5中有更为可靠和方便的加密方式。喜欢钻研的朋友可以了解一下: password_hash() 基于mcrypt扩展,按位异或总结的两个字符串加密解密算法

/**
* @info 字符串加密解密算法一,利用mcrypt扩展
* @param string $string 待处理字符串
* $action ENCODE,加密 | DECODE,解密
* @return string $returnstr
*/
function mcrypt_handle_string($string, $action = 'ENCODE')
{
    !is_array($string) or exit;
    $action == 'DECODE' $string = base64_decode($string);
    $key = "123456";//key可自定义或在配置文件中获取
    $mcryptAlgorithm = MCRYPT_DES;//选择一种加密算法
    $mcryptMode = MCRYPT_MODE_ECB;//选择一种加密模式
    $mcryptIv = mcrypt_create_iv(mcrypt_get_iv_size($mcryptAlgorithm, $mcryptMode), MCRYPT_RAND);//创建初始化向量
    $returnstr = base64_encode(mcrypt_encrypt($mcryptAlgorithm, $key, $string, $mcryptMode, $mcryptIv));
    if('DECODE' == $action) {
        $returnstr = mcrypt_decrypt($mcryptAlgorithm, $key, $string, $mcryptMode, $mcryptIv);
    }
    return $returnstr;
}
/**
* @info 字符串加密解密算法二 利用按位异或
* @param string $string 待处理字符串
* @param $action ENCODE 加密 | DECODE 解密
* @return string
*/
function StrCode($string, $action = 'ENCODE')
{
    $action != 'ENCODE' $string = base64_decode($string);
    $code = '';
    $key = substr(md5($GLOBALS['pwServer']['HTTP_USER_AGENT'] . $GLOBALS['db_hash']), 8, 18);
    $keyLen = strlen($key);
    $strLen = strlen($string);
    for($i = 0; $i < $strLen; $i++) {
        $k = $i % $keyLen;
        $code .= $string[$i] ^ $key[$k];
    }
    return ($action != 'DECODE' ? base64_encode($code) : $code);
}

来源:jingyan.baidu.com/m/article/e4d08ffdd1ca6b0fd2f60d13.html

其他语言如何解密PHP多字符串的异或加密

利用“^”异或运算对字符串进行加密 思路:

  1. 先创建字符串输入的Scanner;
  2. 通过char[] array = password.toCharArray(); 获取字符数组;
  3. 遍历字符数组,按目前理解要用到遍历:数组所有元素进行访问,比如你要输出数组里所有的信息时,就要用到;
  4. 进行异或运算。 按位做“异或”运算是:位值相同得1,不同得0 例如: 加密过程:
  • 原文的二进制为 1 1 0 0 ----原文
  • 密匙的二进制为 0 1 1 0 ----密匙
  • 两者做“异或”结果为 0 1 0 1 ----密文 解密过程:
  • 密文 0 1 0 1 ----密文
  • 密匙 0 1 1 0 ----密匙
  • 两者“异或”就得到了原文 1 1 0 0 ----原文

详细代码:

package com.lixiyu;
import java.util.Scanner;
public class Example {
    public static void main(String[] args){
        Scanner sca = new Scanner(System.in);
        System.out.println("请输入一个英文字符串或解密字符串");
        String line = sca.nextLine();//获取用户输入信息
        char[] array = line.toCharArray();//获取字符数组
        for (int i = 0; i < array.length; i++) {//历遍字符数组
            array[i] = (char) (array[i]^20000);//对数组每个元素进行异或运算
        }
        System.out.println("加密解密结果如下:");
        System.out.println(new String(array));//输出密钥
    }
}

异或运算:

  • 1 ^ 1 = 0
  • 1 ^ 0 = 1
  • 0 ^ 1 = 1
  • 0 ^ 0 = 0 字符 'A' 的ASCII编码为65 : 00000000 01000001
    取整数7 : 00000000 00000000 00000000 00000111
    XOR运算后 : 00000000 00000000 00000000 01000110

简单加密算法代码如下:

public class Test {
    public static final int KEY = 7;
    public static void main(String[] args) {
        String str = "Hello World!";
        StringBuffer str2 = new StringBuffer(); //存储加密后的字符串
        StringBuffer str3 = new StringBuffer(); //存储解密后的字符串
        //加密过程
        for(int i = 0; i < str.length(); i++) {
            char c = (char)(str.charAt(i) ^ KEY);
            str2.append(c);
        }
        //解密过程
        for(int i = 0; i < str2.length(); i++) {
            char c = (char)(str2.charAt(i) ^ KEY);
            str3.append(c);
        }
        System.out.println("原始 的字符串为:" + str);
        System.out.println("加密后 的字符串为:" + str2);
        System.out.println("解密后 的字符串为:" + str3);
    }
}

输出:

原始 的字符串为:Hello World!
加密后 的字符串为:Obkkh'Phukc
解密后 的字符串为:Hello World!

php异或算法

如下 我个人习惯 '----"[]--------{} 其实我还没做过加密,个人想法:

  • 原文 或运算 密码模板 = 密文
  • 有你提示
  • 密文 或运算 密码模板 = 原文
<?php
$str = "abcdef";//源文
$tem = "qwertt";//密码模板
$mm1 = "";//第一次或运算后密文
$mm2 = "";//第二次或运算后密文---即原文
for($i = 0; $i < strlen($str); $i++) {
    $mm1 .= $str{$i} ^ $tem{$i};
}
echo $mm1;//----很少见的符号
echo "<br/>";
for($i = 0; $i < strlen($str); $i++) {
    $mm2 .= $mm1{$i} ^ $tem{$i};
}
echo $mm2;//----abcdef
?>

拓展:密码模板不能太长 -- 解决方法---改为某一个字符----容易破解---改为若干字符---如下

<?php
$str = "abcdef12546bf v vfd";//源文
$tem = "abc";//密码模板
$mm1 = "";//第一次或运算后密文
$mm2 = "";//第二次或运算后密文---即原文
for($i = 0; $i < strlen($str); $i++) {
    $j = $i % strlen($tem);
    $mm1 .= $str{$i} ^ $tem{$j};
}
echo "mm1如下<br/>";
echo $mm1;
echo "<br/>";
for($i = 0; $i < strlen($str); $i++) {
    $j = $i % strlen($tem);
    $mm2 .= $mm1{$i} ^ $tem{$j};
}
echo "原文如下<br/>";
echo $mm2;
?>

解释: $j = $i % strlen($tem); 依次取0 1 2 3 ....0 1 2 3 ....也就是把密码模板中字符依次取出
----到最后一个字符时----再从头开始取 疑惑: 我用的是EclipsePHP,若无echo "mm1如下<br/>";
下一行即echo $mm1无法在Browser显示,但若在echo $mm1之前有其他echo也可以显示。 拓展: $tem能可有特殊字符、数字,$str可有汉字。

字符类型 变量 与字符类型变量异或的值这么求解 例如 '1'^'1' =? c语言 php'1'^'2'

你举的例子是两个相同的字符,他们各个位(bit)的值是一样的,所以异或后结果为0吧。 我还是举个不同的例子吧,'1' ^ '2'

step1

字符 '1' 的ASCII码值是49(10进制),
换算为16进制是 0x31
换算为2进制是 00110001

step2

字符 '2' 的ASCII码值是50(10进制),
换算为16进制是 0x32
换算为2进制是 00110010

step3

做两个二进制数的异或,即对应位不同的话,该位结果为1:

00110001 异或
00110010
得到
00000011

即值为3(10进制)

PHP语言PHP语言里的位运算符&、|、^ 、~、〈〈 、〉〉这些符号我一个也不懂,希望高手给个全面的解释!拜

& 按位与运算

按位与运算符 & 是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。 例如:9 & 5 可写算式如下:

00001001 (9的二进制补码)
&
00000101 (5的二进制补码)
=
00000001 (1的二进制补码)
$a = 9;
$b = 5;
echo sprintf("%b", $a & $b);

| 按位或运算

按位或运算符 | 是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。 例如:9 | 5 可写算式如下:

00001001
|
00000101
=
00001101 (十进制为13)
$a = 9;
$b = 5;
echo sprintf("%b", $a | $b)."\n"; //二进制
echo sprintf("%d", $a | $b)."\n"; //十进制

^ 按位异或运算

按位异或运算符 ^ 是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如 9 ^ 5 可写成算式如下:

00001001
^
00000101
=
00001100 (十进制为12)
$a = 9;
$b = 5;
echo sprintf("%b", $a ^ $b)."\n"; //二进制
echo sprintf("%d", $a ^ $b)."\n"; //十进制

~ 求反运算

求反运算符 ~ 为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。 例如 ~9 的运算为:

~(0000000000001001) 结果为:1111111111110110
$a = 9;
echo sprintf("%b", ~$a)."\n"; //二进制

<< 左移运算

左移运算符 << 是双目运算符。其功能把 << 左边的运算数的各二进位全部左移若干位,由 << 右边的数指定移动的位数,高位丢弃,低位补0。 例如:

a << 4

指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。

$a = 3;
$temp = $a << 4;
echo sprintf("%d", $temp)."\n"; //十进制

>> 右移运算

右移运算符 >> 是双目运算符。其功能是把 >> 左边的运算数的各二进位全部右移若干位,>> 右边的数指定移动的位数。 例如: 设 a=48

a >> 4

表示把00110000右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。

$a = 48;
$temp = $a >> 4;
echo sprintf("%d", $temp)."\n"; //十进制

php中字符变量 异或 '1'^'2' 的值

<?php
echo (1 ^ 2)."\n";
echo ('123' ^ 'ACE')."\n";
?>

你猜猜这个执行结果是什么? 在PHP里面,整数进行位运算的结果和C语言是相同的,这个你明白,我不多说。但是PHP的位运算更高级,如果左右参数都是字符串,则位运算符将操作字符的 ASCII 值。