Введение
Здравствуйте, у меня есть настольное приложение (на c ++), которое входит в мой API (в php). Я использую RSA для подписи и проверки, openssl в php и CNG (winapi) в c ++.
Проблема
При подписывании одних и тех же данных с одинаковым заполнением, алгоритм ha sh , пара ключей и др. c. на с ++ и PHP подписи разные. Проведя небольшое исследование, мы обнаружили следующие вопросы: php строка со знаком openssl не проверяется Win CryptoAPI CryptoAPI: использование CryptVerifySignature для проверки подписи из openssl с ключом publi c ключ НО I нашел здесь BCRYPT_RSAKEY_BLOB структуру что он использует big-endian.
Я делаю дополнительный шаг в середине, который преобразует ключ pem в ключ CNG, используя CryptDecodeObjectEx
, так что, возможно, это не заканчивается в big-endian.
Провел дополнительное исследование, но ничего не смог найти по этому поводу. Может быть, я переворачиваю подпись и неправильно набираю ключ, может кто-то перепроверить это?
Чего я пытаюсь достичь
Мне нужно иметь возможность подписывать / проверять данные между своими Desktop API (с использованием CNG) и мой API (с использованием openssl).
Примечание. Мне нужно, чтобы все обратные операции или изменения (для устранения проблемы) выполнялись в файле php, а не в настольном приложении. .
То, что я пробовал до сих пор
Я пытался спросить на форумах Microsoft, но вместо этого мне сказали спросить здесь.
Я попытался отменить подпись и закрытый ключ таким образом :
<?php
$decodedKey = base64_decode("MIIEpAIBAAKCAQEAqyVcnZVILda61v2vuxO8gJnbMSgQrh2FYPXD4Kb2UG7NAgbK44PS41yFFviWZ4iaYQsv2hoerx5qBRQa5pLfDvy5APEDlxF4H0wco0vQhVqpJhk92nSVuJhAT21RSb803VltENFW7nk60yR8y2wnRZawBokYGCswKpcQwBE4OesLuaTNOCFfJP6DI6tVyuM3ya4rjaY1dyX9EUhjXIUHuYGDk6smNmqyiAdQZqoVnr9JfE6YQJwYa1FGlQZQXZULBqjBXK9FgPcHwxMKCk7AQlpy930b5yugQU/E13z6goUHgvbm5vkz/lWn4nO1hgizYAP4SdqafVHwFWi9VGk1kQIDAQABAoIBAG8xR/nt6kY105AopAqkaP0YeOt3/1ZQQb7cDdYgQ7nAMxuU9C5bECG9k454FafQfZR9IyrNe5AE75a7GDsjwx5GnZ/59n4o0GVtGtIRSLnLTEg/cAtFYZzb9jRkbsK+IoeJOS4LBDLNuqVBeH7llqJEo7qrSWcycAnLugs/ZMtjVW8JuDFo8fnm+RvZfliY90mAoqL1QK12PTtrZYd1QCYOV5bgv5hyj5gCmHVL6WR4hznT4ZjGbRo/+rxQ1CIsjYCg7B7etegFo+R+N72rwauitRXMfyK7IblQcm0e/hkzQBSg8Ki7a4JjBMgIDn1Hfc54WOGHo1ypyznlFy6d5N0CgYEA0YJ7UvxHeP0sLzuHEgQaZAygfTBcgDWeU1i5vvg2QorlR/Lo3OSMSmtfGeCllgltpPKJJAhu5plkyo45OEnJ/7ZHNaTXX+RuRCgQPxX69Mz+rm40ItiMMTjjzCAKTAY0XvSZgnG8lnkMIVJGGlUAxy90mvBk45q4bpprwdcxYmsCgYEA0R+RkWYLh1kAwU156+xm4vV96zxlHtvRx3Kzr0BCSnxzA6z5WD3EvucgwgLA7vQtIavQBvP3XFjrLILsPD9j/pET0c+4K8uW8p8OernqEMKuWub1xLAqx4CC8Ld8z6L127EgzFXaELyOO9p3v1d/g4n072uaG5ovl8Oaf+OQ3vMCgYEAnjuXGtjwvh8wNMgXvnKc3/1tZL+WzToxxq8XMnVSvbUbb9i1KMfwcPBhFjFFvmiGh/Kpwy4fXEh0CEucSbfpORkY9Rn3lDP5V76ObqcSL7t3ipQvCjZUw4Q8/9kfDcYN3b2NBykRjvADSlNSIOccPFPKFI8FE6WyL86vHeqCINsCgYEAr+zLzDK5jiJc1UF1SPj2UQZO6P9E3mH0p8Ih0VPQsNLi+vugRBCqnCLaVvx0DFHUSdg9SCwjM0gGh8qYK9L0LysjLkV93TIHiZIvXyVZ+MGeZhCYPuApDO5auWDTGeYwyKHJQr0SlzPYwBd417onJqR/Lo8p9QCP+y9toRrzO+sCgYB9tOc5WAsZmtg3QpZD0GJrdS3kEcj7TXoSMBHK9J1JcTufjMxaGFhu0GYfyXTuj6fIE3+bvk3PvlYRRKZs3fSSmbyhFy5i5WedVNURGtXVeAncPtm3tMEexAiIBrS7oAPFfmQXsurF+nTZMfzztzzqpfGTCsS41oDB9gJ6YgsVAw==");
$privateKey = "-----BEGIN RSA PRIVATE KEY-----\n";
$privateKey .= base64_encode(strrev($decodedKey));
$privateKey .= "\n-----END RSA PRIVATE KEY-----";
$signature = "";
openssl_sign("Hello World!", $signature , $privateKey, OPENSSL_ALGO_SHA256);
echo base64_encode(strrev($signature));
?>
Но вывод пуст, openssl_sign
завершается неудачно, потому что privateKey
недействителен.
Я пытался отменить только подпись, но вывод отличается:
<?php
$privateKey = "-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAqyVcnZVILda61v2vuxO8gJnbMSgQrh2FYPXD4Kb2UG7NAgbK
44PS41yFFviWZ4iaYQsv2hoerx5qBRQa5pLfDvy5APEDlxF4H0wco0vQhVqpJhk9
2nSVuJhAT21RSb803VltENFW7nk60yR8y2wnRZawBokYGCswKpcQwBE4OesLuaTN
OCFfJP6DI6tVyuM3ya4rjaY1dyX9EUhjXIUHuYGDk6smNmqyiAdQZqoVnr9JfE6Y
QJwYa1FGlQZQXZULBqjBXK9FgPcHwxMKCk7AQlpy930b5yugQU/E13z6goUHgvbm
5vkz/lWn4nO1hgizYAP4SdqafVHwFWi9VGk1kQIDAQABAoIBAG8xR/nt6kY105Ao
pAqkaP0YeOt3/1ZQQb7cDdYgQ7nAMxuU9C5bECG9k454FafQfZR9IyrNe5AE75a7
GDsjwx5GnZ/59n4o0GVtGtIRSLnLTEg/cAtFYZzb9jRkbsK+IoeJOS4LBDLNuqVB
eH7llqJEo7qrSWcycAnLugs/ZMtjVW8JuDFo8fnm+RvZfliY90mAoqL1QK12PTtr
ZYd1QCYOV5bgv5hyj5gCmHVL6WR4hznT4ZjGbRo/+rxQ1CIsjYCg7B7etegFo+R+
N72rwauitRXMfyK7IblQcm0e/hkzQBSg8Ki7a4JjBMgIDn1Hfc54WOGHo1ypyznl
Fy6d5N0CgYEA0YJ7UvxHeP0sLzuHEgQaZAygfTBcgDWeU1i5vvg2QorlR/Lo3OSM
SmtfGeCllgltpPKJJAhu5plkyo45OEnJ/7ZHNaTXX+RuRCgQPxX69Mz+rm40ItiM
MTjjzCAKTAY0XvSZgnG8lnkMIVJGGlUAxy90mvBk45q4bpprwdcxYmsCgYEA0R+R
kWYLh1kAwU156+xm4vV96zxlHtvRx3Kzr0BCSnxzA6z5WD3EvucgwgLA7vQtIavQ
BvP3XFjrLILsPD9j/pET0c+4K8uW8p8OernqEMKuWub1xLAqx4CC8Ld8z6L127Eg
zFXaELyOO9p3v1d/g4n072uaG5ovl8Oaf+OQ3vMCgYEAnjuXGtjwvh8wNMgXvnKc
3/1tZL+WzToxxq8XMnVSvbUbb9i1KMfwcPBhFjFFvmiGh/Kpwy4fXEh0CEucSbfp
ORkY9Rn3lDP5V76ObqcSL7t3ipQvCjZUw4Q8/9kfDcYN3b2NBykRjvADSlNSIOcc
PFPKFI8FE6WyL86vHeqCINsCgYEAr+zLzDK5jiJc1UF1SPj2UQZO6P9E3mH0p8Ih
0VPQsNLi+vugRBCqnCLaVvx0DFHUSdg9SCwjM0gGh8qYK9L0LysjLkV93TIHiZIv
XyVZ+MGeZhCYPuApDO5auWDTGeYwyKHJQr0SlzPYwBd417onJqR/Lo8p9QCP+y9t
oRrzO+sCgYB9tOc5WAsZmtg3QpZD0GJrdS3kEcj7TXoSMBHK9J1JcTufjMxaGFhu
0GYfyXTuj6fIE3+bvk3PvlYRRKZs3fSSmbyhFy5i5WedVNURGtXVeAncPtm3tMEe
xAiIBrS7oAPFfmQXsurF+nTZMfzztzzqpfGTCsS41oDB9gJ6YgsVAw==
-----END RSA PRIVATE KEY-----";
$signature = "";
openssl_sign("Hello World!", $signature , $privateKey, OPENSSL_ALGO_SHA256);
echo base64_encode(strrev($signature));
?>
обратная подпись: GGYSPx9ybGr13kD8yz7LAN327KWuK6YfMHBaZedltyCcBLcEUJaerIOQB+kCk2Or+X+35lIJ3Qm/KYX0BY3wdtMCHMAIORnw6JBbAdBUvDThv0L8XPmzWx39fn8a6vxpxz3airo0DO6oDmKzBlcEAge5XKKJ7Wx76k/wwIaS0PRlylCaC+0jptsJWbJ8OoYNzMdBM0gF2mdHCe166cn+EFCaWtSszyfd/U+zU9WOrivUFyUb4PLyVQk2+yzoc4yVg0fySyG4YLs8KF5Kc6pMm3SGbqvjTbKg0f5Z8XErCgh+1xS07RuWRZFUGwHEyhH3xxvrZYvvsmkpVyPLuaDvoQ==
необратимая подпись: oe+gucsjVylpsu+LZesbx/cRysQBG1SRRZYb7bQU134ICitx8Vn+0aCyTeOrboZ0m0yqc0peKDy7YLghS/JHg5WMc+gs+zYJVfLy4BslF9Qrro7VU7NP/d0nz6zUWppQEP7J6XrtCUdn2gVIM0HHzA2GOnyyWQnbpiPtC5pQymX00JKGwPBP6nts7YmiXLkHAgRXBrNiDqjuDDS6ito9x2n86hp/fv0dW7P5XPxCv+E0vFTQAVuQ6PAZOQjAHALTdvCNBfSFKb8J3QlS5rd/+atjkwLpB5CDrJ6WUAS3BJwgt2XnZVpwMB+mK66l7PbdAMs+y/xA3vVqbHIfPxJmGA==
подпись CNG (кодировка base64): qJGMtHl77RGQPKaYwCLoFik8G7gpUkrtpbAcnI8beqZdU89dp73GLqXHA48nRQk/I+ZZ7pIe05aAuN9BU7/OHcyBh+iB/YGick3NcX9q5ihCdzNtNMpa7DjEi39qnITwUmmJilCxqPxN/kQFxC0DNXrUaDnfLxcAyYvKaSj5z6L60E9iaJ5BGPLaTSyWhWO8zDKWp5KxEXIIMScIIFkG7SPbhtMUy1YqeYMEHVaYGBbOkiwm1LqWY8byj2jXoRK+uSU6i/ovB07lxrOWgOf0VrS2ijJRXdbfeafEEcWCnpjF0g1w3sWQcVA2rHGy8U09JHZ/2buB1IbEe+FUkIfVsA==
Подробная информация о CNG
В случае необходимости я использую:
- RSA
- SHA256
- PKCS1 заполнение
Hello World!
в качестве входных данных.