php文件加密类
程序员文章站
2022-05-28 15:42:08
...
<?php
/**
* PHP 文件加密类 二进制加密
* 默认32位加密
*
* @author ray<ray_phper@163.com>
* @date 2015-06-11
*
**/
class
PHPFileEncrypt {
/**
* var $n_iter
*
* 加密位数 32 | 64
**/
private
$n_iter
;
private
$key
=
'0000000000'
;
public
function
__construct(){
//默认32位加密
$this
->setIter(32);
}
public
function
setIter(
$n_iter
){
$this
->n_iter =
$n_iter
;
}
public
function
getIter(){
return
$this
->n_iter;
}
/**
* 加密函数
*
* @access public
* @param mixed $data 要加密的数据
* @param mixed $key 加密秘钥
* @return string 加密后的数据
*
**/
public
function
encrypt(
$data
,
$key
=
''
){
if
(!
$data
){
return
''
;
}
$n
=
$this
->_resize(
$data
, 4);
$data_long
[0] =
$n
;
$n_data_long
=
$this
->_str2long(1,
$data
,
$data_long
);
$n
=
count
(
$data_long
);
if
((
$n
& 1) == 1) {
$data_long
[
$n
] =
chr
(0);
$n_data_long
++;
}
$this
->_resize(
$key
, 16, true);
if
(
''
==
$key
)
$key
=
$this
->key;
$n_key_long
=
$this
->_str2long(0,
$key
,
$key_long
);
$enc_data
=
''
;
$w
=
array
(0, 0);
$j
= 0;
$k
=
array
(0, 0, 0, 0);
for
(
$i
= 0;
$i
<
$n_data_long
; ++
$i
) {
if
(
$j
+ 4 <=
$n_key_long
) {
$k
[0] =
$key_long
[
$j
];
$k
[1] =
$key_long
[
$j
+ 1];
$k
[2] =
$key_long
[
$j
+ 2];
$k
[3] =
$key_long
[
$j
+ 3];
}
else
{
$k
[0] =
$key_long
[
$j
%
$n_key_long
];
$k
[1] =
$key_long
[(
$j
+ 1) %
$n_key_long
];
$k
[2] =
$key_long
[(
$j
+ 2) %
$n_key_long
];
$k
[3] =
$key_long
[(
$j
+ 3) %
$n_key_long
];
}
$j
= (
$j
+ 4) %
$n_key_long
;
$this
->_encipherLong(
$data_long
[
$i
],
$data_long
[++
$i
],
$w
,
$k
);
$enc_data
.=
$this
->_long2str(
$w
[0]);
$enc_data
.=
$this
->_long2str(
$w
[1]);
}
return
$enc_data
;
}
/**
* 解密函数
*
* @access public
* @param string $enc_data 加密过得数据
* @param string $key 解密秘钥
* @return string 原始数据
**/
public
function
decrypt(
$enc_data
,
$key
=
''
){
if
(!
$enc_data
){
return
''
;
}
$n_enc_data_long
=
$this
->_str2long(0,
$enc_data
,
$enc_data_long
);
$this
->_resize(
$key
, 16, true);
if
(
''
==
$key
)
$key
=
$this
->key;
$n_key_long
=
$this
->_str2long(0,
$key
,
$key_long
);
$data
=
''
;
$w
=
array
(0, 0);
$j
= 0;
$len
= 0;
$k
=
array
(0, 0, 0, 0);
$pos
= 0;
for
(
$i
= 0;
$i
<
$n_enc_data_long
;
$i
+= 2) {
if
(
$j
+ 4 <=
$n_key_long
) {
$k
[0] =
$key_long
[
$j
];
$k
[1] =
$key_long
[
$j
+ 1];
$k
[2] =
$key_long
[
$j
+ 2];
$k
[3] =
$key_long
[
$j
+ 3];
}
else
{
$k
[0] =
$key_long
[
$j
%
$n_key_long
];
$k
[1] =
$key_long
[(
$j
+ 1) %
$n_key_long
];
$k
[2] =
$key_long
[(
$j
+ 2) %
$n_key_long
];
$k
[3] =
$key_long
[(
$j
+ 3) %
$n_key_long
];
}
$j
= (
$j
+ 4) %
$n_key_long
;
$this
->_decipherLong(
$enc_data_long
[
$i
],
$enc_data_long
[
$i
+ 1],
$w
,
$k
);
if
(0 ==
$i
) {
$len
=
$w
[0];
if
(4 <=
$len
) {
$data
.=
$this
->_long2str(
$w
[1]);
}
else
{
$data
.=
substr
(
$this
->_long2str(
$w
[1]), 0,
$len
% 4);
}
}
else
{
$pos
= (
$i
- 1) * 4;
if
(
$pos
+ 4 <=
$len
) {
$data
.=
$this
->_long2str(
$w
[0]);
if
(
$pos
+ 8 <=
$len
) {
$data
.=
$this
->_long2str(
$w
[1]);
}
elseif
(
$pos
+ 4 <
$len
) {
$data
.=
substr
(
$this
->_long2str(
$w
[1]), 0,
$len
% 4);
}
}
else
{
$data
.=
substr
(
$this
->_long2str(
$w
[0]), 0,
$len
% 4);
}
}
}
return
$data
;
}
private
function
_encipherLong(
$y
,
$z
, &
$w
, &
$k
){
$sum
= (integer) 0;
$delta
= 0x9E3779B9;
$n
= (integer)
$this
->n_iter;
while
(
$n
-- > 0) {
$y
=
$this
->_add(
$y
,
$this
->_add(
$z
<< 4 ^
$this
->_rshift(
$z
, 5),
$z
) ^
$this
->_add(
$sum
,
$k
[
$sum
& 3]));
$sum
=
$this
->_add(
$sum
,
$delta
);
$z
=
$this
->_add(
$z
,
$this
->_add(
$y
<< 4 ^
$this
->_rshift(
$y
, 5),
$y
) ^
$this
->_add(
$sum
,
$k
[
$this
->_rshift(
$sum
, 11) & 3]));
}
$w
[0] =
$y
;
$w
[1] =
$z
;
}
private
function
_decipherLong(
$y
,
$z
, &
$w
, &
$k
){
$sum
= 0xC6EF3720;
$delta
= 0x9E3779B9;
$n
= (integer)
$this
->n_iter;
while
(
$n
-- > 0) {
$z
=
$this
->_add(
$z
,
-(
$this
->_add(
$y
<< 4 ^
$this
->_rshift(
$y
, 5),
$y
) ^
$this
->_add(
$sum
,
$k
[
$this
->_rshift(
$sum
, 11) & 3])));
$sum
=
$this
->_add(
$sum
, -
$delta
);
$y
=
$this
->_add(
$y
,
-(
$this
->_add(
$z
<< 4 ^
$this
->_rshift(
$z
, 5),
$z
) ^
$this
->_add(
$sum
,
$k
[
$sum
& 3])));
}
$w
[0] =
$y
;
$w
[1] =
$z
;
}
private
function
_resize(&
$data
,
$size
,
$nonull
= false){
$n
=
strlen
(
$data
);
$nmod
=
$n
%
$size
;
if
( 0 ==
$nmod
)
$nmod
=
$size
;
if
(
$nmod
> 0) {
if
(
$nonull
) {
for
(
$i
=
$n
;
$i
<
$n
-
$nmod
+
$size
; ++
$i
) {
$data
[
$i
] =
$data
[
$i
%
$n
];
}
}
else
{
for
(
$i
=
$n
;
$i
<
$n
-
$nmod
+
$size
; ++
$i
) {
$data
[
$i
] =
chr
(0);
}
}
}
return
$n
;
}
private
function
_hex2bin(
$str
){
$len
=
strlen
(
$str
);
return
pack(
'H'
.
$len
,
$str
);
}
private
function
_str2long(
$start
, &
$data
, &
$data_long
){
$n
=
strlen
(
$data
);
$tmp
= unpack(
'N*'
,
$data
);
$j
=
$start
;
foreach
(
$tmp
as
$value
)
$data_long
[
$j
++] =
$value
;
return
$j
;
}
private
function
_long2str(
$l
){
return
pack(
'N'
,
$l
);
}
private
function
_rshift(
$integer
,
$n
){
if
(0xffffffff <
$integer
|| -0xffffffff >
$integer
) {
$integer
=
fmod
(
$integer
, 0xffffffff + 1);
}
if
(0x7fffffff <
$integer
) {
$integer
-= 0xffffffff + 1.0;
}
elseif
(-0x80000000 >
$integer
) {
$integer
+= 0xffffffff + 1.0;
}
if
(0 >
$integer
) {
$integer
&= 0x7fffffff;
$integer
>>=
$n
;
$integer
|= 1 << (31 -
$n
);
}
else
{
$integer
>>=
$n
;
}
return
$integer
;
}
private
function
_add(
$i1
,
$i2
){
$result
= 0.0;
foreach
(func_get_args()
as
$value
) {
if
(0.0 >
$value
) {
$value
-= 1.0 + 0xffffffff;
}
$result
+=
$value
;
}
if
(0xffffffff <
$result
|| -0xffffffff >
$result
) {
$result
=
fmod
(
$result
, 0xffffffff + 1);
}
if
(0x7fffffff <
$result
) {
$result
-= 0xffffffff + 1.0;
}
elseif
(-0x80000000 >
$result
) {
$result
+= 0xffffffff + 1.0;
}
return
$result
;
}
}
?>
下一篇: SSH2整合完整案例(四十三)