Windows CNG c++

Iniciado por XKC, 4 Julio 2018, 23:38 PM

0 Miembros y 1 Visitante están viendo este tema.

XKC

Hola buenas noches a todos,
Bien la cuestión es que estoy aprendiendo a programar utilizando win32.
Estoy una aplicacion simple a modo de ejemplo que cifre un fichero con AES CBC, y desde otra lo recibo y descifro.
Bien, la cuestion es que para implementar cifrados hay librerias como crypto pero yo estoy buscando una solucion nativa, he estado buscando y hay una Crypto API, que a parte de ser bastante complicada esta obsoleta o eso parece, pero informandome mas me he encontrado con una cosa llamada Crypto API Next Generation, que es como la nueva version de la anterior, o eso creo.
¿Alguien me puede dar info mas detallada acerca de la misma?
- ¿Es una API implementada en windows vista, con lo que el exe que yo genero solo funcionara de ahi en adelante, cierto?
- ¿Es nativa no? ¿Lo que quiere decir que funcionara correctamente en cualquier windows superior al vista?
- Estoy desarrollando sobre visual studio 2017 con w10, ¿es necesario que descarge algo?, porque he visto en algun tutorial que pide antes de comenzar configurar el linker para que apunte a C:\Program Files\Microsoft CNG Development Kit\Lib\X86
- Bueno, si alguien me puede orientar en el tema un poco, o pasarme algun link se lo agradeceria mucho.
Un slaudo.
Para poder atacar y vencer con seguridad, ataca donde ellos no puedan defenderse.
Para defenderte y resistir firme, defiéndete en donde ellos no atacarán.

kub0x

#1
Cita de: XKC en  4 Julio 2018, 23:38 PM
hay una Crypto API, que a parte de ser bastante complicada esta obsoleta o eso parece, pero informandome mas me he encontrado con una cosa llamada Crypto API Next Generation, que es como la nueva version de la anterior, o eso creo.

