Исходник с CryptoApi rsa 1024 нужна помощь знающих

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DarkLight, 3 Jul 2012.

  1. DarkLight

    DarkLight New Member

    Joined:
    13 Jan 2011
    Messages:
    11
    Likes Received:
    1
    Reputations:
    0
    Здравствуйте!!!

    Такая проблема один чел сказал что тут длина ключа RSA меньше чem 1024 а мне надо 2048. что надо исправить, добавить, буду рад любым предложениям.




    Генерация ключей

    PHP:
    #include <Windows.h>
    #include <WinCrypt.h>
    #include <stdio.h>
    #pragma comment (lib, "advapi32.lib")
    BOOL GenerateKey()
    {
      
    HCRYPTPROV hProv;
      
    HCRYPTKEY hKey;
      
    BOOL success TRUE;
      if( !
    CryptAcquireContext( &hProvNULLMS_ENHANCED_PROVPROV_RSA_FULL0) &&
          !
    CryptAcquireContext( &hProvNULLMS_ENHANCED_PROVPROV_RSA_FULLCRYPT_NEWKEYSET) ) //пытаемся открыть существующий keyset или создать новый
      
    {
        
    printf"Не удается создать контекст\n" );
        return 
    FALSE;
      }
      if( !
    CryptGenKeyhProvAT_KEYEXCHANGE1024<<16, &hKey) ) //генерируем 1024-битный ключ для обмена
      
    {
        
    printf"Не удается создать ключ RSA для обмена\n" );
        
    success FALSE;
      }
      
    CryptReleaseContexthProv0);
      if( 
    success printf"Успешно создан ключ RSA для обмена\n" );
      return 
    success;
    }
    int mainvoid )
    {
      return 
    GenerateKey() ? : -1;
    }




    Шифрование файла


    PHP:
    #include <Windows.h>
    #include <WinCrypt.h>
    #include "utils.h"
    #include <stdio.h>
    #pragma comment (lib, "advapi32.lib")
    BOOL _EncryptFilechar *_InFilechar *_OutFile)
    {
      
    HCRYPTPROV hProv;
      
    HCRYPTKEY hPubKey;
      
    HCRYPTHASH hHash;
      
    HANDLE hInFile INVALID_HANDLE_VALUEhOutFile INVALID_HANDLE_VALUE;
      
    BOOL success TRUE;
      if( !
    CryptAcquireContext( &hProvNULLMS_ENHANCED_PROVPROV_RSA_FULL0) ) //получаем контекст
      
    {
        
    printf"Не удается получить контекст\n" );
        return 
    FALSE;
      }
      if( !
    CryptGetUserKeyhProvAT_KEYEXCHANGE, &hPubKey) ) //достаем публичный ключ пользователя
      
    {
        
    puts"Не удается получить публичный ключ из контейнера\n" );
        
    CryptReleaseContexthProv0);
        return 
    FALSE;
      }
      if( (
    hInFile CreateFileA_InFileGENERIC_READFILE_SHARE_READNULLOPEN_EXISTING0NULL)) == INVALID_HANDLE_VALUE //открываем входной файл
      
    {
        
    printf"Не удается открыть входной файл\n" );
        
    success FALSE;
      }
      if( 
    success && (hOutFile CreateFileA_OutFileGENERIC_WRITEFILE_SHARE_READNULLCREATE_ALWAYS0NULL)) == INVALID_HANDLE_VALUE //открываем выходной файл
      
    {
        
    printf("Не удается открыть выходной файл\n");
        
    success FALSE;
      }
      if( 
    success ) if( CryptCreateHashhProvCALG_MD500, &hHash) ) //создаем хэш
      
    {
        
    HCRYPTKEY hKey;
        if( 
    CryptGenKeyhProvCALG_3DESCRYPT_EXPORTABLE, &hKey) ) //генерируем ключ для 3DES
        
    {
          
    EncFileHeader fh;
          
    DWORD dwLen sizeof(struct RSA1024KeyExchBLOB);
          if( 
    CryptExportKeyhKeyhPubKeySIMPLEBLOB0, (BYTE *) &fh.kb, &dwLen) ) //экспортируем ключ 3DES
          
    {
            
    DWORD dwSzHighdwSzLow GetFileSizehInFile, &dwSzHigh); //получаем размер исходного файла
            
    unsigned __int64 fSize = (dwSzHigh << 32) + dwSzLow;
            
    BYTE buf[BUFFER_SIZE+8]; //8 - запас на padding
            
    fh.fSize fSize;
            if( 
    WriteFilehOutFile, &fhsizeof(EncFileHeader), &dwLenNULL) ) //пишем ключ и размер исходного файла
            
    {
              while( 
    fSize )
              {
                if( !
    ReadFilehInFilebufBUFFER_SIZE, &dwLenNULL) ) //читаем блок данных
                
    {
                  
    printf"Ошибка чтения файла\n" );
                  
    success FALSE;
                  break;
                }
                
    dwSzLow dwLen;
                if( !
    CryptEncrypthKeyhHashfSize <= BUFFER_SIZE0buf, &dwSzLowsizeof(buf)) ) //шифруем и хешируем его
                
    {
                  
    printf"Ошибка шифрования\n" );
                  
    success FALSE;
                  break;
                }
                if( !
    WriteFilehOutFilebufdwSzLow, &dwSzLowNULL) )
                {
                  
    printf"Ошибка записи\n" );
                  
    success FALSE;
                  break;
                }
                
    fSize -= dwLen;
              }
              if( !
    fSize //все зашифровали нормально
              
    {
                
    dwLen sizeof(buf);
                if( 
    CryptSignHashhHashAT_KEYEXCHANGENULL0buf, &dwLen) ) //подписываем хэш
                
    {
                  if( !
    WriteFilehOutFilebufdwLen, &dwLenNULL) )
                    
    printf"Ошибка записи хеша в файл\n" );
                  else
                    
    printf"Шифрование успешно завершено\n" );
                }
                else
                  
    printf"Не удается подписать файл\n" );
              }
            }
            else
              
    printf"Не удается сохранить ключ 3DES\n" );
          }
          else
            
    printf"Не удается экспортировать ключ 3DES\n" );
          
    CryptDestroyKeyhKey );
          
    CryptDestroyHashhHash );
        }
        else
          
    printf"Не удается создать ключ 3DES\n" );
      }
      else
        
    puts"Не удается создать хэш\n" );
      if( 
    hOutFile != INVALID_HANDLE_VALUE CloseHandlehOutFile );
      if( 
    hInFile != INVALID_HANDLE_VALUE CloseHandlehInFile );
      
    CryptDestroyKeyhPubKey );
      
    CryptReleaseContexthProv0);
      return 
    success;
    }
    int main()
    {
      return 
    _EncryptFile"in.bin""out.bin") ? : -1;
    }



    Дешифрование файла


    PHP:
    #include <Windows.h>
    #include <WinCrypt.h>
    #include "utils.h"
    #include <stdio.h>
    #pragma comment (lib, "advapi32.lib")
    BOOL _DecryptFilechar *_InFilechar *_OutFile)
    {
      
    HCRYPTPROV hProv;
      
    HCRYPTKEY hPrivKey;
      
    HCRYPTHASH hHash;
      
    HANDLE hInFile INVALID_HANDLE_VALUEhOutFile INVALID_HANDLE_VALUE;
      
    BOOL success TRUE;
      if( !
    CryptAcquireContext( &hProvNULLMS_ENHANCED_PROVPROV_RSA_FULL0) ) //получаем контекст
      
    {
        
    printf"Не удается получить контекст\n" );
        return 
    FALSE;
      }
      if( !
    CryptGetUserKeyhProvAT_KEYEXCHANGE, &hPrivKey) ) //достаем приватный ключ пользователя
      
    {
        
    printf"Не удается получить приватный ключ из контейнера\n" );
        
    CryptReleaseContexthProv0);
        return 
    FALSE;
      }
      if( (
    hInFile CreateFileA_InFileGENERIC_READFILE_SHARE_READNULLOPEN_EXISTING0NULL)) == INVALID_HANDLE_VALUE //открываем входной файл
      
    {
        
    printf"Не удается открыть входной файл\n" );
        
    success FALSE;
      }
      if( 
    success && (hOutFile CreateFileA_OutFileGENERIC_WRITEFILE_SHARE_READNULLCREATE_ALWAYS0NULL)) == INVALID_HANDLE_VALUE //открываем выходной файл
      
    {
        
    printf("Не удается открыть выходной файл\n");
        
    success FALSE;
      }
      if( 
    success ) if( CryptCreateHashhProvCALG_MD500, &hHash) ) //создаем хэш
      
    {
        
    EncFileHeader fh;
        
    DWORD dwLen;
        if( !
    ReadFilehInFile, &fhsizeof(fh), &dwLenNULL) )
        {
          
    printf"Ошибка чтения файла\n");
          
    success FALSE;
        }
        else
        {
          
    HCRYPTKEY hKey;
          if( 
    CryptImportKeyhProv, (BYTE *) &fh.kbsizeof(struct RSA1024KeyExchBLOB), hPrivKey0, &hKey) ) //импортируем сессионный ключ
          
    {
            
    unsigned __int64 fOrgSize fh.fSizefEncSize;
            
    DWORD dwSzLowdwSzHigh;
            
    BYTE buf[BUFFER_SIZE];
            
    dwSzLow GetFileSizehInFile, &dwSzHigh);
            
    fEncSize = (dwSzHigh << 32) + dwSzLow sizeof(EncFileHeader) - 1024/8//размер зашифрованных данных
            
    while( fEncSize )
            {
              if( !
    ReadFilehInFilebuffEncSize >= BUFFER_SIZE BUFFER_SIZE : (DWORD)fEncSize, &dwLenNULL) )
              {
                
    printf"Ошибка чтения\n" );
                
    success FALSE;
                break;
              }
              
    dwSzLow dwLen;
              if( !
    CryptDecrypthKeyhHashfEncSize <= BUFFER_SIZE0buf, &dwSzLow) ) //расшифровываем данные
              
    {
                
    printf"Ошибка дешифрования\n" );
                
    success FALSE;
                break;
              }
              if( !
    WriteFilehOutFilebuffOrgSize >= dwSzLow dwSzLow : (DWORDfOrgSize, &dwSzLowNULL) )
              {
                
    printf"Ошибка записи\n" );
                
    success FALSE;
                break;
              }
              
    fEncSize -= dwLen;
              
    fOrgSize -= dwSzLow;
            }
            if( !
    fEncSize //все нормально отработалось
            
    {
              if( 
    ReadFilehInFilebuf1024/8, &dwLenNULL) && dwLen == 1024///читаем подпись
              
    {
                if( !
    CryptVerifySignaturehHashbuf1024/8hPrivKeyNULL0) )
                {
                  
    success FALSE;
                  
    printf"Ошибка проверки подписи. Возможно файл был поврежден\n" );
                }
                else
                  
    printf"Файл успешно расшифрован\n" );
              }
              else
              {
                
    printf"Не найдена сигнатура файла\n" );
                
    success FALSE;
              }
            }
            
    CryptDestroyKeyhKey );
          }
          else
          {
            
    printf"Не удается импортировать ключ шифрования\n" );
            
    success FALSE;
          }
          
    CryptDestroyKeyhPrivKey );
        }
        
    CryptDestroyHash(hHash);
      }
      if( 
    hOutFile != INVALID_HANDLE_VALUE CloseHandlehOutFile );
      if( 
    hInFile != INVALID_HANDLE_VALUE CloseHandlehInFile );
      
    CryptDestroyKeyhPrivKey );
      
    CryptReleaseContexthProv0);
      return 
    success;
    }
    int main()
    {
      return 
    _DecryptFile"out.bin""out_b.bin") ? : -1;
    }



    Заголовочный файл utils.h




    PHP:
    #ifndef _UTILS_H_
    #define _UTILS_H_
    struct RSA1024KeyExchBLOB
    {
      
    PUBLICKEYSTRUC publickeystruc;
      
    ALG_ID algid;
      
    BYTE encryptedkey[1024/8];
    };
    #define BUFFER_SIZE (1<<14)
    typedef struct
    {
      
    struct RSA1024KeyExchBLOB kb;
      
    unsigned __int64 fSize;
    EncFileHeader;
    #endif


    Спасибо за внимание!!
     
    #1 DarkLight, 3 Jul 2012
    Last edited: 3 Jul 2012