Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
165 changes: 165 additions & 0 deletions SHA1_README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
# SHA1 Хеширование в Python

Этот проект содержит примеры и утилиты для вычисления SHA1 хеша из строк в Python.

## Файлы проекта

- `sha1_hash.py` - Основной скрипт для вычисления SHA1 хеша
- `sha1_examples.py` - Примеры различных способов использования SHA1
- `sha1_utils.py` - Утилиты для работы с SHA1 хешированием

## Быстрый старт

### Простое вычисление SHA1 хеша

```python
import hashlib

text = "Привет, мир!"
sha1_hash = hashlib.sha1(text.encode('utf-8')).hexdigest()
print(sha1_hash) # 0cb95b7891ff182f0972be8754ec934df65af21c
```

### Использование готового скрипта

```bash
# Вычисление хеша строки, переданной как аргумент
python3 sha1_hash.py "Привет, мир!"

# Интерактивный режим
python3 sha1_hash.py
```

### Использование утилит

```python
from sha1_utils import sha1_hash, sha1_verify, sha1_file

# Простое хеширование
hash_result = sha1_hash("Тестовая строка")

# Проверка хеша
is_valid = sha1_verify("Тестовая строка", hash_result)

# Хеширование файла
file_hash = sha1_file("/path/to/file.txt")
```

## Основные функции

### `sha1_hash(text, encoding='utf-8')`
Вычисляет SHA1 хеш для заданного текста.

**Параметры:**
- `text` - строка или байты для хеширования
- `encoding` - кодировка для строки (по умолчанию UTF-8)

**Возвращает:** SHA1 хеш в шестнадцатеричном формате

### `sha1_file(file_path, chunk_size=8192)`
Вычисляет SHA1 хеш файла.

**Параметры:**
- `file_path` - путь к файлу
- `chunk_size` - размер блока для чтения файла

**Возвращает:** SHA1 хеш файла в шестнадцатеричном формате

### `sha1_verify(text, expected_hash, encoding='utf-8')`
Проверяет, соответствует ли хеш текста ожидаемому хешу.

**Параметры:**
- `text` - строка или байты для проверки
- `expected_hash` - ожидаемый SHA1 хеш
- `encoding` - кодировка для строки

**Возвращает:** True, если хеши совпадают, False в противном случае

### `sha1_incremental()`
Создает объект для инкрементального хеширования.

**Возвращает:** Объект SHA1 для инкрементального обновления

## Примеры использования

### Базовое хеширование

```python
import hashlib

# Простое хеширование
text = "Hello, World!"
hash_result = hashlib.sha1(text.encode('utf-8')).hexdigest()
print(hash_result)
```

### Хеширование с разными кодировками

```python
text = "Привет, мир!"

# UTF-8 (рекомендуется)
utf8_hash = hashlib.sha1(text.encode('utf-8')).hexdigest()

# Windows-1251
cp1251_hash = hashlib.sha1(text.encode('cp1251')).hexdigest()
```

### Инкрементальное хеширование

```python
import hashlib

# Создаем объект хеша
sha1_hash = hashlib.sha1()

# Добавляем данные по частям
sha1_hash.update("Первая часть".encode('utf-8'))
sha1_hash.update("Вторая часть".encode('utf-8'))

# Получаем финальный хеш
final_hash = sha1_hash.hexdigest()
```

### Хеширование файла

```python
import hashlib

def hash_file(file_path):
sha1_hash = hashlib.sha1()
with open(file_path, 'rb') as f:
for chunk in iter(lambda: f.read(4096), b""):
sha1_hash.update(chunk)
return sha1_hash.hexdigest()

file_hash = hash_file("example.txt")
```

## Запуск примеров

```bash
# Запуск основного скрипта
python3 sha1_hash.py "Ваша строка"

# Запуск примеров
python3 sha1_examples.py

# Запуск утилит
python3 sha1_utils.py
```

## Важные замечания

1. **Кодировка**: Всегда указывайте кодировку при работе с текстом. По умолчанию используется UTF-8.

2. **Безопасность**: SHA1 считается криптографически небезопасным для новых приложений. Используйте SHA-256 или SHA-3 для критически важных приложений.

3. **Производительность**: Для больших файлов используйте инкрементальное хеширование с блоками.

4. **Совместимость**: Результаты хеширования одинаковы на всех платформах при использовании одинаковой кодировки.

## Требования

