PDA

View Full Version : سوال: شیوه ی استفاده از رمزنگاری RSA -- RSA Signing



K.Mohammadreza
چهارشنبه 21 فروردین 1398, 19:16 عصر
باسلام
من برای استفاده از یک برنامه تحت شبکه باید پیامهای بین سرور و برنامه را Encrypt کنم. در واقع یک وب سرویس Soap هست که هر تابع شامل 2 پارامتر می باشد. پارامتر Request و پارامتر Signature

پارامتر Request شامل اطلاعات مورد نیاز تابع در قالب یک رشته JSON و
پارامتر Signature شامل امضا دیجیتال رشته ی Request با کلید خصوصی RSA

من کلید خصوصی را در قالب فایل XML , PEM دارم در ابتدا باید رشته ی JSON درخواست با الگوریتم SHA-1 به صورت هَش در بیاد و هَش بدست آمده توسط کلید خصوصی امضا (Encrypt) و در نهایت نتبجه بصورت Base64 در پارامتر Signature ارسال شود.

چگونه در دلفی قسمت دوم را پیاده سازی کنم؟ نسخه دلفی مورد استفاده Delphi XE8 می باشد.

باسپاس

K.Mohammadreza
جمعه 23 فروردین 1398, 11:12 صبح
آیا rsa crypto service provider در دلفی وجود داره؟

hp1361
شنبه 24 فروردین 1398, 11:48 صبح
آیا rsa crypto service provider در دلفی وجود داره؟

سلام

