Я хочу зашифровать некоторые данные с помощью ключа c publi и режима RSA PKCS # 1. Я сделал это на PHP с использованием библиотеки phpseclib
, и она работает без проблем.
Вот мой PHP код:
<?php
include(__DIR__ . DIRECTORY_SEPARATOR . 'phpseclib/Crypt/RSA.php');
$apiKey = 'xxxxxxxxxxxxxxxxxxxx';
$publicKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxx';
// request values in JSON format
$Parameters = array(
"name" => "Example Name",
"mobile" => "99999999999",
"remark" => "Product ",
"email" => "example@example.com",
"language" => "en",
"fields" => array (
"udf1" => "",
"udf2" => "",
"udf3" => "",
),
);
// Create rsa object
$rsa = new Crypt_RSA();
// Load public key
$rsa->loadKey($publicKey);
// Set the mode to PKCS#1
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
//Start the loop through the PHP array to encrypt the value
$returnValue = [];
if($Parameters){
foreach($Parameters as $x => $x_value){
if($x == "fields"){
$_Fields = [];
foreach($x_value as $y => $y_value){
$ciphertext = $rsa->encrypt($y_value);
// Convert it into Base64
$y_value_encrypted = base64_encode($ciphertext);
// insert the line array into the overall array
$_Fields[$y] = $y_value_encrypted;
}
$returnValue[$x] = $_Fields;
}else{
$ciphertext = $rsa->encrypt($x_value);
// Convert it into Base64
$x_value_encrypted = base64_encode($ciphertext);
// insert the line array into the overall array
$returnValue[$x] = $x_value_encrypted;
}
}
print $returnValue;
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.example.com/v1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $returnValue,
CURLOPT_HTTPHEADER => array(
"authorization: Bearer $apiKey",
"content-type: application/json"
),
));
$result = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
print $result;
}
?>
Я хочу использовать тот же метод на NodeJS, но я получаю ошибку от API из-за плохого шифрования Parameters
данные.
Вот мой NodeJs код:
var crypto = require('crypto');
var request = require('request');
const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; //User API KEY
const publicKey = `-----BEGIN PUBLIC KEY-----\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n-----END PUBLIC KEY-----`; //User public Key
//Set data to encrypt
const Parameters = {
'name': 'example name',
'mobile': '9999999999',
'remark': 'Product ',
'email': 'example@example.com',
'language': 'en',
'fields': {
'udf1': '',
'udf2': '',
'udf3': '',
},
};
//Start encrypting "Parameters" values
function encrypt(requestData) {
var dataToEncrypt = requestData;
var returnValue = {};
if (dataToEncrypt) {
for (var i in dataToEncrypt) {
//Encrypt 'fields' values
if (i == 'fields') {
var fields_array = {};
var fields = dataToEncrypt[i];
for (var y in fields) {
var yVlaue = fields[y];
var result;
result += crypto.publicEncrypt({key:publicKey, padding:crypto.constants.RSA_PKCS1_PADDING}, Buffer.from(yVlaue, 'utf8') ).toString('base64');
fields_array[y] = result;
}
returnValue[i] = fields_array;
} else {
//Encrypt other values
var result;
result += crypto.publicEncrypt({key:publicKey, padding:crypto.constants.RSA_PKCS1_PADDING}, Buffer.from(dataToEncrypt[i], 'utf8') ).toString('base64');
returnValue[i] = result;
}
}
}
Send(returnValue);
return returnValue;
}
function Send(encryptedData) {
var options = {
'method': 'POST',
'url': 'https://api.example.com/v1',
'headers': {
'Authorization': 'Bearer '+ apiKey,
'Content-Type': 'application/json'
},
body: JSON.stringify(encryptedData)
};
request(options, function (error, response) {
if (!error && response.statusCode == 200) {
console.log("\nResult:\n"+response.body);
} else {
console.log(error.message);
}
});
}
encrypt(Parameters);
Как правильно шифровать строки с помощью ключа publi c и использовать режим RSA PKCS # 1 на NodeJs как что я сделал на PHP?
Обратите внимание, что шифрование работает на NodeJs, но проблема на пути шифрования.