【问题标题】:Decrypt with RSA Public Key使用 RSA 公钥解密
【发布时间】:2021-10-03 08:30:14
【问题描述】:

我正在阅读有关 Linux/Edbury 恶意软件的报告,其中包括用于解密 DNS TXT 记录的 RSA 公钥,以及一些示例记录及其解密内容。我想自己执行此操作,但无法弄清楚如何使用公钥解密。一些网站似乎无法使用给定的公钥解密,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

模量= 168035759425641708560180952719202232808157544797727790464247213618476179383712253107003583015178435839911886769263163903424281459625379125873822735102370865763929704190706996338108960579432721666779496862012535830896815985724121830861130439235763053507097455518214304803032061390442053402776406921786417516093 P>

如何使用 RSA 公钥解密 TXT 记录?

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

RSA 公钥:

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

【问题讨论】:

  • 我认为这可能会解决您的问题:stackoverflow.com/questions/20545215/…
  • 但是如果我无法访问相应的私钥,我还能这样做吗?
  • @hungrycoder 否,如果操作正确,只有私钥可以解密消息,公钥用于加密
  • 我知道公钥是用来加密的,私钥是用来解密的,但是这个例子是私钥用来加密的,我有对应的公钥。如果上面的消息是用私钥加密的并且我有公钥,我该如何解密它?

标签: php encryption rsa


【解决方案1】:

使用私钥加密和使用公钥解密仅在签名/验证的上下文中进行。
相反,通常所说的加密/解密(出于保密目的)使用公钥进行加密,使用私钥进行解密。
请注意,这两个进程通常不能通过交换密钥来相互转换,因为它们使用不同的填充。

通常,在验证时,解密是在后台执行的,只向外返回验证结果:true 或 false。
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 格式指定了公钥,我使用 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>

【讨论】:

  • 这太完美了,谢谢!我认为这与密钥格式有关,但不确定究竟是什么。
猜你喜欢
  • 1970-01-01
  • 2012-05-07
  • 2011-03-08
  • 2013-06-08
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多