Crypto++ ElGamal-Verschlüsselung



  • Hi,

    ich versuche gerade mit der Crypto++-Library Daten mit ElGamal zu ver/entschlüsseln. Wenn ich jedoch eine von Crypto++ verschlüsselte Nachricht entschlüsseln will, ist das Result leider nur eine Folge von Nullen. Leider ist Crypto++ scheinbar nur sehr schlecht dokumentiert, eine Dokumentation zu ElGamal habe ich garnicht gefunden.
    Kann mir hier irgendwer helfen?

    // RFC 5114 1024-bit Keys: http://tools.ietf.org/html/rfc5114
    
    CryptoPP::Integer p("0xB10B8F96A080E01DDE92DE5EAE5D54EC52C99FBCFB06A3C6"
    		    "9A6A9DCA52D23B616073E28675A23D189838EF1E2EE652C0"
    		    "13ECB4AEA906112324975C3CD49B83BFACCBDD7D90C4BD70"
    		    "98488E9C219A73724EFFD6FAE5644738FAA31A4FF55BCCC0"
    		    "A151AF5F0DC8B4BD45BF37DF365C1A65E68CFDA76D4DA708"
    		    "DF1FB2BC2E4A4371");
    
    CryptoPP::Integer g("0xA4D1CBD5C3FD34126765A442EFB99905F8104DD258AC507F"
    		    "D6406CFF14266D31266FEA1E5C41564B777E690F5504F213"
    		    "160217B4B01B886A5E91547F9E2749F4D7FBD7D3B9A92EE1"
    		    "909D0D2263F80A76A6A24C087A091F531DBF0A0169B6A28A"
    		    "D662A4D18E73AFA32D779D5918D08BC8858F4DCEF97C2A24"
    		    "855E6EEB22B3B2E5");
    
    CryptoPP::Integer q("0xF518AA8781A8DF278ABA4E7D64B7CB9D49462353");
    
    CryptoPP::AutoSeededRandomPool rnd;
    CryptoPP::Integer x(rnd, 1, q); // private key
    
    CryptoPP::Integer y = CryptoPP::ModularExponentiation(g, x, p);
    
    CryptoPP::ElGamalKeys::PublicKey pubkey;
    pubkey.Initialize(p, q, g, y);
    CryptoPP::ElGamalKeys::PrivateKey privkey;
    privkey.Initialize(p, q, g, x);
    
    std::uint8_t plain[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
    CryptoPP::ElGamalEncryptor encryptor(pubkey);
    std::vector<std::uint8_t> encrypted(500);
    encryptor.Encrypt(rnd, plain, sizeof(plain), &encrypted[0]);
    
    std::vector<std::uint8_t> decrypted(encrypted.size());
    CryptoPP::ElGamalDecryptor decryptor(privkey);
    decryptor.Decrypt(rnd, &encrypted[0], encrypted.size(), &decrypted[0]);
    
    for(std::uint8_t c : decrypted)
    	std::cout << (char) c;
    

Log in to reply