【问题标题】:Reproduce openssl_private_encrypt() with OpenSSL使用 OpenSSL 重现 openssl_private_encrypt()
【发布时间】:2015-11-02 03:53:51
【问题描述】:

因为我试图将一段 PHP 代码转换为 Python,所以我试图找出 PHP 函数 openssl_private_encrypt() 的作用。

我希望能够直接重现 openssl_private_encrypt() 使用 OpenSSL 生成的内容,但由于某种原因,我没有得到相同的结果。 openssl_private_encrypt() 到底在用 OpenSSL 做什么?

OpenSSL 的 RSA_private_encrypt() 被 PHP 的 openssl_private_encrypt() according to the PHP source code 使用。 openssl rsautl -sign according to a different source 正在使用相同的 OpenSSL 方法。相同的(默认)填充 -pkcs 也被使用。但是我似乎无法重现相同的加密结果。

以下 PHP 代码:

$key = "-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA1tV0KlPGaeOnhlcYy3D5dr4Yd++Jz0puBBs8GIa4ammLqaoY
7Xo4J/jp9El3eK2GjwR82uXMNrICZKT0gU4k7LfXD5GUz5TqOfMIWSIM1mKPb67L
Xg5qfJ/8/cLY1RguzImd+ONQJ+MOtjtxE5BXq2luNL9k2Qw1aEhQR22xyzPPBwD9
0nCLhiq56lVXrG10+W9wMdNwtxTLc4hf3OF8IwEActV+Yw9xU8FuJnuAgovaFRQ2
/UC5OhPZckxhGoYJ7J5GSFBTNTuOuwyR/mGWXxgMNS/aQVOwK/+m7JWlwgOT5BdU
qL4ctk7rzRCWLdPhu0UmOxfHJMzjnqoXIWtL7wIDAQABAoIBAQDR2ryYxDDjKuBw
GBA+WmM1HMgmEDVb6ebB2CDCDIeEWwl0eJXVFDhaw4k1ebZciZURi16zLRpoq0Yv
LfsxfDYRjhtkN99XTq3mYYLcHqjPmoNmoyZBAHAAwP+OmpDYx8CfSCaqAtI/xEqQ
tEvmwm8BIAHpQLSwWH6rGUhiHcM5K953f5x10xuWSOH6xlAzdkLbjgN70aOQEbxw
703mKznw25UPspt89RFQPQDtgUnu76TzUp7jytxiyomj3h0CixTIAZd0OtF4g5kn
clNLCYSTVt2PBvlH/tDgVQ31JwLlzfrkHblTHFB4YNz49rempMGou/X+mHB4y5S1
CiN1LR4hAoGBAOxMywVgVmtPyLCFEetf9N1mWjiPpHsgmm+DxZPleQ8+G3G7Uc94
MO2ZUyEXayjK5L4ZwP/RoZGwo0j9VU1tzpRnjtpZYuRQNpqc3+VSzj3yasgaUh9H
syPyMCHn3H/9Qc4wD4hvRNtTTtESAaA0NM6zBGPOOCbYPelsbrwhcsoZAoGBAOi+
hXPKDhdw+whZZssOlSaZW42qfyGZwHkugRmSGplMHA3yrNGnRyn/CtQNA/r5fe/1
T/3XQy35+OyY7IxduPUUXMk4RAi1w61hr4PFs3MuewVEXUTus6q5gs/gZs1wK1DZ
BIFCHNfUYx6Bnq2O2Ytwvr7AiUlDOZRPddM1dRdHAoGAWiLk4pUgAek6LZNlBXrh
5b5QNfkdDdae8mC6cjL7XcQcJeMFTvWS/F8bJalQOAxE+vrJ8wtc7T0K3CG+cz2q
qlNiW4nzPhIW8h1bDpfqkhixgMkBgGsSO2j70UMnii7p9iPBGRMQmfUKQJf0xM6F
Qj9pMkUMiEy+ORcimmLL7akCgYB2EkkjT4rMi41eU/RY6OHzffM7MBZkllpVX6kw
rrT9teW5kbXoegMZJAB7SMsPJEimVf2pme3Dwj9sz7uZDebJtfXIQtoIzSUirR7c
K4x4z0iriF4EnU/aOVhKWt3sNI5U6nNlm4OEXoOWM02rYH+uRJkPrh83Ynowagst
Bb6L+wKBgQCAQpA7RytBXig/wF95qYtLnDjRAV+CoNldfAMVjB1+xvXgGWsq8jDW
bD9q+bFcGg7KQf7Lp/0VUkgB1p+bWVp+kq2XNfXgmrgzfzFsra95xPb7YJEFFoy1
o/fsQwasOd+ijJsMOWzrAG3eTIz3H3AsBJTed/tiUe5dNvVzmuj5ZA==
-----END RSA PRIVATE KEY-----";