Así es, está obsoleta se le solía llamar CAPI. En WinVista se introdujo CryptoNextGen la cual incluye lo mismo que la CAPI y añade nuevas primitivas y modos además de permitir al usuario desarrolar una API para desarrollar por ejemplo métodos de cifrado propios. Para esto último al usuario se le ofrece un kit de desarrollo (https://www.microsoft.com/en-us/download/details.aspx?id=30688).

Citar
- ¿Es una API implementada en windows vista, con lo que el exe que yo genero solo funcionara de ahi en adelante, cierto?

Así es, la mayoría de la crypto está en bcrypt.dll la cual se introdujo a partir de WinVista y WinServer 2008, si estoy en lo cierto.

Citar¿Es nativa no? ¿Lo que quiere decir que funcionara correctamente en cualquier windows superior al vista?
- Estoy desarrollando sobre visual studio 2017 con w10, ¿es necesario que descarge algo?, porque he visto en algun tutorial que pide antes de comenzar configurar el linker para que apunte a C:\Program Files\Microsoft CNG Development Kit\Lib\X86

Si es nativa, existen soluciones managed (administradas) para .NET que acaban delegando en bcrypt.dll lo que viene a ser un wrapper.
Visual Studio funciona bien para desarrollar aplicaciones que usen la NextGen, ya que el entorno viene configurado, tanto el path de include como el de link, así que no tienes que andar haciendo nada. El CNGDK como arriba he mencionado, es por si te animas tu para hacer una interface de programación con tus propios métodos y luego utilizarlo en usermode o kernel.

Y para terminar, te dejo el punto de entrada en forma de referencia:

Sobre CNG -> https://docs.microsoft.com/en-us/windows/desktop/SecCNG/about-cng#data-protection-api-next-generation

Primitivas -> https://docs.microsoft.com/en-us/windows/desktop/SecCNG/cng-cryptographic-primitive-functions

Referencias del CNG -> https://docs.microsoft.com/en-us/windows/desktop/SecCNG/cng-reference

Saludos.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


XKC

#2
Cita de: kub0x en  5 Julio 2018, 01:28 AM
Así es, está obsoleta se le solía llamar CAPI. En WinVista se introdujo CryptoNextGen la cual incluye lo mismo que la CAPI y añade nuevas primitivas y modos además de permitir al usuario desarrolar una API para desarrollar por ejemplo métodos de cifrado propios. Para esto último al usuario se le ofrece un kit de desarrollo (https://www.microsoft.com/en-us/download/details.aspx?id=30688).

Así es, la mayoría de la crypto está en bcrypt.dll la cual se introdujo a partir de WinVista y WinServer 2008, si estoy en lo cierto.

Si es nativa, existen soluciones managed (administradas) para .NET que acaban delegando en bcrypt.dll lo que viene a ser un wrapper.
Visual Studio funciona bien para desarrollar aplicaciones que usen la NextGen, ya que el entorno viene configurado, tanto el path de include como el de link, así que no tienes que andar haciendo nada. El CNGDK como arriba he mencionado, es por si te animas tu para hacer una interface de programación con tus propios métodos y luego utilizarlo en usermode o kernel.

Y para terminar, te dejo el punto de entrada en forma de referencia:

Sobre CNG -> https://docs.microsoft.com/en-us/windows/desktop/SecCNG/about-cng#data-protection-api-next-generation

Primitivas -> https://docs.microsoft.com/en-us/windows/desktop/SecCNG/cng-cryptographic-primitive-functions

Referencias del CNG -> https://docs.microsoft.com/en-us/windows/desktop/SecCNG/cng-reference

Saludos.
Hola buenas, llevo ya un tiempo detras de ello y me esta siendo imposible, he llegado a este ejemplo muy util https://github.com/Microsoft/Windows-classic-samples/blob/master/Samples/Security/CipherEncryptionDecryption/cpp/CipherEncryptionDecryption.cpp, me descarg la solucion y compila y funciona corectamente, ahora, cuando creo un proyecto c++ win32 vacio y creo clases y lo refcatorizo ni siquiera me compila, creo que me esta faltando de o mas basico, me da un error en la linea 460 de que no puede hacer un cast de cont wchar_t[7] a PVOID
La sucesion de pasos que realizo es la siguiente:

  • Crear nuevo proyecto, visual c++, proyecto vacio
  • Agregar archivo cpp, main.cpp
  • Copy/paste codigo de github
  • Compilar solucion
En los checkbox que aparecen en vs arriba esta seleccionado modo debug para x86, que creo que ahi es el problema y deberia estar win32, pero no lo tengo claro.
¿Alguien me podria ayudar?, gracias de atenano.
Y otra duda,  aprovechando este mismo codigo, se ve como con un array de BYTE se aplica el cifrado, si yo quisisera cifrar un archivo, ¿como lo hariais?
Debido a que tengo que pasar el archivo a bytes(eso es sencillo, lo leo char por char y le hago un cast a byte directamente, pero la cuestion es qu eno quiero cargar todo el archivo en memoria y luego escribir poruq eno creo que sea optimo), yo usaba los streams para cifrar el flujo, pero no se como usarlo a este nivel.., asi que se me ha ocurrido algo asi

int maxBuff = 100;// Cantidad max de bytes de un fich en memoria
char buff[maxBuff] = "";
char c;
int a = 0;
FILE *file;
file = fopen("fichero_cifrar.abc", "rw");
if (file) {
        while((c = getc(file)) != EOF ){
             if(a < maxBuff){
                 buff[a] = c;
                 a++;
             }else{
                    a = 0;
                    // Cifrar y reescribitr fichero con el buffer
             }
        }
   
    fclose(file);
}


Para poder atacar y vencer con seguridad, ataca donde ellos no puedan defenderse.
Para defenderte y resistir firme, defiéndete en donde ellos no atacarán.