kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

95598停电公告信息抓取

https://blog.csdn.net/weixin_44492045/article/details/131921632

抓取网站:95598智能互动网站 https://www.95598.cn/osgweb/blackoutNotice

首先找到准确的url,可以看到请求参数是加密的,返回的数据也是加密的。

对于这类需要逆向加解密的网站,先通过请求栈来看一下,注意框起来的地方,可以很清楚的看到这里用到的是axios,所以加解密的过程中一定会运用到拦截器。

直接在全局搜索interceptor,可以看到能搜到对应的js,进入js就能找到对应的加密入口。

要想完成这个网站的逆向,还需要对加密算法有一定了解,比如sm国密算法,在进行加密之前还会先请求keycode和publickey,调整好流程,通过两次请求和加解密过程就能得到想要的数据。

sm1、sm2、sm3、sm4简单介绍

https://www.cnblogs.com/coolYuan/p/8630280.html

国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。

SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。

SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。

SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。

SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。

由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。

补充:

当使用特定的芯片进行SM1或其他国密算法加密时,若用多个线程调用加密卡的API时,要考虑芯片对于多线程的支持情况。

国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,在金融领域目前主要使用公开的SM2、SM3、SM4三类算法,分别是非对称算法、哈希算法和对称算法。

SM2算法:SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高。

SM3算法:SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。

SM4算法:SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件是其具备足够的密钥长度,SM4算法与AES算法具有相同的密钥长度分组长度128比特,因此在安全性上高于3DES算法。

php sm2

https://github.com/lpilp/phpsm2sm3sm4

1
2
3
yum --enablerepo=remi-php74 install php-gmp
./composer.phar require mdanter/ecc
./composer.phar require lpilp/guomi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
require '../composer/vendor/autoload.php';
use Rtgm\sm\RtSm2;

// $sm2 = new RtSm2('hex', false); 相同字符串每次算出不同值
$sm2 = new RtSm2();

echo "sm2加解密测试:\n";
$mks = $sm2->generateKey();
var_dump($mks);
$en = $sm2->doEncrypt($sm2->_str2hex($key), $mks[1]);
var_dump($en);

$de = $sm2->doDecrypt($en, $mks[0]);
var_dump($de);
var_dump(hex2bin($de));
echo "\n";
echo "\n";

https://www.cnblogs.com/blog-dyn/p/16301425.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use Mdanter\Ecc\Crypto\Key\PrivateKey;
use Mdanter\Ecc\Crypto\Signature\Signature;
use Mdanter\Ecc\Serializer\Signature\DerSignatureSerializer;
use Rtgm\ecc\RtEccFactory;
use Rtgm\sm\RtSm2;

require 'vendor/autoload.php';

$data = '{"request":{"body":{"TEST":"中文","TEST2":"!@#$%^&*()","TEST3":12345,"TEST4":[{"arrItem1":"qaz","arrItem2":123,"arrItem3":true,"arrItem4":"中文"}],"buscod":"N02030"},"head":{"funcode":"DCLISMOD","userid":"N003261207"}},"signature":{"sigdat":"__signature_sigdat__"}}';
$key = 'NBtl7WnuUtA2v5FaebEkU0/Jj1IodLGT6lQqwkzmd2E=';
$key = bin2hex(base64_decode($key));//转为16进制
$sm2 = new RtSm2('base64');
$userid = 'N003261207' . "0000000000000000";
$userid = substr($userid, 0, 16);
//签名
$sign = $sm2->doSign($data, $key, $userid);
$sign = base64_decode($sign);
$a = \FG\ASN1\ASNObject::fromBinary($sign)->getChildren();

$aa = formatHex($a[0]->getContent());
$bb = formatHex($a[1]->getContent());
$sign = $aa. $bb;
$sign = base64_encode(hex2bin($sign));
var_dump($sign);
//验签

$signHex = bin2hex(base64_decode($sign));
var_dump($signHex);
$r = substr($signHex, 0, 64);
$s = substr($signHex, 64, 64);
var_dump($r, $s);
$r = gmp_init($r, 16);
$s = gmp_init($s, 16);
/*$r = gmp_init('90416529259334433398865842692135340273188180784859666141339740103133164395295', 10);
$s = gmp_init('51927610271972364114244381230895889971736075490328811928131691394657016568041', 10);*/
$signature = new Signature( $r, $s );
$serializer = new DerSignatureSerializer();
$serializedSig = $serializer->serialize($signature);

$sign = base64_encode($serializedSig);
var_dump($sign);
$adapter = RtEccFactory::getAdapter();
$generator = RtEccFactory::getSmCurves()->generatorSm2();
$secret = gmp_init($key, 16);
$key = new PrivateKey($adapter, $generator, $secret);
$pubkey = $key->getPublicKey()->getPoint();
$x = $pubkey->getX();
$y = $pubkey->getY();
$pub = gmp_strval($x, 16);
$pub .= gmp_strval($y, 16);
var_dump($pub);
$b = $sm2->verifySign($data, $sign, $pub, $userid);
var_dump($b);

function formatHex($dec)
{
	$hex = gmp_strval(gmp_init($dec, 10), 16);
	$len = strlen($hex);
	if ($len == 64) {
		return $hex;
	}
	if ($len < 64){
		$hex = str_pad($hex, 64, "0", STR_PAD_LEFT);
	}else {
		$hex = substr($hex, $len - 64, 64);
	}

	return $hex;
}

SM4加密

1
2
3
4
$userid = 'N003261207' . "0000000000000000";
$userid = substr($userid, 0, 16);
$sm4 = new RtSm4($key);
$sign = $sm4->encrypt($data,'sm4',$userid ,'base64');

SM4解密

1
2
3
4
$userid = 'N003261207' . "0000000000000000";
$userid = substr($userid, 0, 16);
$sm4 = new RtSm4($key);
$data = $sm4->decrypt($sign,'sm4-cbc',$userid ,'base64');