首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用公钥和LockBox3加密

使用公钥和LockBox3加密
EN

Stack Overflow用户
提问于 2019-03-15 15:37:49
回答 2查看 792关注 0票数 2

我使用Delphi XE和Lockbox3.5,我想加密一个具有支付网关提供的公钥的字符串,该公钥需要操作,公钥如下:-BEGIN公钥-职员此处-结束公钥-我无法使RSA编解码器读取此公钥,我的代码如下:

代码语言:javascript
复制
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和cipher is (RSA公钥加密系统*),链接模式为空,但此代码失败并出现内存不足错误。谢谢你的任何提示..

demo中的以下代码也不起作用,可以提供一个使用RSA和公钥加密字符串的示例吗?

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

发布于 2019-03-15 16:56:39

问题可能出在您创建的ms变量-- TFileStream --的免费版本中:

代码语言:javascript
复制
var
 Ciphertext: string;
 ms: TStream;
begin
 ms := TFileStream.Create('C:\PubKey.txt', fmOpenRead);
 try
   ms.Seek(0, soFromBeginning);
   cdcRSA.StreamCipherId := RSA_ProgId;
   cdcRSA.ChainModeId := RSA_ProgId;
   Signatory1.LoadKeysFromStream(ms, [partPublic]);
 finally
   ms.Free;
 end;
 cdcRSA.EncryptAnsiString('WORDSOMEWORDSOME', Ciphertext);
 Memo1.Lines.Add(Ciphertext);
end;
票数 0
EN

Stack Overflow用户

发布于 2019-03-29 03:22:42

密钥文件是包含一系列行的文本文件。文件中的每一行不得超过72 8位字节,行终止符除外。

您的硬编码字符串只有一行,长度为358加上BEGIN /END行

我们看不到C:\PubKey.txt.的内容文件看起来一样吗?

在末尾添加<CR><LF>

代码语言:javascript
复制
sKey := '-----BEGIN PUBLIC KEY-----'#13#10 +
         'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlAVd8PUhIiuA00vlUZYm0xrk+'#13#10 +
         'UgyZxwWZSrysOJWk0POGJ91hUUqr659mBA7bg0i07Y4T+FYdA4iuvg5bT2aSMAGl'#13#10 +
         'To3GRKvwX8RAnimQQNqkqDk3nf20OiEygwWDQr72fWzKLtuoo7Rd5onrXEp1qM3o'#13#10 +
         'ywRq5Mwk4dHPX1F5EwIDAQAB'#13#10 +
         '-----END PUBLIC KEY-----';

另请阅读有关不同之处。

Differences between BEGIN RSA PUBLIC KEY and BEGIN PUBLIC KEY

有了台词

代码语言:javascript
复制
ss := TStringStream.Create(sKey);  ss.Seek(0,soFromBeginning);
 Base64_to_stream(skey, ss);

您可以使用包含的BEGIN ....END ....行执行Base64_to_stream(skey, ss)

它应该是

代码语言:javascript
复制
-----BEGIN PUBLIC KEY-----
BASE64 ENCODED DATA
-----END PUBLIC KEY-----

代码语言:javascript
复制
sKeyBEG := '-----BEGIN PUBLIC KEY-----'#13#10;

sKey := 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlAVd8PUhIiuA00vlUZYm0xrk+' +
        'UgyZxwWZSrysOJWk0POGJ91hUUqr659mBA7bg0i07Y4T+FYdA4iuvg5bT2aSMAGl' +
        'To3GRKvwX8RAnimQQNqkqDk3nf20OiEygwWDQr72fWzKLtuoo7Rd5onrXEp1qM3o' +
        'ywRq5Mwk4dHPX1F5EwIDAQAB';

sKeyEND := #13#10'-----END PUBLIC KEY-----';

本质上,

文件只是DER编码数据的base64编码版本。为了从外部区分DER编码的字符串内部是什么类型的数据,在数据周围提供了一个页眉和页脚。

如果您想加载包含页眉和页脚的密钥文本文件,则需要找到一种方法将密钥与key.txt文件分开。这并不难。

无论如何,Base64_to_stream(skey, ss)只能应用于键,而不能应用于周围的文本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55177719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档