openssl_private_encrypt("narf", $signature, $key);
echo bin2hex($signature);

给我:

b8a0b9ed54c4e6e7fb4da1b4180dcf8d56baf7cf4309b99c26f44079f5da
0b1566f8a6bb83d83b7a87078eb34e05b68e91e7a8279241bee16a1d003e
c3a99ebcbc1096b01f9bbe11ab1cce1ffc26ac38d8739efbf077c55ee80b
9afefb737ab816ef5b56e9120861a0fd53f36fb23bda6c545581ea220857
f055408ff7b8a2b4450a77928a9600bb6d053a22fb32d20834240953db3f
e0a31d453a9a2d956d0e7e56ca7849fde44e88c07363779e37ab53ecc7da
e5a91cef2a79232a782b56365937f6d48a351cf33036d8a15a859a47d781
09ac57e6261f8c73f44eb45e776d88182713b92aed359ec2953c01fdcf51
e59fbc4b1835cf4809d59ff95d869be9

当命令行时:

openssl rsautl -sign -inkey test_rsa -out data_out <<< "narf"
xxd -p data_out

test_rsa 与 PHP 代码中的键相同。我明白了:

bc9d5dc772385965a7889a3e387b6398f3e58811aa0aee4b45a1576c08c2
7cde7e8d3e4b27d7fc350018b6c36f055c047ef9cd9aa8831a315fe5a350
ec271aaafa59f9dd9dda5b1ddf826e0f134785d9753eaabc866b0c716ce2
b7ac71a4ee79a3827cfc73c2169bff8ee7173172d8af8c9630e91d63c430
d308e15a1fb85a7b6fe257836e018102b8e55825c6a1a2413232b9a025a3
ca38e451d49cb04ad8a9be8452f213220d62711417c1e33adcededf9c172
2e87007e3fe25fba093774adfef3d3e72f4b3fa578a5a99721a002e69158
7e48e56ff5477162630739f74a385bb9e65da44821a278f6792e52c0edc8
356393e85b4692f33cd845d3a02760d4

为什么结果不一样?

【问题讨论】:

  • 不要共享私钥!
  • 大声笑,是的,我知道,别担心,但感谢您的提醒。我为这个测试生成了它。 ;-)
  • 你试过openssl_private_encryptOPENSSL_NO_PADDING
  • @tlenss:这是我无法更改的现有 PHP 代码,我必须重现。我可能能够更改 PHP 中的填充以匹配 OpenSSL 的结果,但我需要它相反。 PHP 默认应用OPENSSL_PKCS1_PADDING,这与 OpenSSL 的默认设置没有区别。只有 -raw 是 OpenSSL 的一个选项,但这给了我一个关于数据太小的错误。
  • 你做到了吗?

标签: php encryption openssl private-key


【解决方案1】:

PKCS1 填充使用了一些随机字节,所以每次加密后的输出都不一样。

在运行xxd -r -p|openssl rsautl -verify -inkey test_rsa 时,PHP 和 openssl 输出都返回输入字符串 'narf'。

【讨论】:

    猜你喜欢
    • 2016-07-18
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2022-08-19
    • 2013-01-31
    • 2013-10-30
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多