Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is OFB cipherMode supported in .NET?

I'm using AESCryptoServiceProviderclass. I'm trying to test different CipherMode values.

When using OFBmode I get an exception: Invalid algorithm specified.

In the documentation the mode is documented:

AESCryptoServiceProvider Class http://msdn.microsoft.com/es-es/library/system.security.cryptography.aescryptoserviceprovider.aspx

CipherMode http://msdn.microsoft.com/es-es/library/system.security.cryptography.ciphermode.aspx

I also have read this similar post, but found no answer:

Does .NET support of AES OFB

My code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Security.Cryptography;
using System.IO;

namespace V_ModosDeEncadenamiento
{
    class Program
    {
        static void Main(string[] args)
        {
            //Clave de 128
            byte[] claveAES128Bits = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                                       0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };


            //Vector de inicialización
            byte[] vectorInicializacion = { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
                                            0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF };

            //Texto plano de prueba para codificar. Bloque de 16 bytes todos iguales
            byte[] textoPlanoBloques16BytesIguales = 
                                       {0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
                                       0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
                                       0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
                                       0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
                                       0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
                                       0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF};


            //Nombre del fichero en disco con texto cifrado
            String nombreFicheroECB = "zz_TextoCifradoECB.bin";
            String nombreFicheroCBC = "zz_TextoCifradoCBC.bin";
            String nombreFicheroCFB = "zz_TextoCifradoCFB.bin";
            String nombreFicheroOFB = "zz_TextoCifradoOFB.bin";

            //Array con el texto descifrado
            byte[] textoDescifrado = new byte[textoPlanoBloques16BytesIguales.Length];

            AesCryptoServiceProvider aesCrypto = new AesCryptoServiceProvider();
            FileStream fileWrite;
            FileStream fileRead;
            ICryptoTransform encryptor;
            ICryptoTransform decryptor;
            CryptoStream stream;
            CryptoStream streamOut;



            //Establecer valores 
            aesCrypto.KeySize = 128;
            aesCrypto.Key = claveAES128Bits;
            aesCrypto.IV = vectorInicializacion;
            aesCrypto.Padding = PaddingMode.PKCS7;

   aesCrypto.Mode = CipherMode.OFB;
    fileWrite = new FileStream(nombreFicheroOFB, FileMode.Create, FileAccess.Write, FileShare.None);
    encryptor = aesCrypto.CreateEncryptor();
    stream = new CryptoStream(fileWrite, encryptor, CryptoStreamMode.Write);

    // THE EXCEPTION HAPPENS HERE **************************************************
    //******************************************************************************
    stream.Write(textoPlanoBloques16BytesIguales, 0, textoPlanoBloques16BytesIguales.Length);
    stream.Flush();
    stream.Close();
    stream.Dispose();
    fileWrite.Close();

    fileRead = new FileStream(nombreFicheroOFB, FileMode.Open, FileAccess.Read, FileShare.None);
    decryptor = aesCrypto.CreateDecryptor();
    streamOut = new CryptoStream(fileRead, decryptor, CryptoStreamMode.Read);
    streamOut.Read(textoDescifrado, 0, textoDescifrado.Length);
    streamOut.Flush();
    streamOut.Close();
    streamOut.Dispose();
    fileRead.Close();

    //Mostrar datos descifrados
    Console.WriteLine();
    Console.WriteLine();
    Console.WriteLine("Cifrado modo EFB.");
    Console.WriteLine("Datos descifrados:");
    for (int i = 0; i <= textoDescifrado.Length - 1; i++)
    {
        if (((i % 8) == 0) && (i != 0)) Console.WriteLine(); //8 bytes en cada linea
        Console.Write(" {0:X2}", textoDescifrado[i]);
    }
like image 212
David Casillas Avatar asked Mar 12 '26 05:03

David Casillas


1 Answers

Check this article: http://social.msdn.microsoft.com/Forums/is/netfxbcl/thread/891955cd-3125-487c-9746-9fd07f24b12f

RijndaelManaged doesn't support OFB mode at the moment. You can code (almost easily) OFB mode yourself, atop of ECB mode, or use side cryptography libraries, like BouncyCastle, SecureBlackbox, whatever else.

like image 200
Nickolay Olshevsky Avatar answered Mar 14 '26 18:03

Nickolay Olshevsky