Jump to content

C++ šifrēšana (idea)


MetalOxygen
 Share

Recommended Posts

Labdien!
Lieta tāda, cenšos uzrakstīt kodu failu šifrēšanai izmantojot Crypto++ bibliotēkas.

Bet visas manas versijas nonāk pie viena un tā paša errora:

gjppfsoitqtoqxbadpk9_thumb.jpg

 

Varbūt kādu varētu norādīt, kur būtu meklējamas nepilnības un kā tās būtu iespējams labot?

int useidea_enc(string FILENAME, string NEW_FILENAME)
{
    ifstream inFile;
    ofstream outFile;
    char writet;
    string readt2;
    string writet2;

    inFile.open(FILENAME.c_str(), ios::in | ios::binary);
    outFile.open(NEW_FILENAME.c_str(), ios::out | ios::binary);

    if (inFile.fail())
    {
        cout << " Neizdevas atvert sifrejamo failu.\n" << endl;
        if (outFile.fail()) {cout << " Neizdevas izveidot jauno failu.\n" << endl;}
        std::cout << std::endl << "  Nospiediet jekuru tausinu, lai turpinatu...";
        getchar();
        exit(1);
    }
    if (outFile.fail())
    {
        cout << " Neizdevas izveidot jauno failu.\n" << endl;
        std::cout << std::endl << "  Nospiediet jekuru tausinu, lai turpinatu...";
        getchar();
        exit(1);
    }
AutoSeededRandomPool prng;

    SecByteBlock key(IDEA::DEFAULT_KEYLENGTH);
    prng.GenerateBlock(key, key.size());

    byte iv[IDEA::BLOCKSIZE];
    prng.GenerateBlock(iv, sizeof(iv));

    try
    {
        while(!inFile.eof())
        {
            readt2 = inFile.get();

            CBC_Mode< IDEA >::Encryption e;
            e.SetKeyWithIV(key, key.size(), iv);

            StringSource(readt2, true,
                new StreamTransformationFilter(e,
                    new StringSink(writet2)
                )    
            );
        strncpy(&writet, writet2.c_str(), sizeof(writet));
        outFile.put(writet);
        }
    }
    catch(const CryptoPP::Exception& e)
    {
        cerr << e.what() << endl;
        exit(1);
    }

    inFile.close();
    outFile.close();
    return 0;
}

Kods ņemts no piemēra šeit: http://www.cryptopp.com/wiki/IDEA

P.S. Jau apzinos, ka manas C++ prasmes (vai vispār OOP) nav ne tuvu tās labākās, nav nepieciešams to komentēt.

Labots - MetalOxygen
Link to comment
Share on other sites

Palaid debuggeri un paskaties kuraa rindiņā rodas exceptions.

Lieku uz neinicializētiem mainīgajiem, kuros kaut ko mēģina rakstīt.

Link to comment
Share on other sites

MetalOxygen
(labots)

paslēdzot ārā koda daļas nonācu līdz secinājumam, ka pie vainas ir viena no šīm rindām:

AutoSeededRandomPool prng;
SecByteBlock key(Blowfish::DEFAULT_KEYLENGTH);
prng.GenerateBlock( key, key.size() );
byte iv[ Blowfish::BLOCKSIZE ];
prng.GenerateBlock( iv, sizeof(iv) );

tiešām nebūs versiju, kas te var izraisīt tādu kļūdu?

Labots - MetalOxygen
Link to comment
Share on other sites

Mezavecis

Diez vai kāds kaut ko jēdzīgu ieteiks, jo minētais kods izmanto specifiskas klases, kuras parasti reti kam ir zināmas. Nu nevar izzīlēt no esošā koda, ko dara funkcijas GenerateBlock un SecByteBlock un ko satur klase AutoSeededRandomPool. Ej vien ar debageri cauri un skaties pats. Ieliec pašu projektu te ar visiem libiem.

Link to comment
Share on other sites

Man šāds koda fragments neko nekrašo.

$ cat test.cpp
#include <cryptopp/secblock.h>
#include <cryptopp/blowfish.h>
#include <cryptopp/osrng.h>
 
int main()
{
  using namespace CryptoPP;
  AutoSeededRandomPool prng;
  SecByteBlock key(Blowfish::DEFAULT_KEYLENGTH);
  prng.GenerateBlock( key, key.size() );
  byte iv[ Blowfish::BLOCKSIZE ];
  prng.GenerateBlock( iv, sizeof(iv) );
}

$ clang++ test.cpp -lcryptopp -pthread

$ ./a.out
Labots - bubu
Link to comment
Share on other sites

MetalOxygen
(labots)

Visu projektu ielādēju šeit

Man arī compile strādā ideāli, bet debug met visādus brīnumus. Errors arī padarbinot kodu ne vienmēr izlec tajā pašā vietā.

Pamanījos aizrakties, līdz tam, ka tas varētu būt kaut kas Visual Studio raksturīgs, jo pa laikam izlido viens cits errors (īsti gan vēl neizdomāju tieši pie kādiem nosacījumiem šis parādās):

debug assertion failed _block_type_is_valid(phead- nblockuse)

nav pilns errora teksts, diemžēl vēl neuztaisīju skrīnshotu.

Labots - MetalOxygen
Link to comment
Share on other sites

Man arī compile strādā ideāli, bet debug met visādus brīnumus.

 

Debugot, debugot vajag. Tas koda piemērs strādā ne tikai kompilējot - arī izpildot viss notiek. Kā redzi manā postā tur ir arī izpilde - "./a.out".

 

Kļūda tev ir nevis kodā, bet tajā kā tu uztaisīji Visual Studio projektu. Tas tev ir uztaisīts kā .NET projekts - kas tiek kompilēts ar C++/CLI un ir atkarīgs no .NET freimworka. Tas neģenerē neitīvu izpildāmo kodu, bet gan .NET baitkodu.

Rezultātā tur kaut kāda miskaste notiek ar atmiņu, kad tiek izsauktas Crypto++ metodes, kuras ir tīras C/C++. Noņem nost /clr argumentu projektam un viss strādās.

 

Dodot citiem skatīties tavu kodu vajag to satīrīt - īpaši indentāciju. Tev viss tur ir līki saindentēts.

Vēl iesaku nejaukt vienā kodā kopā C I/O funckijas un C++ I/O klases izvadam/ievadam uz konsoli. Lieto tikai viena veida I/O.

Un liekot VS projektu, nevajag pakot .obj, .pdb, .pch, .ilk un citus ģenerētos failus. Tad citiem mazāks arhīvs būs jāvelk.

Labots - bubu
  • Patīk 1
Link to comment
Share on other sites

MetalOxygen
(labots)

paldies :)
nedaudz vēlāk tiks pārbaudīts un došu ziņu.

 

p.s. atvainojos par to koda noformējumu, tiešām steigā tikai līkos komentārus izdzēsu.


p.p.s. jā, problēma novērsta. radās kaut kādas jaunas kļūdas, bet šīs izskatās novēršamas :)

Labots - MetalOxygen
Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...