LINUX.ORG.RU
ФорумTalks

xorf - простая тулза для XOR-шифрования файлов

 , ,


1

1

Смотрите, какой ненужный велосипед запилил:

xorf - простая тулза для XOR-шифрования файлов. Пример использования:

# Зашифровать файл text.txt, используя ключи из файлов key1 и key2:
$ xorf text.txt key1 key2 > encrypted1.txt

# Начать генерировать новый ключ, зашифровать им файл encrypted1.txt, записать ключ в файл key3
$ xorf encrypted1.txt -k key3 > encrypted2.txt

# Для того чтобы расшифровать encrypted2.txt, нам понадобятся все ключи:
$ xorf encrypted2.txt key1 key2 key3 > decrypted.txt

# Теперь text.txt и decrypted.txt - одинаковые файлы:
$ cmp text.txt decrypted.txt

Ключом может выступать абсолютно любой файл, хоть /dev/urandom, хоть фильм в формате mkv.

Если кому-то ВНЕЗАПНО эта шняга понадобится, держите.


Ответ на: комментарий от imul

Кстати, если Stable поменять на Nightly, опять становится побайтовым loop. Вот это уже забавно, тоже надо будет глянуть

vertexua ★★★★★
()
Ответ на: комментарий от imul

Не успел отредактировать.
Неплохо разложило на 128 (судя по инкрементам на 16) бит. Надо будет завтра глянуть как в гошном коде у тс соптимизировало. А почему не на 256? Регистры xmmX вроде до 256 расширяются.

imul ★★★★★
()
Ответ на: комментарий от imul

Разве что у них на сервере. А то господа бывает продакшн код через nightly собирают. Сейчас уже менее актуально, но все же

vertexua ★★★★★
()
Ответ на: комментарий от imul

кратно записи файловой системы. Современные системы вроде 8 КБайт пишут. Ранее было принято 4 КБайта. Кратно 8КБ не ошибёшься :)

HIS
()

Осиль ман openssl и не занимайся фигнёй.

WitcherGeralt ★★
()
Ответ на: комментарий от vertexua

fn xor_iter(a:&[u8], b:&[u8]) -> Vec<u8> {

Как на этом можно писать? Что за закорючки непонятные? На тебе вот нормальный, понятный код:

template <class T, class = typename std::enable_if<std::is_integral<typename T::value_type>::value>::type> auto xor_iter1(const T& a, const T& b) {
    return ranges::views::zip(a,b) | ranges::views::for_each([](std::pair<typename T::value_type, typename T::value_type> p) { return ranges::yield(p.second ^ p.first); });
}
Если выставить оптимизацию (O1 и больше) то оно даже не генерит код функции, сразу все считает.

Deleted
()
Ответ на: комментарий от vertexua

А мне так удобнее было парсить. Конкретно для этой задачи.

egorcod
() автор топика
Ответ на: комментарий от egorcod

А при чём тут rm?

hint: Можно, например, открыть оба файла, узнать размеры файлов, создать два буфера с размером большего файла, буфер файла меньшего размера заполнить нулями, прочитать файлы в буферы, а потом уже ксорить буферы равного размера один с другим.

saahriktu ★★★★★
()
Ответ на: комментарий от imul

Это фича не языка, а компилятора. Если бакенд тот же (гцц, шлнг), то на го он сделает ровно тем же образом, а на Го есть бакенд под гцц. Разумеется, это также значит, что и на Сях будет ровно так же соптимизировано.

vertexua

Причём тут вообще «современный язык»?

next_time ★★★★★
()
Последнее исправление: next_time (всего исправлений: 1)
Ответ на: комментарий от saahriktu

При том, что вы запускаете программу, в мануале которой четко написано, что она может обрезать данные, и жалуетесь на это. В мануале рм четко написано, что она удаляет данные, но вы получается все равно должны жаловаться на то, что она это делает.

egorcod
() автор топика
Ответ на: комментарий от egorcod

Я бы в случае когда данные больше ключа - делал чтобы программа падала с ошибкой. И добавил бы ключ «-f,–force» чтобы выбрасывать часть

vertexua ★★★★★
()
Ответ на: комментарий от saahriktu

создать два буфера с размером большего файла

Отличная идея для шифрования файлов в 50 гигов на компе с 8-мю гигами.

HIS
()
Ответ на: комментарий от imul

где-то употреблял «современный язык»?

Вертексуа: «Го - современный язык, там такой фигней уже не заморачиваются.» Я это ему, а не вам написал, алё.

Привет копетан.
Неплохо разложило на 256 бит. Надо будет завтра глянуть как в гошном коде у тс соптимизировало.

слышь, матрос, зачем собрался смотреть, как у ТС соптимизировано, если заранее понимаешь, что у него будет в точности такой же листинг?

next_time ★★★★★
()
Ответ на: комментарий от next_time

Да что вы прицепились. Я в основном имел ввиду что это старый способ мышления - байтики дрочить с плеча, компиляторы сейчас хорошо работают с поэлементными логическими и математическими операциями по больших массивах

И от го, и от раста, и от последних компиляторов плюсов и си можно такое ожидать. Я ещё до того как увидел листинг ассемблера знал что там скорее всего будет

Когда пишу код и хочу увидеть там sse, то пишу адекватный код, иногда смотрю выхлоп ассемблера чтобы проверить, не наоборот - стразу строчить оптимизацию руками. С другой стороны да, так можно словить регрессию

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 2)

