本文目錄一覽:
- 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擴展,按位異或總結的兩個字符串加密解密算法
?php
/**
* @info 字符串加密解密算法一,利用mcrypt擴展
* @param string $string 待處理字符串
* $action ENCODE,加密 | DECODE,解密
* @return string $returnstr
*/
functionmcrypt_handle_string($string,$action= ‘ENCODE’)
{
!is_array($string) orexit;
$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;
}
?php
/**
*
* @info 字符串加密解密算法二 利用按位異或
* @param string $string 待處理字符串
* @param $action ENCODE 加密 | DECODE 解密
* @return string*/
functionStrCode($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 —-原文
設定的key的二進制為 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;iarray.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;istr.length();i++)
{
char c = (char)(str.charAt(i) ^ KEY);
str2.append(c);
}
//解密過程
for(int i=0;istr2.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;$istrlen($str);$i++){
$mm1 .= $str{$i} ^ $tem{$i};
}
echo $mm1;//—-很少見的符號
echo “br/”;
for($i = 0;$istrlen($str);$i++){
$mm2 .= $mm1{$i} ^ $tem{$i};
}
echo $mm2;//—-abcdef
?
拓展:密碼模板不能太長 — 解決方法—改為某一個字符—-容易破解—改為若干字符—如下
?php
$str = “abcdef12546bf v vfd”;//源文
$tem = “abc”;//密碼模板
$mm1 = “”;//第一次或運算後密文
$mm2 = “”;//第二次或運算後密文—即原文
for($i = 0;$istrlen($str);$i++){
$j = $i % strlen($tem);
$mm1 .= $str{$i} ^ $tem{$j};
}
echo “mm1如下br/”;//
echo $mm1;//不曉得什麼原因若無上一行 沒顯示 但如果在上面$j前面加一個 echo
echo “br/”;
for($i = 0;$istrlen($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。參與運算的數以補碼方式出現。
例如:95可寫算式如下:
00001001 (9的二進制補碼)
00000101 (5的二進制補碼)
00000001 (1的二進制補碼)
?php
$a = 9;
$b = 5;
echo sprintf(“%b”, $a$b);
?
“|” 按位或運算
按位或運算符「|」是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
例如:9|5可寫算式如下:
00001001
|00000101
00001101 (十進制為13)可見9|5=13
?php
$a = 9;
$b = 5;
echo sprintf(“%b”, $a|$b).”\n”; //二進制
echo sprintf(“%d”, $a|$b).”\n”; //十進制
“^” 按位異或運算
按位異或運算符「^」是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下:
00001001
^00000101
00001100 (十進制為12)
?php
$a = 9;
$b = 5;
echo sprintf(“%b”, $a^$b).”\n”; //二進制
echo sprintf(“%d”, $a^$b).”\n”; //十進制
“~” 求反運算
求反運算符~為單目運算符,具有右結合性。其功能是對參與運算的數的各二進位按位求反。
例如~9的運算為:
~(0000000000001001)結果為:1111111111110110
?php
$a = 9;
$b = 5;
echo sprintf(“%b”, ~$a).”\n”; //二進制
“〈〈” 左移運算
左移運算符「」是雙目運算符。其功能把「 」左邊的運算數的各二進位全部左移若干位,由「」右邊的數指定移動的位數,高位丟棄,低位補0。
例如:
a4
指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。
?php
$a = 3;
$temp = $a4;
echo sprintf(“%d”, $temp).”\n”; //十進制
「」 右移運算
右移運算符「」是雙目運算符。其功能是把「 」左邊的運算數的各二進位全部右移若干位,「」右邊的數指定移動的位數。
例如:
設 a=48,
a4
表示把00110000右移為00000011(十進制3)。
應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定
?php
$a = 48;
$temp = $a4;
echo sprintf(“%d”, $temp).”\n”; //十進制
php中字符變量 異或 ‘1’^’2′ 的值
?php
echo (1^2).”\n”;
echo (‘123’^’ACE’).”\n”;
?
你猜猜這個執行結果是什麼?
在PHP裏面,整數進行位運算的結果和C語言是相同的,這個你明白,我不多說。但是PHP的位運算更高級,如果左右參數都是字符串,則位運算符將操作字符的 ASCII 值。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/242781.html