여기에서 시작하기 전에 서버와 클라이언트가 있습니다. 서버의 Diffie-Hellman 공용 정적 키와 공용 임시 키가 들어있는 암호화 된 문자열을 클라이언트에 보내려고합니다. 그렇게하기 위해 서버의 개인 RSA 키를 사용하여 암호화 된 문자열을 보내고 클라이언트는 서버의 공개 RSA 키를 사용하여 암호를 해독합니다.InvertableRSAFunction이 Diffie-Hellman 키를 const 바이트로 암호화하지 못함 *
이제는 서버가 공개/개인 키 쌍이있는 유일한 서버이기 때문에이 방법을 사용해야하는 이유가 있습니다. Diffie-Hellman에 대한 MITM 공격의 한 쪽을 여전히 하나의 키 쌍으로 암호화하므로 괜찮습니다. 제 요구 사항에 대해서는 괜찮습니다.
정적 및 임시 키를 16 진수로 인코딩 된 문자열로 변환하여 소켓을 통해 보내면 개인 키 암호화 단계에서 문제가 발생합니다.
내 서버하고있다 : SendMsg()
암호화 프로세스를 포함
DH2 dhA(dh);
SecByteBlock sprivA(dhA.StaticPrivateKeyLength()), spubA(
dhA.StaticPublicKeyLength());
SecByteBlock eprivA(dhA.EphemeralPrivateKeyLength()), epubA(
dhA.EphemeralPublicKeyLength());
dhA.GenerateStaticKeyPair(rnd, sprivA, spubA);
dhA.GenerateEphemeralKeyPair(rnd, eprivA, epubA);
string sendBuf, recvBuf;
string saEncoded, eaEncoded, encoding;
cout << "spubA: " << (char*) spubA.data() << endl << "epubA: "
<< (char*) epubA.data() << endl;
SecByteBlock nil;
nil.CleanNew(HMAC<SHA256>::DEFAULT_KEYLENGTH);
HMAC<SHA256> hmac;
hmac.SetKey(nil.data(), nil.size());
HashFilter filter(hmac, new HexEncoder(new StringSink(encoding)));
filter.Put(spubA.data(), spubA.size());
filter.MessageEnd();
saEncoded = encoding;
encoding = "";
filter.Put(epubA.data(), epubA.size());
filter.MessageEnd();
eaEncoded = encoding;
encoding = "";
// StringSource saSource(spubA, sizeof(spubA), true,
// new HexEncoder(new StringSink(saEncoded)));
//
// StringSource eaSource(epubA, sizeof(epubA), true,
// new HexEncoder(new StringSink(eaEncoded)));
//
sendBuf = saEncoded + " " + eaEncoded;
cout << "Send Buffer: " << sendBuf << endl;
SendMsg(sendBuf, tdata);
.
이는이 시점에서 실패
void SendMsg(string sendBuf, struct ThreadData * tdata)
{
AutoSeededRandomPool rng;
Integer m, c, r;
stringstream ss;
try
{
// Encode the message as an Integer
m = Integer((const byte *) sendBuf.c_str(), sendBuf.size());
//Encrypt
c = tdata->privateKey.CalculateInverse(rng, m); //HERE!
오류 메시지 :
InvertibleRSAFunction: computational error during private key operation
현재 디피 - 헬만 secition에서 주석되지 않은 코드 HERE로부터 얻었다. 주석 처리 된 코드의 문제점은 클라이언트가 16 진수로 인코딩 된 문자열을 수신하면 데이터가 손실되어 공유 암호에 동의 할 수 없다는 것입니다. 그러나 소켓을 통과합니다.
이의 예를 표시 할 수 있습니다 :
// Get spubA and epubA from server
recovered = recoverMsg(serverKey, sockServer);
//Calculate shared secret.
string sa, ea;
ss.str(recovered);
ss >> sa >> ea;
ss.str("");
ss.clear();
cout << "SA: " << sa << endl << "EA: " << ea << endl;
string decodedSA, decodedEA;
StringSource decodeSA(sa, true,
new HexDecoder(new StringSink(decodedSA)));
StringSource decodeEA(ea, true,
new HexDecoder(new StringSink(decodedEA)));
cout << "Decoded SA: " << decodedSA << endl;
cout << "Decoded EA: " << decodedEA << endl;
SecByteBlock spubA((const byte*) decodedSA.data(), decodedSA.size());
if (spubA.size() < dhB.StaticPublicKeyLength()) spubA.CleanGrow(
dhB.StaticPublicKeyLength());
else spubA.resize(dhB.StaticPublicKeyLength());
SecByteBlock epubA((const byte*) decodedEA.data(), decodedEA.size());
if (epubA.size() < dhB.EphemeralPublicKeyLength()) epubA.CleanGrow(
dhB.EphemeralPublicKeyLength());
else epubA.resize(dhB.EphemeralPublicKeyLength());
하지만 여전히 같은 결과를 얻을 :
이 인스턴스와 관련하여Server:
spubA: &a�|՜D2�tu�cJ����B�R�8�*i�x?N���p��Q�����K��+O �"��P:k�d|3�����6Z
epubA: 4v������M�E�`l�K��[dN�|Q^r�-ż�����A~D�>4$�9���"v�*:Y��s�O���J��ow�M�߬�C�9n�;���Z�D�6lp�V��oowZ��WSv��",��A3��XL��8��
Send Buffer: 2661DC7CD59C4432AF747584634AF69BE60298429C52C738 3476CBCCFAA3B0A14DBE45E3606CC84B171DAC1CCE5B644E
Client:
Recovered: 2661DC7CD59C4432AF747584634AF69BE60298429C52C738 3476CBCCFAA3B0A14DBE45E3606CC84B171DAC1CCE5B644E
SA: 2661DC7CD59C4432AF747584634AF69BE60298429C52C738
EA: 3476CBCCFAA3B0A14DBE45E3606CC84B171DAC1CCE5B644E
Decoded SA: &a�|՜D2�tu�cJ����B�R�8
Decoded EA: 4v������M�E�`l�K��[dN
, 나는 다음을 수행하기 위해 클라이언트 측에서 시도 .
아무도 내가 이것을 서버의 개인 키로 어떻게 암호화하고 소켓을 통해 올바르게 보낼 수 있는지 알고 있습니까?
정말로 문제를 격리해야합니다. 로컬 파일에서 작업하는 것이 좋습니다. 그런 다음 소켓을 통해 고정 버퍼로 이동하십시오 (''A ''문자열과 같이). 그 후 무작위 데이터 (' '\ 0' '을 포함하는 데이터와 같은)를 가진 고정 된 크기의 버퍼로 이동하십시오. 마지막으로 실제 서명이있는 실제 파일로 이동하십시오. 고정 버퍼에 문제가 발생하면 소켓 보내기/받기 질문을하십시오. – jww