Could be useful for someone: http://dl.dropbox.com/u/28149200/site/PyKCS11.7z
Just extract it into Lib directory of Python 2.7
Could be useful for someone: http://dl.dropbox.com/u/28149200/site/PyKCS11.7z
Just extract it into Lib directory of Python 2.7
When using both PyKCS11 module and M2Crypto it may happen that user already logged in after using engine.
Engine.load_dynamic()
e = Engine.Engine('dynamic')
e.ctrl_cmd_string('SO_PATH', PKCS11_ENGINE_PATH)
#e.ctrl_cmd_string('ID', 'aladdin')
e.ctrl_cmd_string('LIST_ADD', '1')
e.ctrl_cmd_string('LOAD', None)
e.ctrl_cmd_string('MODULE_PATH', PKCS11_LIBRARY_PATH)
a = Engine.Engine('pkcs11')
a.init()
# Hex-encoded key id should be provided to that function
k = a.load_private_key(hexlify(keyid), pin=user_pin)
req = X509.Request()
# .... some work
a.finish()
e.finish()
return reqpem
I tried to resolve it these ways:
Code above gave me segfault. It was due to python’s garbage collector tried to free key that is not in use. So i tried to insert del k before a.finish()
That gave me again the same problem (already logged in). Finally i found solution: I removed a.finish(), e.finish(), del k code parts and just made a call of Engine.cleanup() function.
That’s it.
It’s not written in documentation the way how to generate key pair on security device. Session class has generateKeyPair() function that has 2 arguments — templatePub and templatePriv. Template is simply a sequence of key-value pairs.
Let’s make a higher level wrapper for easier key generation:
import PyKCS11
KEY_LEN = 1024
EXPONENT = (1,0,1)
SLOT = 0
def generate_keypair(self, session, length, exponent):
tPub = ( # Public key template
(PyKCS11.LowLevel.CKA_CLASS, PyKCS11.LowLevel.CKO_PUBLIC_KEY),
(PyKCS11.LowLevel.CKA_TOKEN, True),
(PyKCS11.LowLevel.CKA_ENCRYPT, True),
(PyKCS11.LowLevel.CKA_VERIFY, True),
(PyKCS11.LowLevel.CKA_WRAP, True),
(PyKCS11.LowLevel.CKA_MODULUS_BITS, length),
(PyKCS11.LowLevel.CKA_PUBLIC_EXPONENT, exponent))
tPriv = ( # Private key template
(PyKCS11.LowLevel.CKA_CLASS, PyKCS11.LowLevel.CKO_PRIVATE_KEY),
(PyKCS11.LowLevel.CKA_TOKEN, True),
(PyKCS11.LowLevel.CKA_PRIVATE, True),
(PyKCS11.LowLevel.CKA_SENSITIVE, True),
(PyKCS11.LowLevel.CKA_DECRYPT, True),
(PyKCS11.LowLevel.CKA_SIGN, True),
(PyKCS11.LowLevel.CKA_UNWRAP, True))
session.generateKeyPair(tPub, tPriv)
lib = PyKCS11.PyKCS11Lib()
lib.load('/usr/lib/libeTPkcs11.so')
s = lib.openSession(SLOT, PyKCS11.CKF_RW_SESSION) # !!! We need read/write session to generate key pair
s.login() # user privileges are enough
generate_key_pair(s, KEY_LEN, EXPONENT)
s.closeSession()
Hope this will be helpful ;)
Some parts of M2Crypto are not working properly. I tried to write Heikki Toivonen (developer and maintainer of M2Crypto) but didn’t get answer from him. At the same time M2Crypto is a very nice project so i believe that it needs better documentation. So recently I’m going to send emails to people who did forks of M2Crypto packages on GitHub and other development sites to make main fork of M2Crypto.
Недавно переделывал одну программку, наткнулся на такой вот кусок кода.
function Temission_form.ConvertTimeCNT(s: string): string;
var
i: integer;
begin
for i:=0 to Length(s) do
begin
if s[i] = ':' then
begin
delete(s, i, 1);
if i = 2 then
s:='0'+s;
end;
end;
delete(s, 5, 2);
Result:=s;
end;
Суть заключается в том, что таким способом удаляются двоеточия из представления времени и добавляется ноль в начало, если значение часов состоит из одной цифры!
2001 год, общежитие Туркестанского КТЛ, 11 класс. Здание лицея состояло из трёх двухэтажных корпусов, два этажа первого состояли полностью из общежития, во втором на первом этаже была столовая, кабинет директора, зама, приёмная, буфет и учебные классы. Наше общежитие располагалось в третьем корпусе, на первом этаже которого располагались также учебные классы и лаборатории. На втором этаже жили мы с «ашниками» и была столовая где трапезничали воспитатели и учителя (большинство последних, впрочем, снимали квартиры). Ученики туда не заходили, но как-то раз там побывать довелось. У «ашников» был воспитатель по имени Cengiz Ayten (Дженгиз Айтен, при этом «дж» читается как звонкое «ч», а «е» после «т» твёрже, чем в русском). Столовая состояла из кухни, где готовила еду женщина лет эдак пятидесяти по имени Гульжан, ну и помещения, где воспитатели принимали пищу. Я обратил внимание на небольшую картонную коробочку с небольшой прорезью в крышке и спросил:
- Для чего эта коробочка?
На что Дженгиз-аби (у турок так принято называть старших по возрасту, с турецкого «аби» переводится как «старший брат»):
- Туда мы складываем талоны на еду. Не все питаются по три раза в день, некоторые — по два, если не успевают, поэтому, мы покупаем талоны, и кладём в эту коробочку.
- Так оттуда же можно вытащить талон и снова им воспользоваться.
- Ну, не все так просто: есть же полиция.
- Какая полиция? Здесь нет никакой полиции, да и никто не вызовет её.
- Нет, — улыбнулся Дженгиз-аби, — я говорю о полиции внутри человека.
Золотые слова. Побольше бы таких людей.
Python вызывает умиление, когда я вижу длинные куски кода, написанные на других языках. Итак, файл, указанный в топике используется в 1C версии 7 для хранения настроек подключения к серверу базы данных. Файл не шифруется, а всего лишь выполняется операция XOR над строкой подключения и строкой-ключом. Соответственно, для расшифровки применяется повторная операция XOR с той же строкой-ключом. Строка эта известная: «19465912879oiuxc ensdfaiuo3i73798kjl».
Вот скрипт для Python 3, выполняющий декодирование строки подключения:
from itertools import cycle
key = b"19465912879oiuxc ensdfaiuo3i73798kjl"
d = open('1Cv7.DBA', 'rb').read()
r = bytes([a^b for a, b in zip(d, cycle(key))])
print(r)
В модуле itertools есть генератор cycle, который выдает по одному значению из последовательности, а когда она заканчивается — начинает выдавать их сначала. Благодаря этому можно наложить нужное количество раз ключ на зашифрованный текст, после чего, выполняя операцию XOR над очередными символами ключа и зашифрованного текста получаем строку подключения, где можно найти забытый нами пароль. Python лаконичен, не правда ли?
На днях был свидетелем того, как одна моя приятельница играет в игру «Тайны старого замка». В игре встречается такая головоломка:
Круг с четырьмя отверстиями, в каждом отверстии отображена одна из букв N, S, W, E. Имеются две ручки управления кругом: первая вращает круг по часовой стрелке, вторая переключает все буквы круга кроме первой по следующей системе N — E — S — W — N — E — … В результате, при помощи манипуляций необходимо выстроить их как в компасе — сверху N, снизу S, слева W, справа E.
Зловредное ПО, распространяющееся через съёмные диски порой любит скрывать папки и файлы, вставляя одноимённые ярлыки или копии себя. После очистки съёмного диска эти подставные удаляются, а файлы остаются скрытыми. Притом, средствами проводника снять атрибут «скрытый» нельзя, ибо флажок неактивен. Для их снятия можно воспользоваться какими-нибудь файловыми менеджерами вроде Far Manager или Total Commander. Если же под рукой этого нет, то можно сделать так:
1) Открываем блокнот
2) Пишем туда одну строчкy:
attrib -h -s /s /d
3) Сохраняем файл с расширением bat
4) Копируем его на флешку
5) Запускаем с флешки
Сей способ я придумал, для одного очень неопытного пользователя. Оставил у него на рабочем столе, и рекомендовал употреблять в вышеописанных случаях.
Работая с git рано или поздно происходит такая ситуация, когда во время работы над одной задачей, требуется сделать какое-то срочное изменение в коде. Правильнее, пожалуй, создавать отдельную ветку, но что делать, если ветку мы не создали? В этом случае нам на помощь приходит команда git stash. Она позволяет спрятать неприменённые изменения в stash-очередь, и затем, когда надо — достать их обратно. Порядок действий такой: