2015年10月22日 星期四

PHP和javascript 的 hex、byte陣列、string轉換

某次使用SlowAES  函數cryptoHelpers.generateSharedKey(8)產生的iv經過base64加密後的結果如下
R1We4y0JRP5w06Z8tUBPAw==

先看 https://code.google.com/p/slowaes/source/browse/trunk/js/cryptoHelpers.js?r=33 的 generateSharedKey 怎麼產生的
generateSharedKey:function(len)
{
 if(len === null)
  len = 16;
 var key = [];
 for(var i = 0; i < len*2; i++)
  key.push(this.getRandom(0,255));
 return key;
}
產生長度為8*2 ,內容為 0-255 的 byte 陣列

使用 cryptoHelpers.js 對他做處理,觀察各個型態的內容
// need include cryptoHelpers.js
var base64 = 'R1We4y0JRP5w06Z8tUBPAw==';
console.log(cryptoHelpers.base64.decode(base64)); // base64 decode => byte array
console.log(cryptoHelpers.convertByteArrayToString(cryptoHelpers.base64.decode(base64))); // to string
console.log(cryptoHelpers.toHex(cryptoHelpers.base64.decode(base64))); // to hex

結果:
cryptoHelpers.base64.decode(base64):[71, 85, 158, 227, 45, 9, 68, 254, 112, 211, 166, 124, 181, 64, 79, 3]
cryptoHelpers.convertByteArrayToString(cryptoHelpers.base64.decode(base64)):GUžã- DþpÓ¦|µ@O
cryptoHelpers.toHex(cryptoHelpers.base64.decode(base64)):47559ee32d0944fe70d3a67cb5404f03

使用PHP處理
$iv = 'R1We4y0JRP5w06Z8tUBPAw==';

echo "
base64_decode(\$iv):".base64_decode($iv); // base64 decode => binary string

$iv64 = base64_decode($iv);
echo "
strlen(\$iv64):".strlen($iv64);  // 長度16
echo "
pack('H*', bin2hex(\$iv64)):".pack('H*', bin2hex($iv64)); // 與base64_decode($iv)結果相同
echo "
bin2hex(\$iv64):".bin2hex($iv64); // to hex

// to bytes array
for ($i=0; $i < strlen($iv64); $i++) { 
    $data[] = ord(substr($iv64,$i,1)); // 使用ord將字元轉成int
}
echo "
\$data:";
print_r($data);
echo "
";

結果:
base64_decode($iv):GU��- D�pӦ|�@O
strlen($iv64):16
pack('H*', bin2hex($iv64)):GU��- D�pӦ|�@O
bin2hex($iv64):47559ee32d0944fe70d3a67cb5404f03
$data:Array
(
    [0] => 71
    [1] => 85
    [2] => 158
    [3] => 227
    [4] => 45
    [5] => 9
    [6] => 68
    [7] => 254
    [8] => 112
    [9] => 211
    [10] => 166
    [11] => 124
    [12] => 181
    [13] => 64
    [14] => 79
    [15] => 3
)

還可以去 Unicode/UTF-8-character table 做字元最後的檢查
http://dev.networkerror.org/utf8/?start=0&end=255&cols=4&search=&show_uni_int=on&show_uni_hex=on&show_html_ent=on&show_raw_hex=on&show_raw_bin=on  0-255 的 Unicode Number (int) / Unicode Number (hex) / Char
http://www.scarfboy.com/coding/unicode-tool?s=000047  以hex 搜尋字元

參考資料:
http://stackoverflow.com/questions/11044802/php-hex-and-binary PHP Hex and Binary






沒有留言:

張貼留言