- Python 3.6+
- Стандартная библиотека Python (модуль `hashlib`)
113 changes: 113 additions & 0 deletions sha1_examples.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Примеры использования SHA1 хеширования в Python
"""

import hashlib


def example_basic_usage():
"""Базовый пример использования SHA1"""
print("=== Базовый пример ===")

text = "Привет, мир!"
sha1_hash = hashlib.sha1(text.encode('utf-8')).hexdigest()

print(f"Строка: {text}")
print(f"SHA1: {sha1_hash}")
print()


def example_different_encodings():
"""Пример с разными кодировками"""
print("=== Разные кодировки ===")

text = "Hello, World!"

# UTF-8 (по умолчанию)
sha1_utf8 = hashlib.sha1(text.encode('utf-8')).hexdigest()

# ASCII
sha1_ascii = hashlib.sha1(text.encode('ascii')).hexdigest()

# Latin-1
sha1_latin1 = hashlib.sha1(text.encode('latin-1')).hexdigest()

print(f"Строка: {text}")
print(f"UTF-8: {sha1_utf8}")
print(f"ASCII: {sha1_ascii}")
print(f"Latin-1: {sha1_latin1}")
print()


def example_file_hashing():
"""Пример хеширования файла"""
print("=== Хеширование файла ===")

# Создаем временный файл для демонстрации
test_content = "Это содержимое тестового файла\nдля демонстрации хеширования"

with open('/tmp/test_file.txt', 'w', encoding='utf-8') as f:
f.write(test_content)

# Читаем файл и вычисляем хеш
with open('/tmp/test_file.txt', 'rb') as f:
file_content = f.read()
sha1_hash = hashlib.sha1(file_content).hexdigest()

print(f"Содержимое файла: {test_content}")
print(f"SHA1 файла: {sha1_hash}")
print()


def example_incremental_hashing():
"""Пример инкрементального хеширования"""
print("=== Инкрементальное хеширование ===")

# Создаем объект хеша
sha1_hash = hashlib.sha1()

# Добавляем данные по частям
parts = ["Первая часть", "Вторая часть", "Третья часть"]

for part in parts:
sha1_hash.update(part.encode('utf-8'))
print(f"Добавлена часть: '{part}'")

final_hash = sha1_hash.hexdigest()
print(f"Финальный SHA1: {final_hash}")

# Для сравнения - хеш всей строки сразу
full_text = "".join(parts)
direct_hash = hashlib.sha1(full_text.encode('utf-8')).hexdigest()
print(f"Прямой хеш: {direct_hash}")
print(f"Хеши совпадают: {final_hash == direct_hash}")
print()


def example_common_strings():
"""Пример с часто используемыми строками"""
print("=== Часто используемые строки ===")

test_strings = [
"",
"a",
"abc",
"message digest",
"abcdefghijklmnopqrstuvwxyz",
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
"12345678901234567890123456789012345678901234567890123456789012345678901234567890"
]

for text in test_strings:
sha1_hash = hashlib.sha1(text.encode('utf-8')).hexdigest()
print(f"'{text}' -> {sha1_hash}")


if __name__ == "__main__":
example_basic_usage()
example_different_encodings()
example_file_hashing()
example_incremental_hashing()
example_common_strings()
49 changes: 49 additions & 0 deletions sha1_hash.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Скрипт для вычисления SHA1 хеша из строки
"""

import hashlib
import sys


def calculate_sha1(text):
"""
Вычисляет SHA1 хеш для заданной строки

Args:
text (str): Входная строка для хеширования

Returns:
str: SHA1 хеш в шестнадцатеричном формате
"""
# Создаем объект хеша SHA1
sha1_hash = hashlib.sha1()

# Кодируем строку в байты (UTF-8) и обновляем хеш
sha1_hash.update(text.encode('utf-8'))

# Возвращаем хеш в шестнадцатеричном формате
return sha1_hash.hexdigest()


def main():
"""Основная функция"""
if len(sys.argv) > 1:
# Если строка передана как аргумент командной строки
input_text = ' '.join(sys.argv[1:])
else:
# Запрашиваем строку у пользователя
input_text = input("Введите строку для вычисления SHA1 хеша: ")

# Вычисляем хеш
hash_result = calculate_sha1(input_text)

# Выводим результат
print(f"Исходная строка: {input_text}")
print(f"SHA1 хеш: {hash_result}")


if __name__ == "__main__":
main()
Loading