PDA

View Full Version : [HELP] AES CBC & ECB Encryption & Decryption



nemoryoliver
12th February 2014, 02:08
I am very new to QT and also with Encryption stuffs. Just a week I started fighting to learn encryption stuffs but I am really stuck and don't know what to do.

I just really need to decrypt a downloaded blob. using ECB and also there's another I need with CBC

Here's the working PHP functions I want to convert to QT




function decryptECB($data)
{
$BLOB_ENCRYPTION_KEY = 'M02cnQ51Ji97vwT4';
return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $BLOB_ENCRYPTION_KEY, pad($data), MCRYPT_MODE_ECB);
}

function encryptECB($data)
{
$BLOB_ENCRYPTION_KEY = 'M02cnQ51Ji97vwT4';
return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $BLOB_ENCRYPTION_KEY, pad($data), MCRYPT_MODE_ECB);
}

function pad($data, $blocksize = 16)
{
$pad = $blocksize - (strlen($data) % $blocksize);
return $data . str_repeat(chr($pad), $pad);
}

// FOR STORIES
function decryptCBC($data, $key, $iv)
{
// Decode the key and IV.
$iv = base64_decode($iv);
$key = base64_decode($key);

// Decrypt the data.
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
$padding = ord($data[strlen($data) - 1]);

return substr($data, 0, -$padding);
}



I am programming this to the BlackBerry10 Platform

Do you have any suggested libs that has the similar functions as with PHP?

I tried AESCryptoDemo https://github.com/blackberry/Cascades-Community-Samples/tree/master/AESCryptoDemo and I think it uses CBC which I saw in it's AESParams.cpp file. but no example for ECB

This is how I load downloaded the file in QT




QString filename = "data/files/blobs/storyphoto.jpg";

QFile* file = new QFile(filename);

if(file->open(QIODevice::ReadOnly))
{
qDebug() << "BYTES: " + QString::fromAscii(file->readAll()) + ", SIZE: " + file->size();

QString decryptedBlob = decrypt(file->readAll());

qDebug() << "DECRYPTED BLOB: " + toHex(file->readAll());

QFile* newFile = new QFile("data/files/blobs/NEW.jpg");

if (!newFile->open(QIODevice::WriteOnly))
{
qDebug() << "PROBLEM OPENING FILE: " + filename;
}
else
{
newFile->write(decryptedBlob.toAscii());
}

newFile->close();
}
else
{
qDebug() << "CANT OPEN: " + filename;
}

file->close();
I have also modified some AESCryptoDemo functions - Just to return values

QString ApplicationUI::encrypt(QString data)
{
QString encryptedData = "";

QByteArray in(data.toUtf8());
pad(in);
QByteArray out(in.length(), 0);

if (crypt(true, in, out))
{
encryptedData = toHex(out);
}

return encryptedData;
}

QString ApplicationUI::decrypt(QString data)
{
QString decryptedBlob = "";

QByteArray in;

if (!fromHex(data, in))
{
qDebug() << "Cipher text is not valid hex";
return "";
}

QByteArray out(in.length(), 0);

if (crypt(false, in, out))
{
if (removePadding(out))
{
decryptedBlob = QString::fromUtf8(out.constData(), out.length());
}
}

return decryptedBlob;
}

QString ApplicationUI::toHex(const QByteArray & in)
{
static char hexChars[] = "0123456789abcdef";

const char * c = in.constData();
QString toReturn;

for (int i = 0; i < in.length(); ++i)
{
toReturn += hexChars[(c[i] >> 4) & 0xf];
toReturn += hexChars[(c[i]) & 0xf];
}

return toReturn;
}



Here I am trying to encrypt and decrypt a simple string..

I also don't think if I need to do something with the char "\" because when I qDebug it it is forgotten.





QString key = "i17ZJekcUf3J\/P\/EFk3fmXHSBnxfMvf6BFuN0kbI57Q=";
QString iv = "wmUlWE+EmUMguG\/ealoMcg==";

QString hexKey = toHex(key.toAscii());
QString hexIV = toHex(iv.toAscii());

setKey(hexKey);
setIV(hexIV);

qDebug() << "HEX KEY: " + hexKey + ", ORIG KEY: " + key;
qDebug() << "HEX IV: " + hexIV + ", ORIG IV: " + iv;

QString encrypted = encrypt("data");
QString decrypted = decrypt(encrypted);

qDebug() << "ENCRYPTED " + encrypted + ", DECRYPTED: " + decrypted;



running the above code I get

"HEX KEY: 6931375a4a656b635566334a2f502f45466b33666d58485342 6e78664d7666364246754e306b62493537513d, ORIG KEY: i17ZJekcUf3J/P/EFk3fmXHSBnxfMvf6BFuN0kbI57Q="

"HEX IV: 776d556c57452b456d554d6775472f65616c6f4d63673d3d, ORIG IV: wmUlWE+EmUMguG/ealoMcg=="

FAILED "AESKey" AESKey 57616 "SB_ERR_BAD_KEY_LEN (57616)"

"Could not create a key. SB_ERR_BAD_KEY_LEN (57616)"

Cipher text is not valid hex
"ENCRYPTED , DECRYPTED: "


Thanks so much! Hope someone can help.

wysota
12th February 2014, 07:28
Where is that 'crypt' method implemented? Have you verified that it works properly?