Напомнило как давно в интернете, какой-то школьник предлагал скачать или даже купить его программы на delphi для решения квадратных уравнений.

Rupricht ★★
()
Ответ на: комментарий от TheAnonymous

Я имею в виду то, что для этого абсолютно стойкого шифрования нужно иметь ключ не меньше данных и желательно всегда разный

egorcod
() автор топика
Ответ на: комментарий от egorcod

Ну да.
Я про ненужность в принципе. Хотя хз, используется ли где «одноразовый блокнот» в реальных боевых условиях

TheAnonymous ★★★★★
()
Ответ на: комментарий от TheAnonymous

Шифровать центральные процессоры и прочие не совсем законные данные, возможно

egorcod
() автор топика
Ответ на: комментарий от reprimand

Разница в том, что этот тред специально для обсуждения - как конкретно делаются именно такого рода шифрования в деталях.

Кому не интересно - мимокрокодил к уже сделанным м оттестированным тулзам общего назначения.

HIS
()
Ответ на: комментарий от saahriktu

тоесть нужно для каждого размера файла сделать разные тулзы с разными подходами при обработке, вместо того чтобы сразу сделать правильно одну тулзу на все варианты.

HIS
()
Ответ на: комментарий от Deleted

Если выставить оптимизацию (O1 и больше) то оно даже не генерит код функции, сразу все считает.

Я inline(never) ради спорта поставил в код

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Чтобы увидеть htop, словить инфаркт и кричать что хром выжрал всю память?

Виртуальную память, Карл!

Если за mmap()леными страницами памяти стоит файл, ядро без проблем и в автоматическом режиме будет выгружать неиспользуемые страницы из физической памяти в процессе последовательного чтения.

Можно даже прямо указать что ты будешь читать последовательно с помощью madvise().

reprimand ★★★★★
()
Ответ на: комментарий от reprimand

Зачем нужно форсировать свопирование , если можно обойтись вовсе без него.

Зачем излишне нагружать память, процессор и винчестер - если можно обойтись минимальными потерями времени, памяти, места на винте и энергии, если подумать и сделать всё правильно?

HIS
()
Ответ на: комментарий от reprimand

Он сначала их заполнит 100% и потом начнет выгружать. И у всего софта, который проверяет доступную память таки будет ахтунг

vertexua ★★★★★
()

Заглянул одним глазом в сырцы. Какой ужасный гомнокод!

Не делай так больше, пожалуйста. И твоя «крипта» ломается скорее всего на раз-два.

beastie ★★★★★
()
Ответ на: комментарий от vertexua

Меня уже убил разбор ключей (закат солнца в ручную) вместо flag.

Дальше даже смотреть не стал. Ибо одна большая простыня и 146% ключ там ре-используется.

beastie ★★★★★
()
Ответ на: комментарий от beastie

Есть такая штука в теории шифрования:

Если не известен тип информации пароль (хешкод) - то расшифровать практически невозможно.

Это касается «почти» и 1 байтного ксор шифрования.

А если оно будет 8 байтным... :)

HIS
()
Ответ на: комментарий от beastie

Я не про ассиметричное шифрование.

Я про тупой ксор набором нескольких байт.

HIS
()
Ответ на: комментарий от beastie

Если без шуток, то в треде таки обсуждается симметричное шифрование, оно в корне отличается от всяких ssl…

Оно в принципе даже более надёжное, если не «палить» свой пароль. Файлы зашифрованные симметричным методом предполагают только личное использование без передачи третьим лицам вместе с паролем.

HIS
()
Ответ на: комментарий от egorcod

Можно.

package main

import (
	"flag"
	"fmt"
)

type multi []string

func (m *multi) String() string     { return fmt.Sprint(*m) }
func (m *multi) Set(s string) error { *m = append(*m, s); return nil }

func main() {
	var m multi
	flag.Var(&m, "m", "multiple arg")
	flag.Parse()
	fmt.Println(m)
}

И пример:

go run main.go -m a -m b
[a b]
beastie ★★★★★
()
Ответ на: комментарий от beastie

Если я запускаю программу как

./xorf -k key file

То flag парсит это как

keys: [key]
files: [file]

Но если я запускаю программу как

./xorf file -k key

То flag парсит это как

keys: []
files: [file -k key]
egorcod
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.