IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Caster
Člen
Avatar
Caster:29.10.2020 9:20

Zašifrovat malý textový soubor. Jde mi o to, jak upravit vzorový příklad vč. změny počtu bitů šifrovacíh klíčů.

Zkusil jsem: Je nutné instalovat nejnovější knihovnu Intel® Integrated Performance Primitives (Intel® IPP) Cryptography. Ukázkový příklad, chyby kompilace Absolete jsem potlačil přidáním řádku #pragma warning(disable : 4996):

#include <iostream>
#include <vector>
#include <string>
#include "ippcp.h"

using namespace std;

#pragma warning(disable : 4996)

static IppsECCPState* newStd_256_ECP(void) {
        int ctxSize;
        ippsECCPGetSize(256, &ctxSize);
        IppsECCPState* pCtx = (IppsECCPState*)(new Ipp8u[ctxSize]);
        ippsECCPInit(256, pCtx);
        ippsECCPSetStd(IppECCPStd256r1, pCtx);
        return pCtx;
} static IppsECCPPointState* newECP_256_Point(void) {
        int ctxSize;
        ippsECCPPointGetSize(256, &ctxSize);
        IppsECCPPointState* pPoint = (IppsECCPPointState*)(new Ipp8u[ctxSize]);
        ippsECCPPointInit(256, pPoint);
        return pPoint;
} static IppsBigNumState* newBN(int len, const Ipp32u* pData) {
        int ctxSize;
        ippsBigNumGetSize(len, &ctxSize);
        IppsBigNumState* pBN = (IppsBigNumState*)(new Ipp8u[ctxSize]);
        ippsBigNumInit(len, pBN);
        if (pData)       ippsSet_BN(IppsBigNumPOS, len, pData, pBN);
        return pBN;
} IppsPRNGState* newPRNG(void) {
        int ctxSize;
        ippsPRNGGetSize(&ctxSize);
        IppsPRNGState* pCtx = (IppsPRNGState*)(new Ipp8u[ctxSize]);
        ippsPRNGInit(160, pCtx);
        return pCtx;

} int main(void) {
        // define standard 256-bit EC
        IppsECCPState* pECP = newStd_256_ECP();
        // extract or use any other way to get order(ECP)
        const Ipp32u secp256r1_r[] = { 0xFC632551, 0xF3B9CAC2, 0xA7179E84, 0xBCE6FAAD, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF };
        const int ordSize = sizeof(secp256r1_r) / sizeof(Ipp32u);
        IppsBigNumState* pECPorder = newBN(ordSize, secp256r1_r);
        // define a message to be signed; let it be random, for example
        IppsPRNGState* pRandGen = newPRNG();    // 'external' PRNG
        Ipp32u tmpData[ordSize];
        ippsPRNGen(tmpData, 256, pRandGen);

        IppsBigNumState* pRandMsg = newBN(ordSize, tmpData);    // random 256-bit message
        IppsBigNumState* pMsg = newBN(ordSize, 0);                              // msg to be signed
        ippsMod_BN(pRandMsg, pECPorder, pMsg);

        // declare Signer's regular and ephemeral key pair
        IppsBigNumState* regPrivate = newBN(ordSize, 0);
        IppsBigNumState* ephPrivate = newBN(ordSize, 0);
        // define Signer's ephemeral key pair
        IppsECCPPointState* regPublic = newECP_256_Point();
        IppsECCPPointState* ephPublic = newECP_256_Point();

        // generate regular & ephemeral key pairs, should be different each other
        ippsECCPGenKeyPair(regPrivate, regPublic, pECP, ippsPRNGen, pRandGen);
        ippsECCPGenKeyPair(ephPrivate, ephPublic, pECP, ippsPRNGen, pRandGen);

        //
        // signature
        //

        // set ephemeral key pair
        ippsECCPSetKeyPair(ephPrivate, ephPublic, ippFalse, pECP);
        // compure signature
        IppsBigNumState* signX = newBN(ordSize, 0);
        IppsBigNumState* signY = newBN(ordSize, 0);
        ippsECCPSignDSA(pMsg, regPrivate, signX, signY, pECP);

        //
        // verification
        //

        ippsECCPSetKeyPair(NULL, regPublic, ippTrue, pECP);
        IppECResult eccResult;
        ippsECCPVerifyDSA(pMsg, signX, signY, &eccResult, pECP);
        if (ippECValid == eccResult)
                cout << "signature verificatioin passed" << endl;
        else
                cout << "signature verificatioin failed" << endl;

        delete[](Ipp8u*)signX;
        delete[](Ipp8u*)signY;
        delete[](Ipp8u*)ephPublic;
        delete[](Ipp8u*)regPublic;
        delete[](Ipp8u*)ephPrivate;
        delete[](Ipp8u*)regPrivate;
        delete[](Ipp8u*)pRandMsg;
        delete[](Ipp8u*)pMsg;
        delete[](Ipp8u*)pRandGen;
        delete[](Ipp8u*)pECPorder;
        delete[](Ipp8u*)pECP;
        return 0;
}

Výsledek po spuštění programu: signature verificatioin passed

Chci docílit: Vytisknout (uložit si do souboru privátní a veřejný klíč) a zašifrovat textový soubor.

 
Odpovědět
29.10.2020 9:20
Avatar
Caster
Člen
Avatar
Odpovídá na Caster
Caster:3.11.2020 20:59

Aby to nezůstalo bez odezvy. Zjistil jsem, že použít eliptické šifrování na soubor je nesmysl, použivá se jen na šifrování relativně malých dat např. 256 bitů. V rámci knihovny IPP lze ale na šifrování souboru použít TDES nebo AES. Oboje je ale určeno na šifrování dat v bufferu, není problém do něj načíst celý soubor.

 
Nahoru Odpovědět
3.11.2020 20:59
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.