热衷于downvoters和/或关闭者:如果你认为这是SO的offtopic,请指出我的其他StackExchange站点,这个问题更合适.
如何在PHP中实现ECDSA曲线secp256k1?
或者说:是否有任何解决方案 - 即.包括专业课程 - 已经完成了吗?
我可以看到有很多开源库,类和其他语言可用的东西(JavaScript,Python,...)但我整个下午都在谷歌上搜索一些/任何PHP解决方案而且...... 没有!.
这是我的比特币项目,我需要一种如何从私钥生成公钥的方法 ...... 然后我想生成最终的比特币地址.
我知道如何生成私钥(不要担心它是随机的或不是 - 这里不是问题)我有256位十六进制和WIF符号.但下一步:提出一个公钥,然后是最终的比特币地址,对我来说是一个问题,因为我确实没有加密的背景,我知道解决方案是以某种方式利用secp256k1.
这是我到目前为止:
// Random bytes
// $private_key = bin2hex(openssl_random_pseudo_bytes(32));
// But using brainwallet.org style to have easy comparison
$passphrase = "correct horse battery staple";
$private_key = hash('sha256', $passphrase);
var_dump ("PrivKey: $private_key");
// Bitcoin::privKeyToWIF from github.com/mikegogulski/bitcoin-php
$wif = Bitcoin::privKeyToWIF($private_key);
var_dump ("WIF PrivKey: $wif");
// And now I don't know where to even start …Run Code Online (Sandbox Code Playgroud) 这是我用来加密/解密数据的代码:
// Set the method
$method = 'AES-128-CBC';
// Set the encryption key
$encryption_key = 'myencryptionkey';
// Generet a random initialisation vector
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method));
// Define the date to be encrypted
$data = "Encrypt me, please!";
var_dump("Before encryption: $data");
// Encrypt the data
$encrypted = openssl_encrypt($data, $method, $encryption_key, 0, $iv);
var_dump("Encrypted: ${encrypted}");
// Append the vector at the end of the encrypted string
$encrypted = $encrypted . ':' . $iv;
// Explode the string using the `:` separator.
$parts …Run Code Online (Sandbox Code Playgroud) 编码:
$token = $request->getQueryParams();
$jwt_access_token = $token['access_token'];
$separator = '.';
list($header, $payload, $signature) = explode($separator, $jwt_access_token);
$decoded_signature = base64_decode($signature);
$payload_to_verify = utf8_decode($header . $separator . $payload);
$public_key = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/pubkey.pem');
$verified = openssl_verify($payload_to_verify, $decoded_signature, $public_key, OPENSSL_ALGO_SHA256);
Run Code Online (Sandbox Code Playgroud)
示例访问令牌:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpZCI6IjU0YmEzYmQwZDRkYzAxYmZhNmJjYjdjYTIwOTQwY2YzY2NmM2EyNjQiLCJqdGkiOiI1NGJhM2JkMGQ0ZGMwMWJmYTZiY2I3Y2EyMDk0MGNmM2NjZjNhMjY0IiwiaXNzIjoiIiwiYXVkIjoidGVzdGNsaWVudCIsInN1YiI6InNhbGxlIiwiZXhwIjoxNDgyMTIyODY4LCJpYXQiOjE0ODIxMTkyNjgsInRva2VuX3R5cGUiOiJiZWFyZXIiLCJzY29wZSI6bnVsbH0.q-xwz16YbUiaDzdeiNBoaeZIYNx8G6HXLZRMJjpiezotq0nICTokVxuf3OUur6433MhT6wVCUENUeuJfuvLg3wKZWHfXSoTMG77Gkv1Wart6hlIPFqyZ13gyTzquaKRRDoRD9WSBcKXfTF6V59cWHrwAM5nRIQeOzBdYXZPwnV-9RhXUpjUhJ0LKRJsDZ5EwJUFsIDb7oZ70b3uLJqa79h42Dc5mQWj75uIo8mVCmH9N1BPJRn-Hb9ttgpu2oRgDOqsm4zdBz2CfSkPiHa-j6qKEWHocyLQBZ8XLxyvFSAFVIwqv4OVCBHanzbkfY-ZKkKh1THeyiIcrB9ed6vwzRg
Run Code Online (Sandbox Code Playgroud)
公钥:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs3k2ZkpYqCX94B+qC2yc
4atWx+C5d7kFQAgBrbv5gfFuIST0DLt5lvv0OZZI57+ydNXb2G/jyOJPH3ll2mHS
Z+PKAo9aQoL5iYIjz+yYp2Im51LBh4e0Kt1RSjuy4M5RI1JVSsM9rt3NoLMzehv8
57g+uv1T177cJabDvKeqWdD0qR4N7PE/nV0Hrumz5kP4EnYhN0A2wjbXyyyllxhL
nr3Wqii0XJxBF3AwLUlqP1NYhm2wYq0CTjQrgv3/9WCvr4fSzBitzQAP6ZIFRHO3
F8EIaK6r6cDiP2ABmtTrmPAj3ZpqGVBPnvY9yVrqUS0pMxjvvesJiPd2jGrjLQFN
LQIDAQAB
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
我无法让openssl_verify()函数返回 1。它总是返回 0(它无法验证令牌)。我不明白为什么。任何人都可以指出我正确的方向吗?
在使用cUrl从我的网页生成销售线索时,我收到“ CONNECT后从代理服务器收到56的HTTP代码403”错误。该站点的SSL证书已过期。
更新:
我的代码如下:
curl_setopt($curl, CURLOPT_URL, $_url);
curl_setopt($curl, CURLOPT_POST, count($field));
curl_setopt($curl, CURLOPT_POSTFIELDS, $query_data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_USERAGENT, "cusom module");
Run Code Online (Sandbox Code Playgroud) 我使用pkcs7签署文档,一切正常,问题是验证标志的命令不起作用,总是返回false.我尝试将terminal命令用于文件并正常工作.
签名命令:
openssl_pkcs7_sign(
$tempdoc,
$tempsign,
$this->signature_data['signcert'],
array($this->signature_data['privkey'],
$this->signature_data['password']),
array(),
PKCS7_BINARY | PKCS7_DETACHED);
Run Code Online (Sandbox Code Playgroud)
验证命令:
openssl_pkcs7_verify($tempsign, PKCS7_NOVERIFY)
Run Code Online (Sandbox Code Playgroud)
终端命令:
openssl pkcs7 -inform DER -in signature.pkcs7 -print_certs -text
Run Code Online (Sandbox Code Playgroud)
编辑1
我在我的代码中进行测试,并发现我是否仅使用PKCS7_DETACHED或PKCS7_BINARY创建我的符号正常验证,但两者一起我收到错误.为什么会这样?
我已经通过openssl_x509_parse()函数解析了 openssl 证书,并得到了一个数组作为结果。
现在我需要获取该证书的到期时间。在解析的数组中,我有validTo_time_t包含有效 unix 时间戳的元素。但是如何确定这个时间戳属于哪个时区呢?
所以我无法获得真正的过期时间,因为该时间戳意味着不同时区的不同日期。
我在使用 php 建立 ssl 连接时遇到了一些奇怪的问题。我有网络和数据库服务器。我已经通过openssl生成了证书。它们完全一样。
所以我正在尝试使用 mysql 命令从网络服务器连接:
mysql -h 10.1.1.1 -uroot -p
Password
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 71
Server version: 5.5.5-10.1.19-MariaDB MariaDB Server
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input …Run Code Online (Sandbox Code Playgroud) 由于mcrypt在PHP 7.1中已弃用,并且我在现有项目中使用mcrypt加密/解密了很多数据,因此如何将我的PHP代码从mcrypt迁移到OpenSSL?我有以下代码要加密:
$encoded = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, 'salt', 'source string', MCRYPT_MODE_ECB));
Run Code Online (Sandbox Code Playgroud)
解密代码为:
$source = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, 'salt', base64_decode('encoded string'), MCRYPT_MODE_ECB);
Run Code Online (Sandbox Code Playgroud)
openssl_在不进行编码数据转换的情况下,以上示例中应使用哪些函数来获得相同的结果?
还是唯一的方法是运行一个脚本,该脚本将使用mcrypt解密所有存储的加密数据并使用openssl进行编码?
谢谢
我正在尝试在我的服务器上创建一个 UUID,并且由于某种原因openssl_enrypt正在初始化一个空字符串。如果它返回 false,这将是一个不同的对话,但事实并非如此,它返回一个字符串,只是一个空字符串。
这是我用来构建我想要的加密字符串的所有代码:
$key = hash_hmac("sha512", "You can decrypt this all day long, won't get you closer to the truth", "myKey");
$iv = openssl_random_pseudo_bytes(16);
$adminVal = filter_var($userData['is_admin'], FILTER_VALIDATE_BOOLEAN);
$userName = $userData["name"];
$dataEncrypt = $adminVal.$userName;
$encrypted = openssl_encrypt($dataEncrypt, "AES-256-XTS", $key, 0, $iv);
Run Code Online (Sandbox Code Playgroud)
我有var_dumped $key、$iv、$dataEncrypt和 它们都返回正确的值。
我正在使用 Alpine、php7.2-fpm 和 Composer 构建 Docker 镜像。
尝试安装 Composer 时会出现问题,它使用 https 通过 php 下载安装程序。
我添加了存储库以便能够安装 php7.2(用于安装 Composer)及其软件包:
RUN wget -O /etc/apk/keys/phpearth.rsa.pub https://repos.php.earth/alpine/phpearth.rsa.pub && \
echo "https://repos.php.earth/alpine/v3.7" >> /etc/apk/repositories && \
apk update
Run Code Online (Sandbox Code Playgroud)
当我尝试下载composer时出现以下错误:
/ # php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
PHP Warning: copy(): Unable to find the wrapper "https" - did you forget to enable it when you configured PHP? in Command line code on line 1
PHP Stack trace:
PHP 1. {main}() Command line code:0
PHP 2. copy() Command line …Run Code Online (Sandbox Code Playgroud) php ×10
php-openssl ×10
aes ×1
alpine-linux ×1
bitcoin ×1
composer-php ×1
cryptography ×1
curl ×1
docker ×1
ecdsa ×1
encryption ×1
hash ×1
jwt ×1
mcrypt ×1
mysql ×1
mysqli ×1
openssl ×1
pkcs#7 ×1
salesforce ×1
sha512 ×1