使用 RSA Public 密钥解密

Decrypt with RSA Public Key

我正在阅读一份关于 Linux/Edbury 恶意软件的报告,其中包含用于解密 DNS TXT 记录的 RSA public 密钥,以及一些示例记录及其解密内容。我想自己执行此操作,但不知道如何使用 public 密钥解密。一些网站似乎无法使用给定的 public 密钥解密,并且 PHP 无法理解密钥格式,即使使用 RSA_public_decrypt.

php > $b = base64_decode("P999MR0e//emIov0Z2qtoKKKhFtb1F6l+zMxn9a3q2p18ZWeaTyPXMAlXDAQI3bz6pxmeQzGCuz1P1ms25AiPKGuqhZ+etJXVnjy9Ir4zc2UU3jyeFZhs7UEfGAcZut5LY9dt5tCJKhPhYwbz4s2ZixBVUWPbFDuODCJIi4L3fw=");
php > $d = '';
php > echo file_get_contents("pub.pem");
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAOadSGBGG9x/f1/U6KdwxfGzqSj5Bcy4aZpKv77uN4xYdS5HWmEub5Rj
nAvtKybupWb3AUWwN7UPIO+2R+v6hrF+Gh2apcs9I9G7VEBiToi2B6BiZ3Ly68kj
1ojemjtrG+g//Ckw/osESWweSWY4nJFKa5QJzT39ErUZim2FPDmvAgMBAAE=
-----END RSA PUBLIC KEY-----
php > openssl_public_decrypt($b,$d,file_get_contents('pub.pem'));
PHP Warning:  openssl_public_decrypt(): key parameter is not a valid public key in php shell code on line 1

然后我能够使用 this website 提取指数和模数,得到:

指数 = 65537

modulus = 168035759425641708560180952719202232808157544797727790464247213618476179383712253107003583015178435839911886769263163903424281459625379125873822735102370865763929704190706996338108960579432721666779496862012535830896815985724121830861130439235763053507097455518214304803032061390442053402776406921786417516093

如何使用任何方法使用 RSA public 密钥解密 TXT 记录?

加密信息(base64):P999MR0e//emIov0Z2qtoKKKhFtb1F6l+zMxn9a 3q2p18ZWeaTyPXMAlXDAQI3bz6pxmeQzGCuz1P1 ms25AiPKGuqhZ+etJXVnjy9Ir4zc2UU3jyeFZhs 7UEfGAcZut5LY9dt5tCJKhPhYwbz4s2ZixBVUWP bFDuODCJIi4L3fw=

RSA Public 密钥:

-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAOadSGBGG9x/f1/U6KdwxfGzqSj5Bcy4aZpKv77uN4xYdS5HWmEub5Rj
nAvtKybupWb3AUWwN7UPIO+2R+v6hrF+Gh2apcs9I9G7VEBiToi2B6BiZ3Ly68kj
1ojemjtrG+g//Ckw/osESWweSWY4nJFKa5QJzT39ErUZim2FPDmvAgMBAAE=
-----END RSA PUBLIC KEY-----

使用私钥加密和使用 public 密钥解密仅在 signing/verifying 的上下文中发生。
相比之下,通常所说的encryption/decryption(出于保密目的)使用public密钥进行加密,使用私钥进行解密。
请注意,这两个过程通常不能通过交换密钥相互转换,因为它们使用不同的填充。

通常情况下,验证时,解密是在幕后进行的,只是向外返回验证结果:真或假。
但是,openssl_public_decrypt() 支持明确允许解密的 低级验证 。如果执行此操作,则生成的明文为:

op3f1libgh.biz:3005980741:1622505600

对应的PHP代码为:

$publicKey = "-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDmnUhgRhvcf39f1OincMXxs6ko
+QXMuGmaSr++7jeMWHUuR1phLm+UY5wL7Ssm7qVm9wFFsDe1DyDvtkfr+oaxfhod
mqXLPSPRu1RAYk6ItgegYmdy8uvJI9aI3po7axvoP/wpMP6LBElsHklmOJyRSmuU
Cc09/RK1GYpthTw5rwIDAQAB
-----END PUBLIC KEY-----";

$signature = base64_decode("P999MR0e//emIov0Z2qtoKKKhFtb1F6l+zMxn9a3q2p18ZWeaTyPXMAlXDAQI3bz6pxmeQzGCuz1P1ms25AiPKGuqhZ+etJXVnjy9Ir4zc2UU3jyeFZhs7UEfGAcZut5LY9dt5tCJKhPhYwbz4s2ZixBVUWPbFDuODCJIi4L3fw=");
        
openssl_public_decrypt($signature, $decrypted, $publicKey, OPENSSL_PKCS1_PADDING);
print($decrypted) . PHP_EOL; // op3f1libgh.biz:3005980741:1622505600

请注意,您以 PKCS#1 格式指定了 public 密钥,我使用 openssl:

将其转换为 PHP 代码的 X.509/SPKI 格式
openssl rsa -pubout -RSAPublicKey_in -in <path to pkcs#1 public key> -out <path to x.509/spki public key>