Hi folks!.
need help here and don’t say “just google” because i have already done that. I need your help through this code, how it can be corrected to produce correct “Agreed shared secret key” which is supposed to be "1ed885b1064ae5e041cef89365eb7a63b87a6e3e59f6b3ec74c117b74c4e89a4"
The code:
#include <iostream>
using std::cout;
using std::cerr;
using std::endl;
#include <string>
using std::string;
#include <stdexcept>
using std::runtime_error;
#include <cstdlib>
using std::exit;
#include "cryptopp/osrng.h"
using CryptoPP::AutoSeededRandomPool;
using CryptoPP::AutoSeededX917RNG;
#include "cryptopp/aes.h"
using CryptoPP::AES;
#include "cryptopp/eccrypto.h"
using CryptoPP::ECP;
using CryptoPP::ECDH;
#include "cryptopp/secblock.h"
using CryptoPP::SecByteBlock;
#include "cryptopp/oids.h"
using CryptoPP::OID;
// ASN1 is a namespace, not an object
#include "cryptopp/asn.h"
using namespace CryptoPP::ASN1;
#include "cryptopp/integer.h"
using CryptoPP::Integer;
#include <cryptopp/hex.h>
int main( int, char** ) {
OID CURVE = secp256r1();
ECDH < ECP >::Domain dhA( CURVE ), dhB( CURVE );
string privatekeyA = "e8586d5fa27ffb6a37817c171c94189ad20d8fcf29fa58ba0e6cbe4cf2bb1079";
string publickeyB = "4f0609f35a0be01caa1287862680b803ea50fb66af2ad65e990aa4a8944c6191ac0d13d98612e12ba1d9afa86f997aab2827a0cee43bf963e8e995eb95df2fb33";
SecByteBlock privA(dhA.PrivateKeyLength());
SecByteBlock pubB(dhB.PublicKeyLength());
string Prkey, Pukey;
unsigned char privateky[32];
unsigned char publicky[64];
CryptoPP::StringSource ssk(privatekeyA, true ,
new CryptoPP::HexDecoder(
new CryptoPP::StringSink(Prkey)
)
);
CryptoPP::StringSource ssv(publickeyB, true ,
new CryptoPP::HexDecoder(
new CryptoPP::StringSink(Pukey)
)
);
for(int i=0;i<32;i++) {
if (Prkey[i]<0) privateky[i]=Prkey[i]+256;
else privateky[i]=Prkey[i];
}
for(int i=0;i<64;i++) {
if (Pukey[i]<0) publicky[i]=Pukey[i]+256;
else publicky[i]=Pukey[i];
}
privA.Assign(privateky, sizeof(privateky));
pubB.Assign(publicky, sizeof(publicky));
SecByteBlock sharedA(dhA.AgreedValueLength());
dhA.Agree(sharedA, privA, pubB);
Integer a;
a.Decode(sharedA.BytePtr(), sharedA.SizeInBytes());
cout << "Agreed to shared secret: " << std::hex << a << endl;
return 0;
}
The output of this code is wrong. Am just playing around to understand the concept so any help even in comments will be highly appreciated.