Нашёл свой код полуторагодовалой давности, который почему-то не опубликовал:
Обожаю security through obscurity. Декодируем пароль из конфига Psi, кидая первым аргументом password, а вторым jid:
#include <QString>
#include <iostream>
QString decodePassword(const QString &pass, const QString &key)
{
QString result;
int n1, n2;
if (key.length() == 0) {
return pass;
}
for(n1 = 0, n2 = 0; n1 < pass.length(); n1 += 4) {
ushort x = 0;
if(n1 + 4 > pass.length()) {
break;
}
x += QString(pass.at(n1)).toInt(NULL,16)*4096;
x += QString(pass.at(n1+1)).toInt(NULL,16)*256;
x += QString(pass.at(n1+2)).toInt(NULL,16)*16;
x += QString(pass.at(n1+3)).toInt(NULL,16);
QChar c(x ^ key.at(n2++).unicode());
result += c;
if(n2 >= key.length()) {
n2 = 0;
}
}
return result;
}
int main(int argc, char *argv[]) {
QString p = QString(argv[1]);
QString k = QString(argv[2]);
QString r = decodePassword(p, k);
std::string ru = r.toUtf8().constData();
std::cout << ru << std::endl;
return 0;
}