PDA

View Full Version : رمزگشایی از داده دریافتی از سرور با کلید عمومی در اپلیکیشن ویندوزی



saeidd
چهارشنبه 23 آبان 1403, 22:32 عصر
سلام.
من در برنامه ام، یه درخواست به سرور می فرستم و داده ای رو از سرور دریافت می کنم. این داده با استفاده از کتابخانه openssl با الگوریتم رمزنگاری RSA با کلید خصوصی رمزنگاری شده (با دستور openssl_private_encrypt در php) و من باید با کلید عمومی که در اختیار دارم، اون رو رمزگشایی کنم.

از طرف دیگه میدونم که در الگوریتم RSA، از کلید عمومی فقط برای رمزنگاری استفاده میشه و این کلید خصوصیه که هم میشه برای رمزنگاری ازش استفاده کرد و هم رمزگشایی.
همه ی کامپوننتهایی هم که برای استفاده از openssl در دلفی هست، فقط با کلید خصوصی رمزگشایی می کنن و نه با کلید عمومی.

اما جالبه که در php دستوری وجود داره که با کلید عمومی هم رمزگشایی می کنه (openssl_public_decrypt) میخوام ببینم معادل این دستور در دلفی چی میشه و چطوری باید با استفاده از کتابخانه openssl، یک داده رو با کلید عمومی رمزگشایی کرد؟

دلفــي
پنج شنبه 08 آذر 1403, 09:30 صبح
سلام.
من در برنامه ام، یه درخواست به سرور می فرستم و داده ای رو از سرور دریافت می کنم. این داده با استفاده از کتابخانه openssl با الگوریتم رمزنگاری RSA با کلید خصوصی رمزنگاری شده (با دستور openssl_private_encrypt در php) و من باید با کلید عمومی که در اختیار دارم، اون رو رمزگشایی کنم.

از طرف دیگه میدونم که در الگوریتم RSA، از کلید عمومی فقط برای رمزنگاری استفاده میشه و این کلید خصوصیه که هم میشه برای رمزنگاری ازش استفاده کرد و هم رمزگشایی.
همه ی کامپوننتهایی هم که برای استفاده از openssl در دلفی هست، فقط با کلید خصوصی رمزگشایی می کنن و نه با کلید عمومی.

اما جالبه که در php دستوری وجود داره که با کلید عمومی هم رمزگشایی می کنه (openssl_public_decrypt) میخوام ببینم معادل این دستور در دلفی چی میشه و چطوری باید با استفاده از کتابخانه openssl، یک داده رو با کلید عمومی رمزگشایی کرد؟


uses
System.SysUtils,
System.Classes,
IdGlobal,
IdHashSHA,
IdCryptographic,
IdSSLOpenSSL;


function DecryptSignature(const PublicKey: string; const EncryptedSignature: string; const OriginalData: string): Boolean;
var
RSA: TRSA;
Hash: TIdHashSHA256;
DecryptedHash: string;
OriginalHash: string;
begin
Result := False;
RSA := TRSA.Create;
Hash := TIdHashSHA256.Create;
try
// Load the public key
RSA.LoadFromString(PublicKey);

// Decrypt the signature
DecryptedHash := RSA.DecryptString(EncryptedSignature);

// Compute the hash of the original data
OriginalHash := Hash.HashString(OriginalData);

// Compare the decrypted hash with the original hash
Result := DecryptedHash = OriginalHash;
finally
RSA.Free;
Hash.Free;
end;
end;