از این کامپوننت TMS Cryptography Pack (https://www.tmssoftware.com/site/tmscrypto.asp) و یا این کامپوننت IP*Works! Encrypt (https://www.nsoftware.com/ipworks/encrypt/#prod-overview) میتونید برای Encrypt کردن استفاده کنید

هردوشون الگوریتم RSA رو پشتیبانی میکنند

موفق باشیم

K.Mohammadreza
سه شنبه 27 فروردین 1398, 22:45 عصر
باسلام مجدد من کد های زیر را برای تولید RSA Sign استفاده کردم


const
LIBEAY_DLL_NAME = 'libeay32.dll';


// These aren't defined in the original libeay32.pas file
procedure EVP_MD_CTX_init(ctx: PEVP_MD_CTX); cdecl; external LIBEAY_DLL_NAME;
function EVP_MD_CTX_cleanup(ctx: PEVP_MD_CTX): integer; cdecl; external LIBEAY_DLL_NAME;


procedure InitSSL;
begin
OpenSSL_add_all_algorithms;
OpenSSL_add_all_ciphers;
OpenSSL_add_all_digests;
ERR_load_crypto_strings;
// Seed the pseudo-random number generator
// This should be something a little more "random"!
RAND_load_file('c:\windows\paint.exe', 512);
end;


procedure FinalizeSSL;
begin
EVP_cleanup;
end;


function GetSSLErrorMessage: string;
const
BUFF_SIZE = 128; // OpenSSL docs state should be >= 120 bytes
var
err: TBytes;
begin
SetLength(err, BUFF_SIZE);
ERR_error_string(ERR_get_error, @err[0]);
result := string(err);
end;


function RSALoadPrivateKey(const AFileName, APassPhrase: string): PRSA;
var
bp: pBIO;
fn, pp: PAnsiChar;
pk: PRSA;
begin
fn := PAnsiChar(AnsiString(AFileName));
pp := PAnsiChar(AnsiString(APassPhrase));
bp := BIO_new(BIO_s_file());
BIO_read_filename(bp, fn);
pk := nil;
result := PEM_read_bio_RSAPrivateKey(bp, pk, nil, pp);
if result = nil then
raise Exception.Create('Private key failure.' + GetSSLErrorMessage);
end;


function LoadPrivateKey(const AFileName, APass: string): PEVP_PKEY;
var
rkey: PRSA;
begin
rkey := RSALoadPrivateKey(AFileName, APass);
result := EVP_PKEY_new;
EVP_PKEY_assign(result, EVP_PKEY_RSA, rkey);
end;


procedure CleanUpKey(AKey: PEVP_PKEY);
begin
if (AKey <> nil) then
begin
EVP_PKEY_free(AKey);
end;
end;


function EVPSign(ASource: TBytes; const APrivateKey: PEVP_PKEY): TBytes;
var
keysize: integer;
ks: cardinal;
ctx: EVP_MD_CTX;
begin
keysize := EVP_PKEY_size(APrivateKey);
SetLength(result, keysize);


EVP_MD_CTX_init(@ctx);
try
EVP_SignInit(@ctx, EVP_sha1);
EVP_SignUpdate(@ctx, @ASource[0], Length(ASource));
EVP_SignFinal(@ctx, @result[0], ks, APrivateKey);
SetLength(result, ks);
finally
EVP_MD_CTX_cleanup(@ctx);
end;
end;


function Base64EncodeBytes(Input: TBytes): UTF8String;
begin
result := utf8string(
TNetEncoding.Base64.EncodeBytesToString(Input, Length(Input)));
end;


function SignStringToBase64(AText: utf8string): string;
var
key: PEVP_PKEY;
src, enc: TBytes;
begin
//AText:= UTF8String(AText);
InitSSL;
try
key := LoadPrivateKey('d:\wsus\pvkey.pem', '');
try
SetLength(src, Length(AText));
CopyMemory(@src[0], @AText, Length(AText));
enc := EVPSign(src, key);
result := string(Base64EncodeBytes(enc));
finally
CleanUpKey(key);
end;
finally
FinalizeSSL;
end;
end;


الان اتفاقی که میفته اینست که امضا تولید شده با امضا ایجاد شده توسط یک برنامه php مثل هم نیست و تفاوت دارد فرضا اگه رشته ورودی برای هر دو برنامه Delphi, PHP به صورت زیر باشد:


{"UserName":"Service","DepositNumber":"999999","Timestamp":"2019\/04\/16 22:07:41:105"}


و PrivateKey هم به صورت زیر باشد


-----BEGIN RSA PRIVATE KEY-----MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQ CUHbx9tht5pHWSnGoexgb+S+2sNvQeeqSdDmkopgAkBhW9NGE2 q76JAN/uLfxnoDlnv6EfR78hCaEtYE66QykpsJsRimPF1wxkh4tMAi2EY w2Um8WhkGc9cPMMatWn0E4XK3x68CYkEifPigLdgV48hzRk6AT sQ77Ux90k0FEBLWvwHrvY42QaL8s6AP+oZadUbGsFX3y9bVqc7 4W7vFsmdqbfxvEdZmGBS7JC9BcbsZ6+i16PRmjb5/qExIHSKO65ZG7SZy+DEiVDcgz8UelDF3BRMmik/lP646fB+WySyBejJkNVXx6YH09EuQ04vaTnM2s7IlP0vc6/7R7AgMBAAECggEAIlrXWo0/yDI2NyBimOqzuo4f/Z7tdphZ0DgEejIuvCxRJIaet99npPIJPenWiextdfSezyPWwyJ Gaqm4SXXUGLbvgM1RMU4A27i+YJ0UtMR8cMaXMA5kx+OyGlcC6 DzpEfl0Zj9Q9VkKXhixT4ZaQXZJhKkbuBy2t3qNEAxSsnYPAQz Y5lqTIkz04ZP3ru1fOyfoRO1W6kSoBb3NvIjtUwm9cIdGggoMR QqmUEQAg/u3jFr0A0HAQW0TPL2SqR3wNxnajJ41yJmAmKWgenVsTnyCWsVk TgkSoJnj1XAi6Jv4WcmRqS6cllnrK1GLfJyLOOWBAanKJi1FeE fk3ewOoQKBgQDImPYrwIEBjUGuCITWa2LPYre8lYgMtLUOw0Sn 5jS8X2ipnbpMl9LtQwhTqyHjQTYUi0C7xCeWy+/GyAIzzAQviwfQvalFTWOofuipA0d3CdQjX9XQLU6XrIXoNl/R09/z7LG85r4br6DdaVKpWTdDyFjC9qkv8AAWW4mQeR4HEQKBgQC9B iKqJeOU2mRxTChlqtn2rQE4RoKYSqmjIlKiVbQJg84D3fNkkDf bDpKWJ4JUCRo73/UygYIL24gJe+iS4/9Ee4LUdpiHqYtUUm9n26QVUCkm6ODQckX6BVZ+GyVwfcYQsi7P qKQSNRfoOExg4VkcmiIO+ynhilfQ/C3Uh7J6ywKBgQCaHzQcf4Ze29oXzcHKQK2la1KCGV1zbbAizJL GcZAZHzD6CQ6nZIsR8kvGhRi/U04q0KcG3PoR2VS7pNZUV67rnGV/0wjoD0K/peo6WSOiaTHNkAdmMDlPPaWQuZ47SA+siTIyUhLEkNcG5rI1HS/h61+PRBbPlxVqGCCEmRoiEQKBgFVwi4SrIaZr3NDVYsEpq+HzK 0T7ohYiUXE6l21nHbzbRei7j0OaaJTsjleuvhssDh6YSaWtolG nxmK7DlIvGngi9+z/Oky/1wmjRVYFkrJLjH5Y7x1pObYcaY8QyCiDwV5UnBIjIR5Vv1uo7u Uvlu71wIVTBAg9VxpQkoqpV4RnAoGAcDJqcU+NNeAfwjPIlpgl zxoUUvQAA/moQB3xmS0XP6U74X5Hri70DGZ96Mjj8d1oJSTG3NKRfmaO/ZF+ggKcDpYFKpOSxrJPMbxgQu381OW4ctm1oCUdFVfYE6hORA7 5eYrYaKTu4itjjp+7hucJ8cR0zEQ9XGxIUkpl+AEcxgc=-----END RSA PRIVATE KEY-----


متن sign برای php بصورت


M7dN2sCn2NG3TWPA0kk8LiQTfhaZljpSfctuCpUoKTAcWzEwOt weOKsHRqeKjUoBaU1QpMMWx+Peq0iogv01ASBSDqe8r7EciShX 3K36dJa8n5Y7x+C7jK10nk2Uw5HUYILnZCr0lRjyL8ciI+e4o9 YD0rD2tF+VpeIxzi0PBMmdRxy1fKjSK/9bMx1b8j/j2Axmln7Ix3PJ0RyGDGxz/fs8Ydz4/X8qsBBAr0H9YkVf5ptPMB3aYRJQIFWz6Yc4PSpU/tlNGVJUuQOvby/1KqfHmJz1UMjCFSt80GRtkWsDes/2nQ8FmFUhEgdACUL70yMsSdv4DoO14UYPqjEkyg==


و برای دلفی


EDYxEkFWnct1hrnUNL/Jfcf5Hp2DORS6h6AkUemrle8WEbdMtezrE+V8Uq1HSbL7Gk2QP qhn2mJz
YQ4T2DhqlJx2TlDUT6ZhxJXKjr1E7wBorSLI4KsHdfSBPLJrmE jXYkpNPImE5zy7vsZte7Vt95pl
GwEERvySC1FoE8YvmV7S3RkceGAuJ495ctCg+ul6lbi/JolKPInX76tlsnQoUs8g6Va4SJ0l6vmM
o7Ti8j+5un4v9eUJkNVbH85yK0pLZJCToP9/TP8q6T0t2k5wbX6YWw3tsRYlhiCXvY1gSTpuQDte
m3zstF0wG/FLeA5vdibXYUeFGi0hZpqWXAQG4Q==


میشود. چگونه مشکل را حل کنم. اصلا نمیدونم مشکل کجاست.
لطفا دوستانیکه اطلاع دارند راهنمایی بفرمایند

K.Mohammadreza
جمعه 30 فروردین 1398, 16:25 عصر
خدا را شکر بدون استفاده از کامپوننت های جانبی و با دستورات خود دلفی موفق شدم به نتیجه دلخواه برسم. از دوستانیکه جواب دادن تشکر میکنم ولی خیلی ساده تر از اون چیزی بود که فکر میکردم

BORHAN TEC
جمعه 20 اردیبهشت 1398, 16:49 عصر
با سلام.
همچنین پکیج LockBox3 هم از RSA پشتیبانی میکند که به طور رایگان هم هست. این محصول قبلاً توسط TurboPower توسعه داده میشد ولی اکنون به صورت رایگان و کدباز در اختیار همه میباشد:
https://github.com/TurboPack/LockBox3
موفق باشید ...

دلفــي
چهارشنبه 08 آبان 1398, 15:03 عصر
سلام
من هم دقیقا همین مشکل رو دارم
لطفا راه حلی که پیدا کردید رو بگید منم استفاده کنم
ممنون

دلفــي
شنبه 16 آذر 1398, 18:45 عصر
خدا را شکر بدون استفاده از کامپوننت های جانبی و با دستورات خود دلفی موفق شدم به نتیجه دلخواه برسم. از دوستانیکه جواب دادن تشکر میکنم ولی خیلی ساده تر از اون چیزی بود که فکر میکردم

از دوستان کسی نمیدونه ایشون از چه روشی استفاده کردن ؟