【发布时间】:2019-08-06 05:52:55
【问题描述】:
我使用 Delphi XE 和 Lockbox3.5,我想加密一个字符串,该字符串具有由支付网关提供的需要操作的公钥,公钥类似于: -----开始公钥----- 这里的工作人员 -----结束公钥----- 我无法使 RSA 编解码器读取此公钥,我的代码如下:
var
Ciphertext: string;
ms: TStream;
begin
ms := TFileStream.Create('C:\PubKey.txt', fmOpenRead);
ms.Seek(0, soFromBeginning);
cdcRSA.StreamCipherId := RSA_ProgId;
cdcRSA.ChainModeId := RSA_ProgId;
Signatory1.LoadKeysFromStream(ms, [partPublic]);
cdcRSA.EncryptAnsiString('WORDSOMEWORDSOME', Ciphertext);
Memo1.Lines.Add(Ciphertext);
end;
Codec cdcRA 链接到 CryptoLibrary,密码为(RSA 公钥加密系统 *),链接模式为空,但此代码失败并出现内存不足错误。 感谢您的任何提示..
演示中的以下代码也不起作用,有人可以提供一个使用 RSA 和公钥加密字符串的示例吗? :
procedure TForm1.btnRSAClick(Sender: TObject);
var
sKey, Ciphertext: string;
ss: TStringStream;
Key: TSymetricKey;
begin
sKey := '-----BEGIN PUBLIC KEY-----' +
'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlAVd8PUhIiuA00vlUZYm0xrk+' +
'UgyZxwWZSrysOJWk0POGJ91hUUqr659mBA7bg0i07Y4T+FYdA4iuvg5bT2aSMAGl' +
'To3GRKvwX8RAnimQQNqkqDk3nf20OiEygwWDQr72fWzKLtuoo7Rd5onrXEp1qM3o' +
'ywRq5Mwk4dHPX1F5EwIDAQAB' +
'-----END PUBLIC KEY-----';
ss := TStringStream.Create(sKey); ss.Seek(0,soFromBeginning);
Base64_to_stream(skey, ss);
cdcRSA.Reset;
cdcRSA.StreamCipherId := 'native.RSA';
cdcRSA.ChainModeId:= 'native.CBC';
cdcRSA.AsymetricKeySizeInBits := 1024;
key := cdcRSA.Asymetric_Engine.CreateFromStream(ss, [partPublic]); // error out of memory
cdcRSA.InitFromKey(key);
cdcRSA.EncryptString('WORDSOMEWORDSOME', Ciphertext, TEncoding.UTF8);
Memo1.Lines.Add(Ciphertext);
end;
【问题讨论】:
-
这个函数多久调用一次?我问的原因是它创建了一个 TFileStream 但没有释放它,导致内存泄漏。
-
第一次调用函数时发生错误,我添加了释放相同错误的流,它在调用签名组件的函数 LoadKeysFromStream 时引发..