|
|
@@ -1,4 +1,5 @@
|
|
|
<?php
|
|
|
+
|
|
|
/**
|
|
|
* V2LakalaSM4
|
|
|
* PHP version 7.4
|
|
|
@@ -13,7 +14,7 @@ namespace SixShop\Lakala\OpenAPISDK\V2\Util;
|
|
|
|
|
|
class V2LakalaSM4
|
|
|
{
|
|
|
- const SM4_CK = [
|
|
|
+ public const SM4_CK = [
|
|
|
0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,
|
|
|
0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,
|
|
|
0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,
|
|
|
@@ -24,7 +25,7 @@ class V2LakalaSM4
|
|
|
0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279
|
|
|
];
|
|
|
|
|
|
- const SM4_SBOX = [
|
|
|
+ public const SM4_SBOX = [
|
|
|
0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05,
|
|
|
0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99,
|
|
|
0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62,
|
|
|
@@ -43,7 +44,7 @@ class V2LakalaSM4
|
|
|
0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48
|
|
|
];
|
|
|
|
|
|
- const SM4_FK = [0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC];
|
|
|
+ public const SM4_FK = [0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC];
|
|
|
|
|
|
public $_rk = [];
|
|
|
public $_block_size = 16;
|
|
|
@@ -102,22 +103,22 @@ class V2LakalaSM4
|
|
|
private function sm4Decrypt($cipherText)
|
|
|
{
|
|
|
$x = [];
|
|
|
- for ($j=0; $j<4; $j++) {
|
|
|
- $x[$j]=($cipherText[$j*4]<<24) |($cipherText[$j*4+1]<<16)| ($cipherText[$j*4+2]<<8)|($cipherText[$j*4+3]);
|
|
|
+ for ($j = 0; $j < 4; $j++) {
|
|
|
+ $x[$j] = ($cipherText[$j * 4] << 24) | ($cipherText[$j * 4 + 1] << 16) | ($cipherText[$j * 4 + 2] << 8) | ($cipherText[$j * 4 + 3]);
|
|
|
}
|
|
|
|
|
|
- for ($i=0; $i<32; $i++) {
|
|
|
- $tmp = $x[$i+1]^$x[$i+2]^$x[$i+3]^$this->_rk[31-$i];
|
|
|
- $buf= (self::SM4_SBOX[($tmp >> 24) & 0xFF]) << 24 |(self::SM4_SBOX[($tmp >> 16) & 0xFF]) << 16 |(self::SM4_SBOX[($tmp >> 8) & 0xFF]) << 8 |(self::SM4_SBOX[$tmp & 0xFF]);
|
|
|
- $x[$i+4]=$x[$i]^($buf^$this->sm4Rotl32(($buf), 2)^ $this->sm4Rotl32(($buf), 10) ^ $this->sm4Rotl32(($buf), 18)^ $this->sm4Rotl32(($buf), 24));
|
|
|
+ for ($i = 0; $i < 32; $i++) {
|
|
|
+ $tmp = $x[$i + 1] ^ $x[$i + 2] ^ $x[$i + 3] ^ $this->_rk[31 - $i];
|
|
|
+ $buf = (self::SM4_SBOX[($tmp >> 24) & 0xFF]) << 24 | (self::SM4_SBOX[($tmp >> 16) & 0xFF]) << 16 | (self::SM4_SBOX[($tmp >> 8) & 0xFF]) << 8 | (self::SM4_SBOX[$tmp & 0xFF]);
|
|
|
+ $x[$i + 4] = $x[$i] ^ ($buf ^ $this->sm4Rotl32(($buf), 2) ^ $this->sm4Rotl32(($buf), 10) ^ $this->sm4Rotl32(($buf), 18) ^ $this->sm4Rotl32(($buf), 24));
|
|
|
}
|
|
|
|
|
|
$plainText = [];
|
|
|
- for ($k=0; $k<4; $k++) {
|
|
|
- $plainText[4*$k]=($x[35-$k]>> 24)& 0xFF;
|
|
|
- $plainText[4*$k+1]=($x[35-$k]>> 16)& 0xFF;
|
|
|
- $plainText[4*$k+2]=($x[35-$k]>> 8)& 0xFF;
|
|
|
- $plainText[4*$k+3]=($x[35-$k])& 0xFF;
|
|
|
+ for ($k = 0; $k < 4; $k++) {
|
|
|
+ $plainText[4 * $k] = ($x[35 - $k] >> 24) & 0xFF;
|
|
|
+ $plainText[4 * $k + 1] = ($x[35 - $k] >> 16) & 0xFF;
|
|
|
+ $plainText[4 * $k + 2] = ($x[35 - $k] >> 8) & 0xFF;
|
|
|
+ $plainText[4 * $k + 3] = ($x[35 - $k]) & 0xFF;
|
|
|
}
|
|
|
|
|
|
return $this->bytesToString($plainText);
|
|
|
@@ -126,22 +127,22 @@ class V2LakalaSM4
|
|
|
private function sm4Encrypt($plainText)
|
|
|
{
|
|
|
$x = [];
|
|
|
- for ($j=0; $j<4; $j++) {
|
|
|
- $x[$j]=($plainText[$j*4]<<24) |($plainText[$j*4+1]<<16)| ($plainText[$j*4+2]<<8)|($plainText[$j*4+3]);
|
|
|
+ for ($j = 0; $j < 4; $j++) {
|
|
|
+ $x[$j] = ($plainText[$j * 4] << 24) | ($plainText[$j * 4 + 1] << 16) | ($plainText[$j * 4 + 2] << 8) | ($plainText[$j * 4 + 3]);
|
|
|
}
|
|
|
|
|
|
- for ($i=0; $i<32; $i++) {
|
|
|
- $tmp = $x[$i+1]^$x[$i+2]^$x[$i+3]^$this->_rk[$i];
|
|
|
- $buf= (self::SM4_SBOX[($tmp >> 24) & 0xFF]) << 24 |(self::SM4_SBOX[($tmp >> 16) & 0xFF]) << 16 |(self::SM4_SBOX[($tmp >> 8) & 0xFF]) << 8 |(self::SM4_SBOX[$tmp & 0xFF]);
|
|
|
- $x[$i+4]=$x[$i]^($buf^$this->sm4Rotl32(($buf), 2)^ $this->sm4Rotl32(($buf), 10) ^ $this->sm4Rotl32(($buf), 18)^ $this->sm4Rotl32(($buf), 24));
|
|
|
+ for ($i = 0; $i < 32; $i++) {
|
|
|
+ $tmp = $x[$i + 1] ^ $x[$i + 2] ^ $x[$i + 3] ^ $this->_rk[$i];
|
|
|
+ $buf = (self::SM4_SBOX[($tmp >> 24) & 0xFF]) << 24 | (self::SM4_SBOX[($tmp >> 16) & 0xFF]) << 16 | (self::SM4_SBOX[($tmp >> 8) & 0xFF]) << 8 | (self::SM4_SBOX[$tmp & 0xFF]);
|
|
|
+ $x[$i + 4] = $x[$i] ^ ($buf ^ $this->sm4Rotl32(($buf), 2) ^ $this->sm4Rotl32(($buf), 10) ^ $this->sm4Rotl32(($buf), 18) ^ $this->sm4Rotl32(($buf), 24));
|
|
|
}
|
|
|
|
|
|
$cipherText = [];
|
|
|
- for ($k=0; $k<4; $k++) {
|
|
|
- $cipherText[4*$k]=($x[35-$k]>> 24)& 0xFF;
|
|
|
- $cipherText[4*$k+1]=($x[35-$k]>> 16)& 0xFF;
|
|
|
- $cipherText[4*$k+2]=($x[35-$k]>> 8)& 0xFF;
|
|
|
- $cipherText[4*$k+3]=($x[35-$k])& 0xFF;
|
|
|
+ for ($k = 0; $k < 4; $k++) {
|
|
|
+ $cipherText[4 * $k] = ($x[35 - $k] >> 24) & 0xFF;
|
|
|
+ $cipherText[4 * $k + 1] = ($x[35 - $k] >> 16) & 0xFF;
|
|
|
+ $cipherText[4 * $k + 2] = ($x[35 - $k] >> 8) & 0xFF;
|
|
|
+ $cipherText[4 * $k + 3] = ($x[35 - $k]) & 0xFF;
|
|
|
}
|
|
|
|
|
|
return $this->bytesToString($cipherText);
|
|
|
@@ -177,7 +178,7 @@ class V2LakalaSM4
|
|
|
|
|
|
private function sm4Rotl32($buf, $n)
|
|
|
{
|
|
|
- return (($buf << $n) & 0xffffffff) | ($buf >> (32-$n));
|
|
|
+ return (($buf << $n) & 0xffffffff) | ($buf >> (32 - $n));
|
|
|
}
|
|
|
|
|
|
private function sm4KeySchedule($key)
|
|
|
@@ -186,16 +187,16 @@ class V2LakalaSM4
|
|
|
$key = array_values(unpack("C*", $key));
|
|
|
|
|
|
$k = [];
|
|
|
- for ($i=0; $i<4; $i++) {
|
|
|
- $k[$i] = self::SM4_FK[$i]^(($key[4*$i]<<24) | ($key[4*$i+1]<<16) |($key[4*$i+2]<<8) | ($key[4*$i+3]));
|
|
|
+ for ($i = 0; $i < 4; $i++) {
|
|
|
+ $k[$i] = self::SM4_FK[$i] ^ (($key[4 * $i] << 24) | ($key[4 * $i + 1] << 16) | ($key[4 * $i + 2] << 8) | ($key[4 * $i + 3]));
|
|
|
}
|
|
|
|
|
|
- for ($j=0; $j<32; $j++) {
|
|
|
- $tmp = $k[$j+1]^$k[$j+2]^$k[$j+3]^ self::SM4_CK[$j];
|
|
|
- $buf = (self::SM4_SBOX[($tmp >> 24) & 0xFF]) << 24 |(self::SM4_SBOX[($tmp >> 16) & 0xFF]) << 16 |(self::SM4_SBOX[($tmp >> 8) & 0xFF]) << 8 |(self::SM4_SBOX[$tmp & 0xFF]);
|
|
|
+ for ($j = 0; $j < 32; $j++) {
|
|
|
+ $tmp = $k[$j + 1] ^ $k[$j + 2] ^ $k[$j + 3] ^ self::SM4_CK[$j];
|
|
|
+ $buf = (self::SM4_SBOX[($tmp >> 24) & 0xFF]) << 24 | (self::SM4_SBOX[($tmp >> 16) & 0xFF]) << 16 | (self::SM4_SBOX[($tmp >> 8) & 0xFF]) << 8 | (self::SM4_SBOX[$tmp & 0xFF]);
|
|
|
|
|
|
- $k[$j+4]=$k[$j]^(($buf)^($this->sm4Rotl32(($buf), 13))^($this->sm4Rotl32(($buf), 23)));
|
|
|
- $this->_rk[$j]=$k[$j+4];
|
|
|
+ $k[$j + 4] = $k[$j] ^ (($buf) ^ ($this->sm4Rotl32(($buf), 13)) ^ ($this->sm4Rotl32(($buf), 23)));
|
|
|
+ $this->_rk[$j] = $k[$j + 4];
|
|
|
}
|
|
|
}
|
|
|
}
|