@@ -273,14 +273,14 @@ void QAESEncryption::invShiftRows()
273
273
it[11 ] = (quint8)temp;
274
274
}
275
275
276
- QByteArray QAESEncryption::ivXor (const QByteArray in , const QByteArray iv )
276
+ QByteArray QAESEncryption::byteXor (const QByteArray a , const QByteArray b )
277
277
{
278
- QByteArray::const_iterator it = in .begin ();
279
- QByteArray::const_iterator it_iv = iv .begin ();
278
+ QByteArray::const_iterator it_a = a .begin ();
279
+ QByteArray::const_iterator it_b = b .begin ();
280
280
QByteArray ret;
281
281
282
282
for (int i = 0 ; i < m_blocklen; i++)
283
- ret.insert (i,it [i] ^ it_iv [i]);
283
+ ret.insert (i,it_a [i] ^ it_b [i]);
284
284
285
285
return ret;
286
286
}
@@ -345,45 +345,78 @@ QByteArray QAESEncryption::invCipher(const QByteArray expKey, const QByteArray i
345
345
346
346
QByteArray QAESEncryption::encode (const QByteArray rawText, const QByteArray key, const QByteArray iv)
347
347
{
348
- if (m_mode = = CBC && (iv.isNull () || iv.size () != m_blocklen))
348
+ if (m_mode > = CBC && (iv.isNull () || iv.size () != m_blocklen))
349
349
return QByteArray ();
350
350
351
351
QByteArray ret;
352
352
QByteArray expandedKey = expandKey (key);
353
353
QByteArray alignedText (rawText);
354
354
QByteArray ivTemp (iv);
355
355
356
-
357
356
alignedText.append (getPadding (rawText.size (), m_blocklen), 0 ); // filling the array with zeros
358
357
359
- for (int i=0 ; i < alignedText.size (); i+= m_blocklen){
360
- if (m_mode == CBC)
361
- alignedText.replace (i, m_blocklen, ivXor (alignedText.mid (i, m_blocklen),ivTemp));
362
-
363
- ret.append (cipher (expandedKey, alignedText.mid (i, m_blocklen)));
358
+ // Preparation for CFB
359
+ if (m_mode == CFB)
360
+ ret.append (byteXor (alignedText.mid (0 , m_blocklen), cipher (expandedKey, iv)));
364
361
365
- if (m_mode == CBC)
362
+ // Looping thru all blocks
363
+ for (int i=0 ; i < alignedText.size (); i+= m_blocklen){
364
+ switch (m_mode)
365
+ {
366
+ case ECB:
367
+ ret.append (cipher (expandedKey, alignedText.mid (i, m_blocklen)));
368
+ break ;
369
+ case CBC:
370
+ alignedText.replace (i, m_blocklen, byteXor (alignedText.mid (i, m_blocklen),ivTemp));
371
+ ret.append (cipher (expandedKey, alignedText.mid (i, m_blocklen)));
366
372
ivTemp = ret.mid (i, m_blocklen);
373
+ break ;
374
+ case CFB:
375
+ if (i+m_blocklen < alignedText.size ())
376
+ ret.append (byteXor (alignedText.mid (i+m_blocklen, m_blocklen),
377
+ cipher (expandedKey, ret.mid (i, m_blocklen))));
378
+ break ;
379
+ default :
380
+ // do nothing
381
+ break ;
382
+ }
367
383
}
368
384
return ret;
369
385
}
370
386
371
387
QByteArray QAESEncryption::decode (const QByteArray rawText, const QByteArray key, const QByteArray iv)
372
388
{
373
- if (m_mode = = CBC && (iv.isNull () || iv.size () != m_blocklen))
389
+ if (m_mode > = CBC && (iv.isNull () || iv.size () != m_blocklen))
374
390
return QByteArray ();
375
391
376
392
QByteArray ret;
377
393
QByteArray expandedKey = expandKey (key);
378
- QByteArray alignedText (rawText);
379
394
QByteArray ivTemp (iv);
380
395
381
- for (int i=0 ; i < alignedText.size (); i+= m_blocklen){
382
- ret.append (invCipher (expandedKey, alignedText.mid (i, m_blocklen)));
383
-
384
- if (m_mode == CBC) {
385
- ret.replace (i, m_blocklen, ivXor (ret.mid (i, m_blocklen),ivTemp));
386
- ivTemp = alignedText.mid (i, m_blocklen);
396
+ // Preparation for CFB
397
+ if (m_mode == CFB)
398
+ ret.append (byteXor (rawText.mid (0 , m_blocklen), cipher (expandedKey, iv)));
399
+
400
+ for (int i=0 ; i < rawText.size (); i+= m_blocklen){
401
+ switch (m_mode)
402
+ {
403
+ case ECB:
404
+ ret.append (invCipher (expandedKey, rawText.mid (i, m_blocklen)));
405
+ break ;
406
+ case CBC:
407
+ ret.append (invCipher (expandedKey, rawText.mid (i, m_blocklen)));
408
+ ret.replace (i, m_blocklen, byteXor (ret.mid (i, m_blocklen),ivTemp));
409
+ ivTemp = rawText.mid (i, m_blocklen);
410
+ break ;
411
+ case CFB:
412
+ if (i+m_blocklen < rawText.size ()){
413
+ ret.append (byteXor (rawText.mid (i+m_blocklen, m_blocklen),
414
+ cipher (expandedKey, rawText.mid (i, m_blocklen))));
415
+ }
416
+ break ;
417
+ default :
418
+ // do nothing
419
+ break ;
387
420
}
388
421
}
389
422
return ret;
0 commit comments