Показаны сообщения с ярлыком Шифрование. Показать все сообщения
Показаны сообщения с ярлыком Шифрование. Показать все сообщения

вторник, 3 июля 2012 г.

Реализация алгоритма шифрования RSA

Сегодня мы рассмотрим алгоритм шифрования RSA (буквенная аббревиатура от фамилий Rivest, Shamir и Adleman).  Данный алгоритм обладает высокой криптостойкостью, а так же очень прост в реализации.
В основу криптографической системы с открытым ключом RSA положена сложность задачи факторизации произведения двух больших простых чисел. Для шифрования используется операция возведения в степень по модулю большого числа. Для дешифрования за разумное время (обратной операции) необходимо уметь вычислять функцию Эйлера от данного большого числа, для чего необходимо знать разложения числа на простые множители.
Взлом данного алгоритма займёт много времени и потребует больших вычислительных мощностей. Рассмотрим пример. Был объявлен конкурс на расшифровку строки, зашифрованной данным алгоритмом. Строка была расшифрована за 6 месяцев с применением 1600 компьютеров. Очень впечатляющие результаты надёжности алгоритма. Конечно, когда наконец-то разработают хорошие квантовые компьютеры, то подобные алгоритмы будут взламываться очень быстро, но пока мы можем спокойно использовать RSA.
Алгоритм RSA является алгоритмом ассиметричного шифрования. Любое ассиметричное шифрование предполагает наличие пары ключей, а именно открытого и закрытого. С помощью открытого ключа мы кодируем строку, с помощью закрытого производим декодирование.
Теперь рассмотрим как создаются данные ключи:
1.      Сначала мы выбираем два простых числа p и q.
2.      Затем вычисляем произведение p и q, которое называется модулем. N = p*q.
3.      Вычисляется значение функции Эйлера от числа n: 
4.      Выбирается целое число , взаимно простое со значением функции и .
5.      Выбирается число d удовлетворяющее условию e*d mod f(p,q)=1
Получаем {e,n} – открытый ключ шифрования, {d, n} – закрытый.
Рассмотрим пример реализации алгоритма на python.
Сначала определим начальные данные:
p = 3557

q = 2579

N = p*q

f = (p-1)*(q-1)

d = 6111579

e = 3
Теперь перейдём к шифрованию и дешифровке. Формула шифрования выглядит следующим образом:
y = x^e mod n, где х – цифровой код символа.
Для дешифровки применим другую формулу:
х = y^d mod n.
Для каждого символа будем брать его код из таблицы юникодов. Как это сделать, можно прочитать в моей статье.
Напишем функцию шифрования:
def encode_RSA(word,e,N):

    ret = []

    for v in word:

        n = ord(v)

        ret.append(int(n**e%N))
И функцию декодирования:
def decode_RSA(word,d,N):

    ret = []

    for v in word:

        sim = v**d%N

        ret.append(unichr(sim))

    return ret
Применяется это так:
l = encode_RSA(u'cat',e,n)

print l

print decode_RSA(l ,d,n)
Результат:
[970299, 912673, 1560896]

 [u'c', u'a', u't']
В данной статье мы рассмотрели алгоритм шифрования RSA. На данный момент он обладает высокой криптоскойстью и, если вы будете обновлять ключи хотя бы раз в месяц, то можете не волноваться, что его взломают. Не стоит шифровать этим алгоритмом большие тексты, потому что время шифрования велико (особенно на python). Надеюсь, материалы этой статьи будут вам полезны.
Оригинал статьи читаем тут, а так же другие интересные и полезные статьи на моём блоге

пятница, 29 июня 2012 г.

Веб-сервисы в Django

