Coder5546
11th December 2014, 15:12
Hello, I have a problem with TripleDESCryptoServiceProvider function. I need it to ensure backward compatibility in our app.
The general problem is that 3DES decoder doesn't work properly. If You have any suggestions how to fix my problem please answer
Best regards.
C# code:
CryptoStream cryptoStream = new CryptoStream(memoryStream, new TripleDESCryptoServiceProvider
{
Key = passwordDeriveBytes.GetBytes(24),
IV = passwordDeriveBytes.GetBytes(8)
}.CreateDecryptor(), CryptoStreamMode.Read);
StreamReader streamReader = new StreamReader(cryptoStream);
string result = streamReader.ReadToEnd();
memoryStream.Close();
cryptoStream.Close();
return result
QT/C++ Code:
byte *key = passwordDeriveBytes.GetBytes(24); // returns same value as c# function
byte *iv = passwordDeriveBytes.GetBytes(8); // returns same value as c# function
DES_key_schedule ks1, ks2;
QByteArray code1 = QByteArray::fromHex(code.toUtf8());
code1 = QByteArray::fromBase64(code1);
/*
QString string1 = "";
for(int i = 0; i < 24; i++){
string1.append(QString::number(key[i], 16) + "-");
}
QString string2 = "";
for(int i = 0; i < 8; i++){
string2.append(QString::number(iv[i], 16) + "-");
}
*/
//////////////////////////// something is wrong /////////////////////////////////////////////////
byte *output = new byte[code1.size()];
DES_set_key((C_Block *)key, &ks1);
DES_set_key((C_Block *)iv, &ks2);
DES_ecb2_encrypt((C_Block *)code1.constData(),(C_Block *)output, &ks1, &ks2, DES_DECRYPT);
QString rval = QByteArray::fromRawData((char *)output, code1.size());
return rval;
The general problem is that 3DES decoder doesn't work properly. If You have any suggestions how to fix my problem please answer
Best regards.
C# code:
CryptoStream cryptoStream = new CryptoStream(memoryStream, new TripleDESCryptoServiceProvider
{
Key = passwordDeriveBytes.GetBytes(24),
IV = passwordDeriveBytes.GetBytes(8)
}.CreateDecryptor(), CryptoStreamMode.Read);
StreamReader streamReader = new StreamReader(cryptoStream);
string result = streamReader.ReadToEnd();
memoryStream.Close();
cryptoStream.Close();
return result
QT/C++ Code:
byte *key = passwordDeriveBytes.GetBytes(24); // returns same value as c# function
byte *iv = passwordDeriveBytes.GetBytes(8); // returns same value as c# function
DES_key_schedule ks1, ks2;
QByteArray code1 = QByteArray::fromHex(code.toUtf8());
code1 = QByteArray::fromBase64(code1);
/*
QString string1 = "";
for(int i = 0; i < 24; i++){
string1.append(QString::number(key[i], 16) + "-");
}
QString string2 = "";
for(int i = 0; i < 8; i++){
string2.append(QString::number(iv[i], 16) + "-");
}
*/
//////////////////////////// something is wrong /////////////////////////////////////////////////
byte *output = new byte[code1.size()];
DES_set_key((C_Block *)key, &ks1);
DES_set_key((C_Block *)iv, &ks2);
DES_ecb2_encrypt((C_Block *)code1.constData(),(C_Block *)output, &ks1, &ks2, DES_DECRYPT);
QString rval = QByteArray::fromRawData((char *)output, code1.size());
return rval;