Delphi处理RSA加解密简单分享
久已不在工作中用Delphi了。
这几天帮朋友调试小问题时,需在Delphi中处理RSA加解密相关。我本想偷懒找个现成的可直接无脑使用的库(C++、C#、Go等都是资料代码一堆),但似乎可用或有用的资料信息太少,于是我打算以其它语言编译成DLL丢给Delphi使用,但想想还是心有不甘,刚好看到了CnPack出品的CnCrypto,于是花几个小时尝试研究了下。CnCrypto的实现很赞,纯Pascal编写,应是可直接跨平台使用,不过美中不足的是它没有提供可直接调用的RSA加解密接口。
所以我觉得,或许可以把自己对CnCrypto的简单封装分享出来,以供需要的朋友参考、改进。
代码如下。
unit CnRSAUtils; {$DEFINE RSADECRYPT} interface uses System.SysUtils; function RSAEncrypt(const Buf: TBytes): TBytes; overload; function RSAEncrypt(const S: string): string; overload; {$IFDEF RSADECRYPT} function RSADecrypt(const Buf: TBytes): TBytes; overload; function RSADecrypt(const S: string): string; overload; {$ENDIF} implementation uses System.Classes, System.NetEncoding, CnRSA; const cPubKeyStr = '-----BEGIN PUBLIC KEY-----'#13#10 + 'XXXXX'#13#10 + '-----END PUBLIC KEY-----'; {$IFDEF RSADECRYPT} cPriKeyStr = '-----BEGIN PRIVATE KEY-----'#13#10 + 'XXXXX'#13#10 + '-----END PRIVATE KEY-----'; {$ENDIF} var PublicKey : TCnRSAPublicKey; {$IFDEF RSADECRYPT} PrivateKey: TCnRSAPrivateKey; {$ENDIF} function RSAEncrypt(const Buf: TBytes): TBytes; begin if Length(Buf) = 0 then Exit(nil); Result := CnRSAEncryptBytes(Buf, PublicKey); end; function RSAEncrypt(const S: string): string; var Src: TBytes; Dst: TBytes; begin if S = '' then Exit(''); Src := TEncoding.UTF8.GetBytes(S); Dst := CnRSAEncryptBytes(Src, PublicKey); Result := TNetEncoding.Base64.EncodeBytesToString(Dst).Replace(#$D#$A, ''); end; {$IFDEF RSADECRYPT} function RSADecrypt(const Buf: TBytes): TBytes; begin if Length(Buf) = 0 then Exit(nil); Result := CnRSADecryptBytes(Buf, PrivateKey); end; {$ENDIF} {$IFDEF RSADECRYPT} function RSADecrypt(const S: string): string; var Src: TBytes; Dst: TBytes; begin if S = '' then Exit(''); Src := TNetEncoding.Base64.DecodeStringToBytes(S); Dst := CnRSADecryptBytes(Src, PrivateKey); Result := TEncoding.UTF8.GetString(Dst); end; {$ENDIF} procedure InitRSA; var Strm: TMemoryStream; Src : TBytes; begin Strm := TMemoryStream.Create; try Src := TEncoding.UTF8.GetBytes(cPubKeyStr); Strm.Write(Src, Length(Src)); Strm.Position := 0; if not CnRSALoadPublicKeyFromPem(Strm, PublicKey) then raise Exception.Create('Invalid RSA public key!'); {$IFDEF RSADECRYPT} Strm.Clear; Src := TEncoding.UTF8.GetBytes(cPriKeyStr); Strm.Write(Src, Length(Src)); Strm.Position := 0; if not CnRSALoadKeysFromPem(Strm, PrivateKey, nil) then raise Exception.Create('Invalid RSA private key!'); {$ENDIF} finally Strm.Free; end; end; initialization begin PublicKey := TCnRSAPublicKey.Create; {$IFDEF RSADECRYPT} PrivateKey := TCnRSAPrivateKey.Create(True); {$ENDIF} InitRSA; end; finalization begin PublicKey.Free; {$IFDEF RSADECRYPT} PrivateKey.Free; {$ENDIF} end; end.
浙公网安备 33010602011771号