const crypto = require("crypto");
const encryptedData =
"jPNGTNLtGIBc7Jv2UXj7a3FNQk13eUJ5T3VIUXlOS0ZVOEpnMUpPMnhvQXg5bE5kMGFHejVxaTFnYTA9";
const key = "qEExPE+jkJxQUt8fSO+XwzXgRGh6kLHy+lWEe6Z8T6s=";
const decodedKey = Buffer.from(key, "base64");
const decodedData = Buffer.from(encryptedData, "base64");
const ivLength = 16;
const iv = decodedData.slice(0, ivLength);
const encryptedText = decodedData.slice(ivLength);
const decipher = crypto.createDecipheriv("aes-256-cbc", decodedKey, iv);
try {
let decrypted = decipher.update(encryptedText, null, "utf8");
decrypted += decipher.final("utf8");
console.log("Расшифрованная строка:", decrypted);
} catch (error) {
console.error("Ошибка расшифровки:", error.message);
}
# key
$ echo qEExPE+jkJxQUt8fSO+XwzXgRGh6kLHy+lWEe6Z8T6s= | xxd -l 32 -ps -c 256
7145457850452b6a6b4a785155743866534f2b58777a5867524768366b4c4879
# iv
$ echo jPNGTNLtGIBc7Jv2UXj7a3FNQk13eUJ5T3VIUXlOS0ZVOEpnMUpPMnhvQXg5bE5kMGFHejVxaTFnYTA9 | base64 -d | xxd -l 16 -ps
8cf3464cd2ed18805cec9bf65178fb6b
# encrypted text
$ echo jPNGTNLtGIBc7Jv2UXj7a3FNQk13eUJ5T3VIUXlOS0ZVOEpnMUpPMnhvQXg5bE5kMGFHejVxaTFnYTA9 | base64 -d | cut -b 17-
qMBMwyByOuHQyNKFU8Jg1JO2xoAx9lNd0aGz5qi1ga0=
# результат
$ echo qMBMwyByOuHQyNKFU8Jg1JO2xoAx9lNd0aGz5qi1ga0= | openssl AES-256-CBC -d -a -K 7145457850452b6a6b4a785155743866534f2b58777a5867524768366b4c4879 -iv 8CF3464CD2ED18805CEC9BF65178FB6B
/playlist.m3u8+1729705980
// Вспомогательные функции
const B = (str) => Uint8Array.from(str, c => c.charCodeAt(0));
const S = (buf) => String.fromCharCode(...new Uint8Array(buf));
// дано
const encryptedData = "jPNGTNLtGIBc7Jv2UXj7a3FNQk13eUJ5T3VIUXlOS0ZVOEpnMUpPMnhvQXg5bE5kMGFHejVxaTFnYTA9";
const key = "qEExPE+jkJxQUt8fSO+XwzXgRGh6kLHy+lWEe6Z8T6s=";
const iv = B(atob(encryptedData).slice(0, 16));
const cryptoKey = await crypto.subtle.importKey(
'raw',
// На самом деле используется только 32 байта из key
B(key.slice(0, 32)),
'AES-CBC',
true,
['encrypt', 'decrypt']
);
const encryptedText = B(atob(atob(encryptedData).slice(16)));
let decrypted = S(await crypto.subtle.decrypt({ name: 'AES-CBC', iv }, cryptoKey, encryptedText));
console.log(decrypted); // /playlist.m3u8+1729705980
package main
import (
"fmt"
)
type MyError struct {
Message string
}
func (e MyError) Error() string {
return e.Message
}
func main() {
// Возвращаем из функции нашу кастомную ошибку, но в виде интерфейса error
err := foo()
if err == nil {
fmt.Println("Нет ошибки")
// И теперь тут приводим error к нашему типу MyError и проверяем
} else if myErr, ok := err.(MyError); ok {
fmt.Printf("Ура! Нужный нам тип ошибки: %v\n", myErr.Message)
} else {
fmt.Println("Какой-то другой тип ошибки:", err)
}
// Проверка одной из "подстав" Go
err = bad()
if err != nil {
fmt.Println("Упс... Как так... Не nil...")
} else {
fmt.Println("Должно вывестись это, но не выводится...")
}
err = good()
if err != nil {
fmt.Println("Это не должно выводиться, всё верно.")
} else {
fmt.Println("Ошибки нет, всё верно.")
}
}
func foo() error {
err := MyError{"Ой! Ошибка MyError!"}
// err := fmt.Errorf("Ой! Обычная ошибка!")
// var err error = nil
return err
}
func bad() error {
var p *MyError = nil // Вроде же nil, но не работает....
// p = &MyError{"Ой!"} // Пробуем создать ошибку, и всё работает.
if p == nil {
fmt.Println("Ну nil же-ж... Должно же-ж работать", p)
}
return p
}
func good() error {
// return MyError{"Ой!"}
// Буквально пишем "nil", никаких указателей, которые равны nil, это прямой выстрел в ногу
return nil
}
package main
import "fmt"
type MyError struct {
Message string
}
func (e MyError) Error() string {
return e.Message
}
func (e MyError) Smth() {
}
type SomeInterface interface {
Smth()
}
func main() {
var err SomeInterface
err = MyError{"Something went wrong"}
// Проверяем, реализует ли err интерфейс error
if _, ok := err.(error); ok {
fmt.Println("err реализует интерфейс error")
} else {
fmt.Println("err НЕ реализует интерфейс error")
}
}
почему этот запрос просматривает так много записей?
Мне возвращается первые 3 строки.
//Перед обновление стейта сохраняешь текущую версию
const oldState = { ...state }
//Обновляешь стейт
setState({ foo: 'bar' });
//Этот код нужно выполнять в юзефект с депсами стейта
//Это массив измененных свойств
const changedProperties = {};
for (const key in state) {
if (state.hasOwnProperty(key) && oldState[key] !== state[key]) {
changedProperties[key] = state[key];
}
}
//Проверяем если были обновления и отправляем
if (Object.keys(changedProperties).length > 0) {
fetch('/endpoint', {
method: 'POST',
body: JSON.stringify(changedProperties),
headers: {
'Content-Type': 'application/json'
}
}).then((response) => {
if (response) {
console.log('Данные успешно обновлены на сервере');
} else {
console.log('Не удалось обновить данные на сервере');
// В случае ошибки апдейтп можно откатить стейт
setState(oldState);
});
}