Сегодня речь пойдёт о веб-сервисах на django. Для начала определим сам термин. Веб-cервис (англ. web service) — идентифицируемая веб-адресом программная система со стандартизированными интерфейсами. Веб-службы могут взаимодействовать друг с другом и со сторонними приложениями посредством сообщений, основанных на определённых протоколах (XML, JSON и т. д.). Веб-служба является единицей модульности при использовании сервис-ориентированной архитектуры приложения. (Данное определение взято свикипедии)
Прежде чем говорить об использовании сервисов, рассмотрим некоторые из преимуществ их использования:
  • Если ваш сервис был выложен в сети, другие приложения смогут использовать его возможности:
  • Веб-сервисы позволяют взаимодействовать приложениям, созданным на различных платформах и технологиях (например, сервис на c# может спокойно взаимодействовать с сервисом на java):
  • Веб-сервисы используют стандартизированные протоколы для общения. Все 4 слоя (сервис транспортировки, сообщения XML, описание сервисов и уровни обнаружения сервисов) используют один определённый протокол из тех, что используют веб-сервисы. Эта стандартизация протоколов по группам даёт бизнесу множество преимуществ, таких как широта выбора, уменьшение стоимости вследствие конкуренции и увеличение качества.
Это далеко не все преимущества данного подхода, однако и этой информации достаточно чтобы понять актуальность данной темы и хотя бы в общих чертах рассмотреть, как реализуются веб-сервисы.
В этой статье я рассмотрю два подхода к созданию сервисов: rest и xml-rpc. Это связано с простотой использования данных подходов в django, и лучше всего подойдёт для начинающих. В данной статье не будет подробно описаны все тонкости использования rest и xml-rpc, это всё есть в документации, мы только рассмотрим небольшие примеры использования.
Начнём с rest. REST (сокр. англ. Representational State Transfer, «передача состояния представления») — подход к архитектуре сетевых протоколов, обеспечивающих доступ к информационным ресурсам. В REST-сервисах акцент сделан на доступ к ресурсам, а не на исполнение удаленных сервисов. Например, вместо того чтобы запрашивать удаленное исполнение функции для нахождения нужного вам формуляра заказа, вы просто запрашиваете этот формуляр, примерно так же, как статичную Web-страницу.
На мой взгляд, наиболее простым и удобным инструментом для работы с rest в django является django-piston. Так же вы можете посмотреть в сторону Django Tastypie и Django REST framework.
Устанавливаем piston как описано в документации. 
В INSTALLED_APPS добавляем 'piston'.
В корне проекта создадим директорию api (обязательно создаём файл init.py). В этой же директории создадим файл handlers.py, в котором описываются интерфейсы работы с ресурсом, т.е. все манипуляции (CRUD) с нашей моделью.
Для примера в model создадим класс Book, с которым будем работать:
class Book(models.Model):
    title = models.CharField(, max_length=120)
    slug = models.CharField(max_length=50)
    description = models.TextField()

    def __unicode__(self):
        return self.title
Чтобы было проще тестировать забейте несколько книг в базу.
Теперь вернёмся к нашему файлу handlers.py. 
from piston.handler import BaseHandler
from app.models import Book
class BookHandler(BaseHandler):
    model = Book
    fields = ('id', 'title',)
В директории api создадим еще один файл - urls.py.
from django.conf.urls.defaults import *
from piston.resource import Resource
from api.handlers import FilmHandler

film_resource = Resource(FilmHandler)
urlpatterns = patterns('',
   url(r'^book/(?P\d+)/$', film_resource),
   url(r'^book/$', film_resource),
)
В urls.py проекта добавим ссылку на urls.py из api:
urlpatterns = patterns('',
   ...
   (r'^api/', include('api.urls')),
)
Теперь мы можем получить книги в формате json по адресуhttp://127.0.0.1:8000/api/books/:
[
    {
        "id": 1,
        "title": "Math"
    }, 
    {
        "id": 2,
        "title": "Math1"
    }
]
Так же piston берёт на себя всю работу по удалению, обновлению и добавлению данных, а так же многое другое. Подробнее об этом читайте в документации.
Теперь поговорим об xml-rpc. XML-RPC (сокр. от англ. Extensible Markup Language Remote Procedure Call — XML-вызов удалённых процедур) — стандарт/протокол вызова удалённых процедур, использующий XML для кодирования своих сообщений и HTTP в качестве транспортного механизма. Является прародителем SOAP, отличается исключительной простотой применения. XML-RPC, как и любой другой интерфейс RPC, определяет набор стандартных типов данных и команд, которые программист может использовать для доступа к функциональности другой программы, находящейся на другом компьютере в сети.
Для работы с этим протоколом в django ставим django-xmlrpc и добавляем в  INSTALLED_APPS ' django_xmlrpc'.
Для проверки работоспособности во views.py добавим функцию:
def multiply(a, b):
    return a*b
В settings.py:
XMLRPC_METHODS = (('app.views.multiply', 'mult'), )
В urls.py:
url(r'^xmlrpc/$', 'django_xmlrpc.views.handle_xmlrpc', name='xmlrpc'),
Теперь осталось написать клиента, который будет вызывать данную функцию и получать результаты её работы.
Клиент может выглядеть так:
import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://localhost:8000/xmlrpc/")
rez = proxy.postsMet(2,5)
print rez
>>> 
10
>>>
На этом мы закончим рассмотрение способов создания сервисов на django. Надеюсь, это статья будет вам полезной.
Оригинал статьи читаем тут, а так же другие интересные и полезные статьи на моём блоге.

среда, 13 июня 2012 г.

C# MD5 Генерируем хэш

C# - язык программирования довольно таки мощный и развитый, но если сравнить с Php, то си шарп не имеет всех полных удобств.

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

Вот функция, которая генерирует MD5 хэш:

public string CalculateMD5Hash(string input)
        {
            
            MD5 md5 = System.Security.Cryptography.MD5.Create();
            byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
            byte[] hash = md5.ComputeHash(inputBytes);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hash.Length; i++)
            {
                sb.Append(hash[i].ToString("X2"));
            }
            return sb.ToString();
        }


Для работы необходимо сделать импорт библиотеки:

using System.Security.Cryptography;

В использовании функция очень проста:

private void button1_Click(object sender, EventArgs e)
        {
            string md5_hash = CalculateMD5Hash(textBox1.Text);
            textBox2.Text = md5_hash;
        }


TROCKII БЛОГ Copyright © 2012 | Template created by Lev Trockii |