pRSA = ^RSA;
  RSA = record
    pad: integer;
    version: integer;
    meth: pRSA_METHOD;
    n: pBIGNUM;
    e: pBIGNUM;
    d: pBIGNUM;
    p: pBIGNUM;
    q: pBIGNUM;
    dmp1: pBIGNUM;
    dmq1: pBIGNUM;
    iqmp: pBIGNUM;
    ex_data: CRYPTO_EX_DATA;
    references: integer;
    flags: integer;
    _method_mod_n: pBN_MONT_CTX;
    _method_mod_p: pBN_MONT_CTX;
    _method_mod_q: pBN_MONT_CTX;
    bignum_data: ^byte;
    blinding: ^BN_BLINDING;
    end;
#5楼 得分:0回复于:2011-10-10 14:19:05Delphi(Pascal) code    pRSA = ^RSA; RSA = record pad: integer; version: integer; meth: pRSA_METHOD; n: pBIGNUM; e: pBIGNUM; d: pBIGNUM; p: pBIGNUM; q: pBIGNUM; dmp1: pBIGNUM; dmq1: pBIGNUM; iqmp: pBIGNUM; ex_data: CRYPTO_EX_DATA; references: integer; flags: integer; _method_mod_n: pBN_MONT_CTX; _method_mod_p: pBN_MONT_CTX; _method_mod_q: pBN_MONT_CTX; bignum_data: ^byte; blinding: ^BN_BLINDING; end;
Delphi(Pascal) codefunction RSA_new: pRSA; cdecl;external 'libeay32.dll'; 
procedure RSA_free(r: pRSA); cdecl;external 'libeay32.dll'; 
function RSA_new_method(method: pRSA_METHOD): pRSA; cdecl;external 'libeay32.dll'; 
function RSA_size(pkey: pRSA): integer; cdecl;external 'libeay32.dll'; 
function RSA_generate_key(bits: integer; exp: Cardinal; progress: TProgressCallbackFunction; cb_arg: pointer):pRSA; cdecl;external 'libeay32.dll'; 
function RSA_check_key(arg0: pRSA): integer; cdecl;external 'libeay32.dll'; 
function RSA_public_encrypt(flen: integer; from: PCharacter; _to: PCharacter; rsa: pRSA; padding: integer): integer; cdecl;external 'libeay32.dll'; 
function RSA_private_encrypt(flen: integer; from: PCharacter; _to: PCharacter; rsa: pRSA; padding: integer): integer; cdecl;external 'libeay32.dll'; 
function RSA_public_decrypt(flen: integer; from: PCharacter; _to: PCharacter; rsa: pRSA; padding: integer): integer; cdecl;external 'libeay32.dll'; 
function RSA_private_decrypt(flen: integer; from: PCharacter; _to: PCharacter; rsa: pRSA; padding: integer): integer; cdecl;external 'libeay32.dll';procedure Tfrmbc_bs_tcpnet.FormShow(Sender: TObject);
var
  ss,skkbhN:string;
  NN1,NN2,NN,EE,srandom:string;
  Checkcode:string;  s1,s2:Pointer;
  command:string;
  ssrandom,sCrsa:PCharacter;
  prsaData:pRSA;
  rn,ilen:Integer;
begin
  //ss:=Cutblank_wanjun(showstr(data));
  skkbhN:='9876543210123626';
  DM1.DataModule1.Tado_SK_JKGLSJ.Close;
  DM1.DataModule1.Tado_SK_JKGLSJ.SQL.Clear;
  DM1.DataModule1.Tado_SK_JKGLSJ.SQL.Text:='select * from SK_JKGLSJ where SKKBH ='''+skkbhN+'''';
  DM1.DataModule1.Tado_SK_JKGLSJ.Open;
  if DM1.DataModule1.Tado_SK_JKGLSJ.RecordCount>0 then
  begin
    NN1:=DM1.DataModule1.Tado_SK_JKGLSJ.FieldByName('NN1').AsString;
    NN2:=DM1.DataModule1.Tado_SK_JKGLSJ.FieldByName('NN2').AsString;
    NN:=NN1+NN2;
    EE:=DM1.DataModule1.Tado_SK_JKGLSJ.FieldByName('EE').AsString;
  end;
  ssrandom:='1234567890123456';  s1:=Pointer(hextostring(NN));
  s2:=Pointer(hextostring(EE));
  prsaData:=RSA_new;
  prsaData.n:=BN_new();
  prsaData.e:=BN_new();
  prsaData.n:= BN_bin2bn(s1,128,prsaData.n);
  prsaData.e:= BN_bin2bn(s2,4,prsaData.e);  sCrsa:='';
  ilen:=length(ssrandom);
  rn:=RSA_public_encrypt(ilen,Pointer(ssrandom),Pointer(sCrsa),prsaData,RSA_PKCS1_PADDING);
  if rn=-1 then
  begin
    command:=hextostring('0505');
  end
  else begin
    Checkcode:=checksum(sCrsa,128);
    command:=hextostring(sCrsa+Checkcode);
  end;
  showmessage(command);
  BN_clear_free(prsaData.n);
  BN_clear_free(prsaData.e);
  RSA_free(prsaData);
end;
运行到rn:=RSA_public_encrypt(ilen,Pointer(ssrandom),Pointer(sCrsa),prsaData,RSA_PKCS1_PADDING);这里会提示错误:access violation at address 630a5adf in module 'libeay32.dll'.Read of address 00000004.