Форум сайта python.su
Здравствуйте. Вот пытаюсь переписать функцию шифрования строки с С++ Qt, на Python + Qt.
Функция оригинал:
QString stringEncrypt(QString strInput, QString strPassword)
{
int i,j;
QString strOutput="";
// Перевод строк в битовые массивы с использованием локальных таблиц
QByteArray baInput = strInput.toLocal8Bit();
QByteArray baPassword = strPassword.toLocal8Bit();
// Кодирование информации
for (i=0; i < baInput.size(); i++)
{
for (j=0; j < baPassword.size(); j++)
{
// XOR - кодировка символа
baInput[i] = baInput[i] ^ (baPassword[j] + (i*j));
}
//Преобразование числа в шестнадцатеричную систему
strOutput += QString("%1").arg((int)((unsigned char)baInput[i]),2,16,QChar('0'));
}
//Возврат кодированной строки
return strOutput;
}
# -*- coding: utf-8 -*-
from PyQt4 import QtCore
# Кодирование строки
def stringEncrypt(strInput, strPassword):
strOutput = QtCore.QString('')
# Перевод строк в битовые массивы с использованием локальных таблиц
baInput = QtCore.QByteArray(QtCore.QString(strInput).toLocal8Bit())
baPassword = QtCore.QByteArray(QtCore.QString(strPassword).toLocal8Bit())
# Кодирование информации
for i in range(baInput.size()):
for j in range(baPassword.size()):
# XOR - кодировка символа
baInput[i] = baInput[i] ^ (baPassword[j] + (i*j))
#Преобразование числа в шестнадцатеричную систему
strOutput += QString("%1").arg(int(chr(baInput[i])),2,16,QChar('0'))
# Возврат кодированной строки
return strOutput
Отредактировано (Апрель 7, 2010 11:32:35)
Офлайн
Ну вобщем что-то такое у меня получилось:
for i in range(baInput.size()):
baInputbuf = ord(baInput[i])
for j in range(baPassword.size()):
# XOR - кодировка символа
baInputbuf = baInputbuf ^ (ord(baPassword[j]) + (i*j))
#Преобразование числа в шестнадцатеричную систему
strOutput += QtCore.QString("%1").arg(baInputbuf,2,16,QtCore.QChar('0'))
Офлайн
Спасибо. Сейчас буду экспериментировать. Там еще и декодирование, но с ним пока не заморачивался, застрял на шифровании.
Офлайн
символы в число и обратно конвертнуть можно с пом. ord и chr
Офлайн
Было желание замутить все это на Qt с помощью QString - QByteArray, но так ничего и не получилось. Более того, по моему и исходный вариант на C++ то же не рабочий. У себя проверить не могу, но посмотрев документацию по Qt на QByteArray, получается, что он не поддерживает присваивание в том виде, в каком оно реализовано в исходной функции. Так что пока пользуюсь вот этим:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PyQt4 import QtCore
def xor(pw, str1):
c = 0
liste = []
for k in xrange(len(str1)):
if c > len(pw)-1:
c = 0
fi = ord(pw[c])
c += 1
se = ord(str1[k])
fin = fi ^ se
liste += [chr(fin)]
return liste
def encrypt(passw, string):
ret = xor(passw, string)
print "Ecnrypted form:",
for k in ret:
print ord(k)
def decrypt(passw, ret):
listing = []
for num in map(int, ret.split(' ')):
listing += [chr(int(num))]
finale = xor(passw, listing)
print "Decrypted form:",
print "".join(finale)
Отредактировано (Апрель 8, 2010 11:49:18)
Офлайн
Поторопился я с предыдущим постом, все работает (спасибо dartNNN). Для меня было важно, что бы принимал кирилицу. Вот код:
# Кодирование строки
def stringEncrypt(strInput, strPassword):
strOutput = QtCore.QString('')
# Перевод строк в битовые массивы с использованием локальных таблиц
baInput = QtCore.QByteArray(QtCore.QString(strInput).toLocal8Bit())
baPassword = QtCore.QByteArray(QtCore.QString(strPassword).toLocal8Bit())
# Кодирование информации
for i in range(baInput.size()):
baInputbuf = ord(baInput[i])
for j in range(baPassword.size()):
# XOR - кодировка символа
baInputbuf = baInputbuf ^ (ord(baPassword[j]) + (i*j))
# Преобразование числа в шестнадцатеричную систему
strOutput += QtCore.QString("%1").arg(baInputbuf,2,16,QtCore.QChar('0'))
# Возврат кодированной строки
return strOutput
# Декодирование строки
def stringDecrypt(strInput, strPassword):
strOutput = QtCore.QString('')
# Декодировка строки из 16-ричной системы в битовый массив
baInput = QtCore.QByteArray.fromHex(QtCore.QString(strInput).toLocal8Bit())
# Перевод строки пароля в битовый массив
baPassword = QtCore.QByteArray(QtCore.QString(strPassword).toLocal8Bit())
# Кодирование информации
for i in range(baInput.size()):
baInputbuf = ord(baInput[i])
for j in range(baPassword.size()):
# XOR - кодировка символа
baInputbuf = baInputbuf ^ (ord(baPassword[j]) + (i*j))
strOutput += QtCore.QChar(baInputbuf)
# Возврат декодированной строки
return strOutput
Отредактировано (Апрель 9, 2010 12:49:29)
Офлайн